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