299ed0b3dd95e65c12e57183f3860cdae9d7c55d
[openwrt/svn-archive/archive.git] / target / linux / brcm2708 / patches-3.10 / 0139-V4L2-Add-support-for-inline-H264-headers.patch
1 From f4206d9063a2b73cf7ca7aa497c1f7e3def1859b Mon Sep 17 00:00:00 2001
2 From: Dave Stevenson <dsteve@broadcom.com>
3 Date: Mon, 9 Dec 2013 11:03:54 +0000
4 Subject: [PATCH 139/196] V4L2: Add support for inline H264 headers
5
6 Add support for V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER
7 to control H264 inline headers.
8 Requires firmware fix to work correctly, otherwise format
9 has to be set to H264 before this parameter is set.
10
11 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
12 ---
13 drivers/media/platform/bcm2835/bcm2835-camera.h | 2 +-
14 drivers/media/platform/bcm2835/controls.c | 115 ++++++++++++++++++-----
15 drivers/media/platform/bcm2835/mmal-parameters.h | 11 ++-
16 3 files changed, 103 insertions(+), 25 deletions(-)
17
18 diff --git a/drivers/media/platform/bcm2835/bcm2835-camera.h b/drivers/media/platform/bcm2835/bcm2835-camera.h
19 index 0f29b1a..25aa91f 100644
20 --- a/drivers/media/platform/bcm2835/bcm2835-camera.h
21 +++ b/drivers/media/platform/bcm2835/bcm2835-camera.h
22 @@ -15,7 +15,7 @@
23 * core driver device
24 */
25
26 -#define V4L2_CTRL_COUNT 20 /* number of v4l controls */
27 +#define V4L2_CTRL_COUNT 21 /* number of v4l controls */
28
29 enum {
30 MMAL_COMPONENT_CAMERA = 0,
31 diff --git a/drivers/media/platform/bcm2835/controls.c b/drivers/media/platform/bcm2835/controls.c
32 index e965ca3..cb062a9 100644
33 --- a/drivers/media/platform/bcm2835/controls.c
34 +++ b/drivers/media/platform/bcm2835/controls.c
35 @@ -96,6 +96,7 @@ struct bm2835_mmal_v4l2_ctrl {
36 const s64 *imenu; /* integer menu array */
37 u32 mmal_id; /* mmal parameter id */
38 bm2835_mmal_v4l2_ctrl_cb *setter;
39 + bool ignore_errors;
40 };
41
42 struct v4l2_to_mmal_effects_setting {
43 @@ -606,12 +607,29 @@ static int ctrl_set_image_encode_output(struct bm2835_mmal_dev *dev,
44 &u32_value, sizeof(u32_value));
45 }
46
47 +static int ctrl_set_video_encode_param_output(struct bm2835_mmal_dev *dev,
48 + struct v4l2_ctrl *ctrl,
49 + const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
50 +{
51 + u32 u32_value;
52 + struct vchiq_mmal_port *vid_enc_ctl;
53 +
54 + vid_enc_ctl = &dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->output[0];
55 +
56 + u32_value = ctrl->val;
57 +
58 + return vchiq_mmal_port_parameter_set(dev->instance, vid_enc_ctl,
59 + mmal_ctrl->mmal_id,
60 + &u32_value, sizeof(u32_value));
61 +}
62 +
63 static int bm2835_mmal_s_ctrl(struct v4l2_ctrl *ctrl)
64 {
65 struct bm2835_mmal_dev *dev =
66 container_of(ctrl->handler, struct bm2835_mmal_dev,
67 ctrl_handler);
68 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl = ctrl->priv;
69 + int ret;
70
71 if ((mmal_ctrl == NULL) ||
72 (mmal_ctrl->id != ctrl->id) ||
73 @@ -620,7 +638,10 @@ static int bm2835_mmal_s_ctrl(struct v4l2_ctrl *ctrl)
74 return -EINVAL;
75 }
76
77 - return mmal_ctrl->setter(dev, ctrl, mmal_ctrl);
78 + ret = mmal_ctrl->setter(dev, ctrl, mmal_ctrl);
79 + if (mmal_ctrl->ignore_errors)
80 + ret = 0;
81 + return ret;
82 }
83
84 static const struct v4l2_ctrl_ops bm2835_mmal_ctrl_ops = {
85 @@ -633,32 +654,44 @@ static const struct bm2835_mmal_v4l2_ctrl v4l2_ctrls[V4L2_CTRL_COUNT] = {
86 {
87 V4L2_CID_SATURATION, MMAL_CONTROL_TYPE_STD,
88 -100, 100, 0, 1, NULL,
89 - MMAL_PARAMETER_SATURATION, &ctrl_set_rational
90 + MMAL_PARAMETER_SATURATION,
91 + &ctrl_set_rational,
92 + false
93 },
94 {
95 V4L2_CID_SHARPNESS, MMAL_CONTROL_TYPE_STD,
96 -100, 100, 0, 1, NULL,
97 - MMAL_PARAMETER_SHARPNESS, &ctrl_set_rational
98 + MMAL_PARAMETER_SHARPNESS,
99 + &ctrl_set_rational,
100 + false
101 },
102 {
103 V4L2_CID_CONTRAST, MMAL_CONTROL_TYPE_STD,
104 -100, 100, 0, 1, NULL,
105 - MMAL_PARAMETER_CONTRAST, &ctrl_set_rational
106 + MMAL_PARAMETER_CONTRAST,
107 + &ctrl_set_rational,
108 + false
109 },
110 {
111 V4L2_CID_BRIGHTNESS, MMAL_CONTROL_TYPE_STD,
112 0, 100, 50, 1, NULL,
113 - MMAL_PARAMETER_BRIGHTNESS, &ctrl_set_rational
114 + MMAL_PARAMETER_BRIGHTNESS,
115 + &ctrl_set_rational,
116 + false
117 },
118 {
119 V4L2_CID_ISO_SENSITIVITY, MMAL_CONTROL_TYPE_INT_MENU,
120 0, ARRAY_SIZE(iso_qmenu) - 1, 0, 1, iso_qmenu,
121 - MMAL_PARAMETER_ISO, &ctrl_set_value_menu
122 + MMAL_PARAMETER_ISO,
123 + &ctrl_set_value_menu,
124 + false
125 },
126 {
127 V4L2_CID_IMAGE_STABILIZATION, MMAL_CONTROL_TYPE_STD,
128 0, 1, 0, 1, NULL,
129 - MMAL_PARAMETER_VIDEO_STABILISATION, &ctrl_set_value
130 + MMAL_PARAMETER_VIDEO_STABILISATION,
131 + &ctrl_set_value,
132 + false
133 },
134 /* {
135 0, MMAL_CONTROL_TYPE_CLUSTER, 3, 1, 0, NULL, 0, NULL
136 @@ -666,7 +699,9 @@ static const struct bm2835_mmal_v4l2_ctrl v4l2_ctrls[V4L2_CTRL_COUNT] = {
137 */ {
138 V4L2_CID_EXPOSURE_AUTO, MMAL_CONTROL_TYPE_STD_MENU,
139 ~0x03, 3, V4L2_EXPOSURE_AUTO, 0, NULL,
140 - MMAL_PARAMETER_EXPOSURE_MODE, &ctrl_set_exposure
141 + MMAL_PARAMETER_EXPOSURE_MODE,
142 + &ctrl_set_exposure,
143 + false
144 },
145 /* todo this needs mixing in with set exposure
146 {
147 @@ -677,86 +712,120 @@ static const struct bm2835_mmal_v4l2_ctrl v4l2_ctrls[V4L2_CTRL_COUNT] = {
148 V4L2_CID_EXPOSURE_ABSOLUTE, MMAL_CONTROL_TYPE_STD,
149 /* Units of 100usecs */
150 1, 1*1000*10, 100*10, 1, NULL,
151 - MMAL_PARAMETER_SHUTTER_SPEED, &ctrl_set_exposure
152 + MMAL_PARAMETER_SHUTTER_SPEED,
153 + &ctrl_set_exposure,
154 + false
155 },
156 {
157 V4L2_CID_AUTO_EXPOSURE_BIAS, MMAL_CONTROL_TYPE_INT_MENU,
158 0, ARRAY_SIZE(ev_bias_qmenu) - 1,
159 (ARRAY_SIZE(ev_bias_qmenu)+1)/2 - 1, 0, ev_bias_qmenu,
160 - MMAL_PARAMETER_EXPOSURE_COMP, &ctrl_set_value_ev
161 + MMAL_PARAMETER_EXPOSURE_COMP,
162 + &ctrl_set_value_ev,
163 + false
164 },
165 {
166 V4L2_CID_EXPOSURE_METERING,
167 MMAL_CONTROL_TYPE_STD_MENU,
168 ~0x7, 2, V4L2_EXPOSURE_METERING_AVERAGE, 0, NULL,
169 - MMAL_PARAMETER_EXP_METERING_MODE, &ctrl_set_metering_mode
170 + MMAL_PARAMETER_EXP_METERING_MODE,
171 + &ctrl_set_metering_mode,
172 + false
173 },
174 {
175 V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE,
176 MMAL_CONTROL_TYPE_STD_MENU,
177 ~0x3fe, 9, V4L2_WHITE_BALANCE_AUTO, 0, NULL,
178 - MMAL_PARAMETER_AWB_MODE, &ctrl_set_awb_mode
179 + MMAL_PARAMETER_AWB_MODE,
180 + &ctrl_set_awb_mode,
181 + false
182 },
183 {
184 V4L2_CID_COLORFX, MMAL_CONTROL_TYPE_STD_MENU,
185 0, 15, V4L2_COLORFX_NONE, 0, NULL,
186 - MMAL_PARAMETER_IMAGE_EFFECT, &ctrl_set_image_effect
187 + MMAL_PARAMETER_IMAGE_EFFECT,
188 + &ctrl_set_image_effect,
189 + false
190 },
191 {
192 V4L2_CID_COLORFX_CBCR, MMAL_CONTROL_TYPE_STD,
193 0, 0xffff, 0x8080, 1, NULL,
194 - MMAL_PARAMETER_COLOUR_EFFECT, &ctrl_set_colfx
195 + MMAL_PARAMETER_COLOUR_EFFECT,
196 + &ctrl_set_colfx,
197 + false
198 },
199 {
200 V4L2_CID_ROTATE, MMAL_CONTROL_TYPE_STD,
201 0, 360, 0, 90, NULL,
202 - MMAL_PARAMETER_ROTATION, &ctrl_set_rotate
203 + MMAL_PARAMETER_ROTATION,
204 + &ctrl_set_rotate,
205 + false
206 },
207 {
208 V4L2_CID_HFLIP, MMAL_CONTROL_TYPE_STD,
209 0, 1, 0, 1, NULL,
210 - MMAL_PARAMETER_MIRROR, &ctrl_set_flip
211 + MMAL_PARAMETER_MIRROR,
212 + &ctrl_set_flip,
213 + false
214 },
215 {
216 V4L2_CID_VFLIP, MMAL_CONTROL_TYPE_STD,
217 0, 1, 0, 1, NULL,
218 - MMAL_PARAMETER_MIRROR, &ctrl_set_flip
219 + MMAL_PARAMETER_MIRROR,
220 + &ctrl_set_flip,
221 + false
222 },
223 {
224 V4L2_CID_MPEG_VIDEO_BITRATE_MODE, MMAL_CONTROL_TYPE_STD_MENU,
225 0, ARRAY_SIZE(bitrate_mode_qmenu) - 1,
226 0, 0, bitrate_mode_qmenu,
227 - MMAL_PARAMETER_RATECONTROL, &ctrl_set_bitrate_mode
228 + MMAL_PARAMETER_RATECONTROL,
229 + &ctrl_set_bitrate_mode,
230 + false
231 },
232 {
233 V4L2_CID_MPEG_VIDEO_BITRATE, MMAL_CONTROL_TYPE_STD,
234 25*1000, 25*1000*1000, 10*1000*1000, 25*1000, NULL,
235 - MMAL_PARAMETER_VIDEO_BIT_RATE, &ctrl_set_bitrate
236 + MMAL_PARAMETER_VIDEO_BIT_RATE,
237 + &ctrl_set_bitrate,
238 + false
239 },
240 {
241 V4L2_CID_JPEG_COMPRESSION_QUALITY, MMAL_CONTROL_TYPE_STD,
242 1, 100,
243 30, 1, NULL,
244 - MMAL_PARAMETER_JPEG_Q_FACTOR, &ctrl_set_image_encode_output
245 + MMAL_PARAMETER_JPEG_Q_FACTOR,
246 + &ctrl_set_image_encode_output,
247 + false
248 },
249 {
250 V4L2_CID_POWER_LINE_FREQUENCY, MMAL_CONTROL_TYPE_STD_MENU,
251 0, ARRAY_SIZE(mains_freq_qmenu) - 1,
252 1, 1, NULL,
253 - MMAL_PARAMETER_FLICKER_AVOID, &ctrl_set_flicker_avoidance
254 + MMAL_PARAMETER_FLICKER_AVOID,
255 + &ctrl_set_flicker_avoidance,
256 + false
257 + },
258 + {
259 + V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER, MMAL_CONTROL_TYPE_STD,
260 + 0, 1,
261 + 0, 1, NULL,
262 + MMAL_PARAMETER_VIDEO_ENCODE_INLINE_HEADER,
263 + &ctrl_set_video_encode_param_output,
264 + true /* Errors ignored as requires latest firmware to work */
265 },
266 };
267
268 int bm2835_mmal_set_all_camera_controls(struct bm2835_mmal_dev *dev)
269 {
270 int c;
271 - int ret;
272 + int ret = 0;
273
274 for (c = 0; c < V4L2_CTRL_COUNT; c++) {
275 if ((dev->ctrls[c]) && (v4l2_ctrls[c].setter)) {
276 ret = v4l2_ctrls[c].setter(dev, dev->ctrls[c],
277 &v4l2_ctrls[c]);
278 - if (ret)
279 + if (!v4l2_ctrls[c]. ignore_errors && ret)
280 break;
281 }
282 }
283 diff --git a/drivers/media/platform/bcm2835/mmal-parameters.h b/drivers/media/platform/bcm2835/mmal-parameters.h
284 index 0f2bd50..b08a4b0 100644
285 --- a/drivers/media/platform/bcm2835/mmal-parameters.h
286 +++ b/drivers/media/platform/bcm2835/mmal-parameters.h
287 @@ -421,7 +421,16 @@ enum mmal_parameter_video_type {
288 MMAL_PARAMETER_VIDEO_DRM_PROTECT_BUFFER,
289
290 /** @ref MMAL_PARAMETER_BYTES_T */
291 - MMAL_PARAMETER_VIDEO_DECODE_CONFIG_VD3
292 + MMAL_PARAMETER_VIDEO_DECODE_CONFIG_VD3,
293 +
294 + /**< @ref MMAL_PARAMETER_BOOLEAN_T */
295 + MMAL_PARAMETER_VIDEO_ENCODE_H264_VCL_HRD_PARAMETERS,
296 +
297 + /**< @ref MMAL_PARAMETER_BOOLEAN_T */
298 + MMAL_PARAMETER_VIDEO_ENCODE_H264_LOW_DELAY_HRD_FLAG,
299 +
300 + /**< @ref MMAL_PARAMETER_BOOLEAN_T */
301 + MMAL_PARAMETER_VIDEO_ENCODE_INLINE_HEADER
302 };
303
304 /** Valid mirror modes */
305 --
306 1.9.1
307