brcm2708: update against latest rpi-3.10.y branch
[openwrt.git] / target / linux / brcm2708 / patches-3.10 / 0169-V4L2-H264-profile-level-ctrls-FPS-control-and-auto-e.patch
1 From 6b3c057ec5705d3c7556d4755103a2650d3aaaf5 Mon Sep 17 00:00:00 2001
2 From: Dave Stevenson <dsteve@broadcom.com>
3 Date: Wed, 12 Feb 2014 11:18:20 +0000
4 Subject: [PATCH 169/174] V4L2: H264 profile & level ctrls, FPS control and
5  auto exp pri
6
7 Several control handling updates.
8 H264 profile and level controls.
9 Timeperframe/FPS reworked to add V4L2_CID_EXPOSURE_AUTO_PRIORITY to
10 select whether AE is allowed to override the framerate specified.
11
12 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
13 ---
14  drivers/media/platform/bcm2835/bcm2835-camera.c  | 107 ++++++-----
15  drivers/media/platform/bcm2835/bcm2835-camera.h  |  12 +-
16  drivers/media/platform/bcm2835/controls.c        | 225 ++++++++++++++++++++++-
17  drivers/media/platform/bcm2835/mmal-parameters.h |  87 +++++++++
18  4 files changed, 383 insertions(+), 48 deletions(-)
19
20 --- a/drivers/media/platform/bcm2835/bcm2835-camera.c
21 +++ b/drivers/media/platform/bcm2835/bcm2835-camera.c
22 @@ -36,7 +36,8 @@
23  
24  #define BM2835_MMAL_VERSION "0.0.2"
25  #define BM2835_MMAL_MODULE_NAME "bcm2835-v4l2"
26 -
27 +#define MIN_WIDTH 16
28 +#define MIN_HEIGHT 16
29  #define MAX_WIDTH 2592
30  #define MAX_HEIGHT 1944
31  #define MIN_BUFFER_SIZE (80*1024)
32 @@ -56,7 +57,7 @@ MODULE_PARM_DESC(bcm2835_v4l2_debug, "De
33  static struct bm2835_mmal_dev *gdev;   /* global device data */
34  
35  #define FPS_MIN 1
36 -#define FPS_MAX 30
37 +#define FPS_MAX 90
38  
39  /* timeperframe: min/max and default */
40  static const struct v4l2_fract
41 @@ -903,10 +904,8 @@ static int mmal_setup_components(struct
42         camera_port->es.video.crop.y = 0;
43         camera_port->es.video.crop.width = f->fmt.pix.width;
44         camera_port->es.video.crop.height = f->fmt.pix.height;
45 -       camera_port->es.video.frame_rate.num =
46 -                       dev->capture.timeperframe.denominator;
47 -       camera_port->es.video.frame_rate.den =
48 -                       dev->capture.timeperframe.numerator;
49 +       camera_port->es.video.frame_rate.num = 0;
50 +       camera_port->es.video.frame_rate.den = 1;
51  
52         ret = vchiq_mmal_port_set_format(dev->instance, camera_port);
53  
54 @@ -940,8 +939,10 @@ static int mmal_setup_components(struct
55                 preview_port->es.video.crop.y = 0;
56                 preview_port->es.video.crop.width = f->fmt.pix.width;
57                 preview_port->es.video.crop.height = f->fmt.pix.height;
58 -               preview_port->es.video.frame_rate.num = 30;
59 -               preview_port->es.video.frame_rate.den = 1;
60 +               preview_port->es.video.frame_rate.num =
61 +                                         dev->capture.timeperframe.denominator;
62 +               preview_port->es.video.frame_rate.den =
63 +                                         dev->capture.timeperframe.numerator;
64                 ret = vchiq_mmal_port_set_format(dev->instance, preview_port);
65                 if (overlay_enabled) {
66                         ret = vchiq_mmal_port_connect_tunnel(
67 @@ -1116,22 +1117,56 @@ static int vidioc_s_fmt_vid_cap(struct f
68         }
69  
70         ret = mmal_setup_components(dev, f);
71 -       if (ret != 0)
72 +       if (ret != 0) {
73                 v4l2_err(&dev->v4l2_dev,
74                          "%s: failed to setup mmal components: %d\n",
75                          __func__, ret);
76 +               ret = -EINVAL;
77 +       }
78  
79         return ret;
80  }
81  
82 +int vidioc_enum_framesizes(struct file *file, void *fh,
83 +                          struct v4l2_frmsizeenum *fsize)
84 +{
85 +       static const struct v4l2_frmsize_stepwise sizes = {
86 +               MIN_WIDTH, MAX_WIDTH, 2,
87 +               MIN_HEIGHT, MAX_HEIGHT, 2
88 +       };
89 +       int i;
90 +
91 +       if (fsize->index)
92 +               return -EINVAL;
93 +       for (i = 0; i < ARRAY_SIZE(formats); i++)
94 +               if (formats[i].fourcc == fsize->pixel_format)
95 +                       break;
96 +       if (i == ARRAY_SIZE(formats))
97 +               return -EINVAL;
98 +       fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE;
99 +       fsize->stepwise = sizes;
100 +       return 0;
101 +}
102 +
103  /* timeperframe is arbitrary and continous */
104  static int vidioc_enum_frameintervals(struct file *file, void *priv,
105                                              struct v4l2_frmivalenum *fival)
106  {
107 +       int i;
108 +
109         if (fival->index)
110                 return -EINVAL;
111  
112 -       /* regarding width & height - we support any */
113 +       for (i = 0; i < ARRAY_SIZE(formats); i++)
114 +               if (formats[i].fourcc == fival->pixel_format)
115 +                       break;
116 +       if (i == ARRAY_SIZE(formats))
117 +               return -EINVAL;
118 +
119 +       /* regarding width & height - we support any within range */
120 +       if (fival->width < MIN_WIDTH || fival->width > MAX_WIDTH ||
121 +           fival->height < MIN_HEIGHT || fival->height > MAX_HEIGHT)
122 +               return -EINVAL;
123  
124         fival->type = V4L2_FRMIVAL_TYPE_CONTINUOUS;
125  
126 @@ -1167,7 +1202,6 @@ static int vidioc_s_parm(struct file *fi
127         struct bm2835_mmal_dev *dev = video_drvdata(file);
128         struct v4l2_fract tpf;
129         struct mmal_parameter_rational fps_param;
130 -       int ret;
131  
132         if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
133                 return -EINVAL;
134 @@ -1183,27 +1217,11 @@ static int vidioc_s_parm(struct file *fi
135         parm->parm.capture.timeperframe = tpf;
136         parm->parm.capture.readbuffers  = 1;
137  
138 -       fps_param.num = dev->capture.timeperframe.denominator;
139 -       fps_param.den = dev->capture.timeperframe.numerator;
140 -       ret = vchiq_mmal_port_parameter_set(dev->instance,
141 -                                     &dev->component[MMAL_COMPONENT_CAMERA]->
142 -                                       output[MMAL_CAMERA_PORT_PREVIEW],
143 -                                     MMAL_PARAMETER_VIDEO_FRAME_RATE,
144 -                                     &fps_param, sizeof(fps_param));
145 -       ret += vchiq_mmal_port_parameter_set(dev->instance,
146 -                                     &dev->component[MMAL_COMPONENT_CAMERA]->
147 -                                       output[MMAL_CAMERA_PORT_VIDEO],
148 -                                     MMAL_PARAMETER_VIDEO_FRAME_RATE,
149 -                                     &fps_param, sizeof(fps_param));
150 -       ret += vchiq_mmal_port_parameter_set(dev->instance,
151 -                                     &dev->component[MMAL_COMPONENT_CAMERA]->
152 -                                       output[MMAL_CAMERA_PORT_CAPTURE],
153 -                                     MMAL_PARAMETER_VIDEO_FRAME_RATE,
154 -                                     &fps_param, sizeof(fps_param));
155 -       if (ret)
156 -               v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev,
157 -                "Failed to set fps ret %d\n",
158 -                ret);
159 +       fps_param.num = 0;      /* Select variable fps, and then use
160 +                                * FPS_RANGE to select the actual limits.
161 +                                */
162 +       fps_param.den = 1;
163 +       set_framerate_params(dev);
164  
165         return 0;
166  }
167 @@ -1236,6 +1254,7 @@ static const struct v4l2_ioctl_ops camer
168         .vidioc_querybuf = vb2_ioctl_querybuf,
169         .vidioc_qbuf = vb2_ioctl_qbuf,
170         .vidioc_dqbuf = vb2_ioctl_dqbuf,
171 +       .vidioc_enum_framesizes = vidioc_enum_framesizes,
172         .vidioc_enum_frameintervals = vidioc_enum_frameintervals,
173         .vidioc_g_parm        = vidioc_g_parm,
174         .vidioc_s_parm        = vidioc_s_parm,
175 @@ -1331,10 +1350,8 @@ static int __init mmal_init(struct bm283
176         format->es->video.crop.y = 0;
177         format->es->video.crop.width = 1024;
178         format->es->video.crop.height = 768;
179 -       format->es->video.frame_rate.num =
180 -                       dev->capture.timeperframe.denominator;
181 -       format->es->video.frame_rate.den =
182 -                       dev->capture.timeperframe.numerator;
183 +       format->es->video.frame_rate.num = 0; /* Rely on fps_range */
184 +       format->es->video.frame_rate.den = 1;
185  
186         format =
187             &dev->component[MMAL_COMPONENT_CAMERA]->
188 @@ -1349,10 +1366,8 @@ static int __init mmal_init(struct bm283
189         format->es->video.crop.y = 0;
190         format->es->video.crop.width = 1024;
191         format->es->video.crop.height = 768;
192 -       format->es->video.frame_rate.num =
193 -                       dev->capture.timeperframe.denominator;
194 -       format->es->video.frame_rate.den =
195 -                       dev->capture.timeperframe.numerator;
196 +       format->es->video.frame_rate.num = 0; /* Rely on fps_range */
197 +       format->es->video.frame_rate.den = 1;
198  
199         format =
200             &dev->component[MMAL_COMPONENT_CAMERA]->
201 @@ -1366,7 +1381,7 @@ static int __init mmal_init(struct bm283
202         format->es->video.crop.y = 0;
203         format->es->video.crop.width = 2592;
204         format->es->video.crop.height = 1944;
205 -       format->es->video.frame_rate.num = 30;
206 +       format->es->video.frame_rate.num = 0; /* Rely on fps_range */
207         format->es->video.frame_rate.den = 1;
208  
209         dev->capture.width = format->es->video.width;
210 @@ -1374,6 +1389,8 @@ static int __init mmal_init(struct bm283
211         dev->capture.fmt = &formats[0];
212         dev->capture.encode_component = NULL;
213         dev->capture.timeperframe = tpf_default;
214 +       dev->capture.enc_profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH;
215 +       dev->capture.enc_level = V4L2_MPEG_VIDEO_H264_LEVEL_4_0;
216  
217         /* get the preview component ready */
218         ret = vchiq_mmal_component_init(
219 @@ -1420,6 +1437,14 @@ static int __init mmal_init(struct bm283
220         }
221  
222         {
223 +               struct vchiq_mmal_port *encoder_port =
224 +                       &dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->output[0];
225 +               encoder_port->format.encoding = MMAL_ENCODING_H264;
226 +               ret = vchiq_mmal_port_set_format(dev->instance,
227 +                       encoder_port);
228 +       }
229 +
230 +       {
231                 unsigned int enable = 1;
232                 vchiq_mmal_port_parameter_set(
233                         dev->instance,
234 --- a/drivers/media/platform/bcm2835/bcm2835-camera.h
235 +++ b/drivers/media/platform/bcm2835/bcm2835-camera.h
236 @@ -15,7 +15,7 @@
237   * core driver device
238   */
239  
240 -#define V4L2_CTRL_COUNT 21 /* number of v4l controls */
241 +#define V4L2_CTRL_COUNT 24 /* number of v4l controls */
242  
243  enum {
244         MMAL_COMPONENT_CAMERA = 0,
245 @@ -49,7 +49,9 @@ struct bm2835_mmal_dev {
246         int                       hflip;
247         int                       vflip;
248         enum mmal_parameter_exposuremode exposure_mode;
249 +       enum v4l2_exposure_auto_type exposure_mode_v4l2;
250         unsigned int              manual_shutter_speed;
251 +       bool                      exp_auto_priority;
252  
253         /* allocated mmal instance and components */
254         struct vchiq_mmal_instance   *instance;
255 @@ -63,12 +65,16 @@ struct bm2835_mmal_dev {
256                 unsigned int     height;  /* height */
257                 unsigned int     stride;  /* stride */
258                 struct mmal_fmt  *fmt;
259 -               struct v4l2_fract          timeperframe;
260 +               struct v4l2_fract timeperframe;
261  
262                 /* H264 encode bitrate */
263                 int         encode_bitrate;
264                 /* H264 bitrate mode. CBR/VBR */
265                 int         encode_bitrate_mode;
266 +               /* H264 profile */
267 +               enum v4l2_mpeg_video_h264_profile enc_profile;
268 +               /* H264 level */
269 +               enum v4l2_mpeg_video_h264_level enc_level;
270                 /* JPEG Q-factor */
271                 int         q_factor;
272  
273 @@ -98,7 +104,7 @@ int bm2835_mmal_init_controls(
274                         struct v4l2_ctrl_handler *hdl);
275  
276  int bm2835_mmal_set_all_camera_controls(struct bm2835_mmal_dev *dev);
277 -
278 +int set_framerate_params(struct bm2835_mmal_dev *dev);
279  
280  /* Debug helpers */
281  
282 --- a/drivers/media/platform/bcm2835/controls.c
283 +++ b/drivers/media/platform/bcm2835/controls.c
284 @@ -69,7 +69,6 @@ static const s64 bitrate_mode_qmenu[] =
285         (s64)V4L2_MPEG_VIDEO_BITRATE_MODE_CBR,
286  };
287  
288 -
289  enum bm2835_mmal_ctrl_type {
290         MMAL_CONTROL_TYPE_STD,
291         MMAL_CONTROL_TYPE_STD_MENU,
292 @@ -329,6 +328,9 @@ static int ctrl_set_exposure(struct bm28
293  
294                 }
295                 dev->exposure_mode = exp_mode;
296 +               dev->exposure_mode_v4l2 = ctrl->val;
297 +       } else if (mmal_ctrl->id == V4L2_CID_EXPOSURE_AUTO_PRIORITY) {
298 +               dev->exp_auto_priority = ctrl->val;
299         }
300  
301         if (dev->exposure_mode == MMAL_PARAM_EXPOSUREMODE_OFF)
302 @@ -340,6 +342,8 @@ static int ctrl_set_exposure(struct bm28
303         ret += vchiq_mmal_port_parameter_set(dev->instance, control,
304                                              MMAL_PARAMETER_EXPOSURE_MODE,
305                                              &exp_mode, sizeof(u32));
306 +       ret += set_framerate_params(dev);
307 +
308         return ret;
309  }
310  
311 @@ -540,8 +544,8 @@ static int ctrl_set_colfx(struct bm2835_
312                                         &dev->colourfx, sizeof(dev->colourfx));
313  
314         v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
315 -                "After: mmal_ctrl:%p ctrl id:0x%x ctrl val:%d ret %d(%d)\n",
316 -                       mmal_ctrl, ctrl->id, ctrl->val, ret,
317 +                "%s: After: mmal_ctrl:%p ctrl id:0x%x ctrl val:%d ret %d(%d)\n",
318 +                       __func__, mmal_ctrl, ctrl->id, ctrl->val, ret,
319                         (ret == 0 ? 0 : -EINVAL));
320         return (ret == 0 ? 0 : EINVAL);
321  }
322 @@ -623,6 +627,117 @@ static int ctrl_set_video_encode_param_o
323                                              &u32_value, sizeof(u32_value));
324  }
325  
326 +static int ctrl_set_video_encode_profile_level(struct bm2835_mmal_dev *dev,
327 +                     struct v4l2_ctrl *ctrl,
328 +                     const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
329 +{
330 +       struct mmal_parameter_video_profile param;
331 +       int ret = 0;
332 +
333 +       if (ctrl->id == V4L2_CID_MPEG_VIDEO_H264_PROFILE) {
334 +               switch (ctrl->val) {
335 +               case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
336 +               case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE:
337 +               case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
338 +               case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
339 +                       dev->capture.enc_profile = ctrl->val;
340 +                       break;
341 +               default:
342 +                       ret = -EINVAL;
343 +                       break;
344 +               }
345 +       } else if (ctrl->id == V4L2_CID_MPEG_VIDEO_H264_LEVEL) {
346 +               switch (ctrl->val) {
347 +               case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
348 +               case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
349 +               case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
350 +               case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
351 +               case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
352 +               case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
353 +               case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
354 +               case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
355 +               case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
356 +               case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
357 +               case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
358 +               case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
359 +                       dev->capture.enc_level = ctrl->val;
360 +                       break;
361 +               default:
362 +                       ret = -EINVAL;
363 +                       break;
364 +               }
365 +       }
366 +
367 +       if (!ret) {
368 +               switch (dev->capture.enc_profile) {
369 +               case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
370 +                       param.profile = MMAL_VIDEO_PROFILE_H264_BASELINE;
371 +                       break;
372 +               case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE:
373 +                       param.profile =
374 +                               MMAL_VIDEO_PROFILE_H264_CONSTRAINED_BASELINE;
375 +                       break;
376 +               case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
377 +                       param.profile = MMAL_VIDEO_PROFILE_H264_MAIN;
378 +                       break;
379 +               case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
380 +                       param.profile = MMAL_VIDEO_PROFILE_H264_HIGH;
381 +                       break;
382 +               default:
383 +                       /* Should never get here */
384 +                       break;
385 +               }
386 +
387 +               switch (dev->capture.enc_level) {
388 +               case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
389 +                       param.level = MMAL_VIDEO_LEVEL_H264_1;
390 +                       break;
391 +               case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
392 +                       param.level = MMAL_VIDEO_LEVEL_H264_1b;
393 +                       break;
394 +               case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
395 +                       param.level = MMAL_VIDEO_LEVEL_H264_11;
396 +                       break;
397 +               case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
398 +                       param.level = MMAL_VIDEO_LEVEL_H264_12;
399 +                       break;
400 +               case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
401 +                       param.level = MMAL_VIDEO_LEVEL_H264_13;
402 +                       break;
403 +               case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
404 +                       param.level = MMAL_VIDEO_LEVEL_H264_2;
405 +                       break;
406 +               case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
407 +                       param.level = MMAL_VIDEO_LEVEL_H264_21;
408 +                       break;
409 +               case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
410 +                       param.level = MMAL_VIDEO_LEVEL_H264_22;
411 +                       break;
412 +               case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
413 +                       param.level = MMAL_VIDEO_LEVEL_H264_3;
414 +                       break;
415 +               case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
416 +                       param.level = MMAL_VIDEO_LEVEL_H264_31;
417 +                       break;
418 +               case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
419 +                       param.level = MMAL_VIDEO_LEVEL_H264_32;
420 +                       break;
421 +               case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
422 +                       param.level = MMAL_VIDEO_LEVEL_H264_4;
423 +                       break;
424 +               default:
425 +                       /* Should never get here */
426 +                       break;
427 +               }
428 +
429 +               ret = vchiq_mmal_port_parameter_set(dev->instance,
430 +                       &dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->output[0],
431 +                       mmal_ctrl->mmal_id,
432 +                       &param, sizeof(param));
433 +       }
434 +       return ret;
435 +}
436 +
437  static int bm2835_mmal_s_ctrl(struct v4l2_ctrl *ctrl)
438  {
439         struct bm2835_mmal_dev *dev =
440 @@ -639,6 +754,9 @@ static int bm2835_mmal_s_ctrl(struct v4l
441         }
442  
443         ret = mmal_ctrl->setter(dev, ctrl, mmal_ctrl);
444 +       if (ret)
445 +               pr_warn("ctrl id:%d/MMAL param %08X- returned ret %d\n",
446 +                               ctrl->id, mmal_ctrl->mmal_id, ret);
447         if (mmal_ctrl->ignore_errors)
448                 ret = 0;
449         return ret;
450 @@ -725,6 +843,14 @@ static const struct bm2835_mmal_v4l2_ctr
451                 false
452         },
453         {
454 +               V4L2_CID_EXPOSURE_AUTO_PRIORITY, MMAL_CONTROL_TYPE_STD,
455 +               0, 1,
456 +               0, 1, NULL,
457 +               0,      /* Dummy MMAL ID as it gets mapped into FPS range*/
458 +               &ctrl_set_exposure,
459 +               false
460 +       },
461 +       {
462                 V4L2_CID_EXPOSURE_METERING,
463                 MMAL_CONTROL_TYPE_STD_MENU,
464                 ~0x7, 2, V4L2_EXPOSURE_METERING_AVERAGE, 0, NULL,
465 @@ -814,6 +940,39 @@ static const struct bm2835_mmal_v4l2_ctr
466                 &ctrl_set_video_encode_param_output,
467                 true    /* Errors ignored as requires latest firmware to work */
468         },
469 +       {
470 +               V4L2_CID_MPEG_VIDEO_H264_PROFILE,
471 +               MMAL_CONTROL_TYPE_STD_MENU,
472 +               ~((1<<V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) |
473 +                       (1<<V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) |
474 +                       (1<<V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) |
475 +                       (1<<V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)),
476 +               V4L2_MPEG_VIDEO_H264_PROFILE_HIGH,
477 +               V4L2_MPEG_VIDEO_H264_PROFILE_HIGH, 1, NULL,
478 +               MMAL_PARAMETER_PROFILE,
479 +               &ctrl_set_video_encode_profile_level,
480 +               false
481 +       },
482 +       {
483 +               V4L2_CID_MPEG_VIDEO_H264_LEVEL, MMAL_CONTROL_TYPE_STD_MENU,
484 +               ~((1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_0) |
485 +                       (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1B) |
486 +                       (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_1) |
487 +                       (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_2) |
488 +                       (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_3) |
489 +                       (1<<V4L2_MPEG_VIDEO_H264_LEVEL_2_0) |
490 +                       (1<<V4L2_MPEG_VIDEO_H264_LEVEL_2_1) |
491 +                       (1<<V4L2_MPEG_VIDEO_H264_LEVEL_2_2) |
492 +                       (1<<V4L2_MPEG_VIDEO_H264_LEVEL_3_0) |
493 +                       (1<<V4L2_MPEG_VIDEO_H264_LEVEL_3_1) |
494 +                       (1<<V4L2_MPEG_VIDEO_H264_LEVEL_3_2) |
495 +                       (1<<V4L2_MPEG_VIDEO_H264_LEVEL_4_0)),
496 +               V4L2_MPEG_VIDEO_H264_LEVEL_4_0,
497 +               V4L2_MPEG_VIDEO_H264_LEVEL_4_0, 1, NULL,
498 +               MMAL_PARAMETER_PROFILE,
499 +               &ctrl_set_video_encode_profile_level,
500 +               false
501 +       },
502  };
503  
504  int bm2835_mmal_set_all_camera_controls(struct bm2835_mmal_dev *dev)
505 @@ -825,13 +984,71 @@ int bm2835_mmal_set_all_camera_controls(
506                 if ((dev->ctrls[c]) && (v4l2_ctrls[c].setter)) {
507                         ret = v4l2_ctrls[c].setter(dev, dev->ctrls[c],
508                                                    &v4l2_ctrls[c]);
509 -                       if (!v4l2_ctrls[c]. ignore_errors && ret)
510 +                       if (!v4l2_ctrls[c].ignore_errors && ret) {
511 +                               v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
512 +                                       "Failed when setting default values for ctrl %d\n",
513 +                                       c);
514                                 break;
515 +                       }
516                 }
517         }
518         return ret;
519  }
520  
521 +int set_framerate_params(struct bm2835_mmal_dev *dev)
522 +{
523 +       struct mmal_parameter_fps_range fps_range;
524 +       int ret;
525 +
526 +       if ((dev->exposure_mode_v4l2 == V4L2_EXPOSURE_AUTO ||
527 +            dev->exposure_mode_v4l2 == V4L2_EXPOSURE_APERTURE_PRIORITY) &&
528 +            (dev->exp_auto_priority)) {
529 +               /* Variable FPS. Define min FPS as 1fps.
530 +                * Max as max defined FPS.
531 +                */
532 +               fps_range.fps_low.num = 1;
533 +               fps_range.fps_low.den = 1;
534 +               fps_range.fps_high.num = dev->capture.timeperframe.denominator;
535 +               fps_range.fps_high.den = dev->capture.timeperframe.numerator;
536 +       } else {
537 +               /* Fixed FPS - set min and max to be the same */
538 +               fps_range.fps_low.num = fps_range.fps_high.num =
539 +                       dev->capture.timeperframe.denominator;
540 +               fps_range.fps_low.den = fps_range.fps_high.den =
541 +                       dev->capture.timeperframe.numerator;
542 +       }
543 +
544 +       v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
545 +                        "Set fps range to %d/%d to %d/%d\n",
546 +                        fps_range.fps_low.num,
547 +                        fps_range.fps_low.den,
548 +                        fps_range.fps_high.num,
549 +                        fps_range.fps_high.den
550 +                );
551 +
552 +       ret = vchiq_mmal_port_parameter_set(dev->instance,
553 +                                     &dev->component[MMAL_COMPONENT_CAMERA]->
554 +                                       output[MMAL_CAMERA_PORT_PREVIEW],
555 +                                     MMAL_PARAMETER_FPS_RANGE,
556 +                                     &fps_range, sizeof(fps_range));
557 +       ret += vchiq_mmal_port_parameter_set(dev->instance,
558 +                                     &dev->component[MMAL_COMPONENT_CAMERA]->
559 +                                       output[MMAL_CAMERA_PORT_VIDEO],
560 +                                     MMAL_PARAMETER_FPS_RANGE,
561 +                                     &fps_range, sizeof(fps_range));
562 +       ret += vchiq_mmal_port_parameter_set(dev->instance,
563 +                                     &dev->component[MMAL_COMPONENT_CAMERA]->
564 +                                       output[MMAL_CAMERA_PORT_CAPTURE],
565 +                                     MMAL_PARAMETER_FPS_RANGE,
566 +                                     &fps_range, sizeof(fps_range));
567 +       if (ret)
568 +               v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev,
569 +                "Failed to set fps ret %d\n",
570 +                ret);
571 +
572 +       return ret;
573 +
574 +}
575  int bm2835_mmal_init_controls(struct bm2835_mmal_dev *dev,
576                               struct v4l2_ctrl_handler *hdl)
577  {
578 --- a/drivers/media/platform/bcm2835/mmal-parameters.h
579 +++ b/drivers/media/platform/bcm2835/mmal-parameters.h
580 @@ -182,6 +182,14 @@ enum mmal_parameter_camera_config_timest
581                                               */
582  };
583  
584 +struct mmal_parameter_fps_range {
585 +       /**< Low end of the permitted framerate range */
586 +       struct mmal_parameter_rational  fps_low;
587 +       /**< High end of the permitted framerate range */
588 +       struct mmal_parameter_rational  fps_high;
589 +};
590 +
591 +
592  /* camera configuration parameter */
593  struct mmal_parameter_camera_config {
594         /* Parameters for setting up the image pools */
595 @@ -293,6 +301,85 @@ enum mmal_parameter_rate_control_mode {
596         MMAL_VIDEO_RATECONTROL_CONSTANT_SKIP_FRAMES
597  };
598  
599 +enum mmal_video_profile {
600 +       MMAL_VIDEO_PROFILE_H263_BASELINE,
601 +       MMAL_VIDEO_PROFILE_H263_H320CODING,
602 +       MMAL_VIDEO_PROFILE_H263_BACKWARDCOMPATIBLE,
603 +       MMAL_VIDEO_PROFILE_H263_ISWV2,
604 +       MMAL_VIDEO_PROFILE_H263_ISWV3,
605 +       MMAL_VIDEO_PROFILE_H263_HIGHCOMPRESSION,
606 +       MMAL_VIDEO_PROFILE_H263_INTERNET,
607 +       MMAL_VIDEO_PROFILE_H263_INTERLACE,
608 +       MMAL_VIDEO_PROFILE_H263_HIGHLATENCY,
609 +       MMAL_VIDEO_PROFILE_MP4V_SIMPLE,
610 +       MMAL_VIDEO_PROFILE_MP4V_SIMPLESCALABLE,
611 +       MMAL_VIDEO_PROFILE_MP4V_CORE,
612 +       MMAL_VIDEO_PROFILE_MP4V_MAIN,
613 +       MMAL_VIDEO_PROFILE_MP4V_NBIT,
614 +       MMAL_VIDEO_PROFILE_MP4V_SCALABLETEXTURE,
615 +       MMAL_VIDEO_PROFILE_MP4V_SIMPLEFACE,
616 +       MMAL_VIDEO_PROFILE_MP4V_SIMPLEFBA,
617 +       MMAL_VIDEO_PROFILE_MP4V_BASICANIMATED,
618 +       MMAL_VIDEO_PROFILE_MP4V_HYBRID,
619 +       MMAL_VIDEO_PROFILE_MP4V_ADVANCEDREALTIME,
620 +       MMAL_VIDEO_PROFILE_MP4V_CORESCALABLE,
621 +       MMAL_VIDEO_PROFILE_MP4V_ADVANCEDCODING,
622 +       MMAL_VIDEO_PROFILE_MP4V_ADVANCEDCORE,
623 +       MMAL_VIDEO_PROFILE_MP4V_ADVANCEDSCALABLE,
624 +       MMAL_VIDEO_PROFILE_MP4V_ADVANCEDSIMPLE,
625 +       MMAL_VIDEO_PROFILE_H264_BASELINE,
626 +       MMAL_VIDEO_PROFILE_H264_MAIN,
627 +       MMAL_VIDEO_PROFILE_H264_EXTENDED,
628 +       MMAL_VIDEO_PROFILE_H264_HIGH,
629 +       MMAL_VIDEO_PROFILE_H264_HIGH10,
630 +       MMAL_VIDEO_PROFILE_H264_HIGH422,
631 +       MMAL_VIDEO_PROFILE_H264_HIGH444,
632 +       MMAL_VIDEO_PROFILE_H264_CONSTRAINED_BASELINE,
633 +       MMAL_VIDEO_PROFILE_DUMMY = 0x7FFFFFFF
634 +};
635 +
636 +enum mmal_video_level {
637 +       MMAL_VIDEO_LEVEL_H263_10,
638 +       MMAL_VIDEO_LEVEL_H263_20,
639 +       MMAL_VIDEO_LEVEL_H263_30,
640 +       MMAL_VIDEO_LEVEL_H263_40,
641 +       MMAL_VIDEO_LEVEL_H263_45,
642 +       MMAL_VIDEO_LEVEL_H263_50,
643 +       MMAL_VIDEO_LEVEL_H263_60,
644 +       MMAL_VIDEO_LEVEL_H263_70,
645 +       MMAL_VIDEO_LEVEL_MP4V_0,
646 +       MMAL_VIDEO_LEVEL_MP4V_0b,
647 +       MMAL_VIDEO_LEVEL_MP4V_1,
648 +       MMAL_VIDEO_LEVEL_MP4V_2,
649 +       MMAL_VIDEO_LEVEL_MP4V_3,
650 +       MMAL_VIDEO_LEVEL_MP4V_4,
651 +       MMAL_VIDEO_LEVEL_MP4V_4a,
652 +       MMAL_VIDEO_LEVEL_MP4V_5,
653 +       MMAL_VIDEO_LEVEL_MP4V_6,
654 +       MMAL_VIDEO_LEVEL_H264_1,
655 +       MMAL_VIDEO_LEVEL_H264_1b,
656 +       MMAL_VIDEO_LEVEL_H264_11,
657 +       MMAL_VIDEO_LEVEL_H264_12,
658 +       MMAL_VIDEO_LEVEL_H264_13,
659 +       MMAL_VIDEO_LEVEL_H264_2,
660 +       MMAL_VIDEO_LEVEL_H264_21,
661 +       MMAL_VIDEO_LEVEL_H264_22,
662 +       MMAL_VIDEO_LEVEL_H264_3,
663 +       MMAL_VIDEO_LEVEL_H264_31,
664 +       MMAL_VIDEO_LEVEL_H264_32,
665 +       MMAL_VIDEO_LEVEL_H264_4,
666 +       MMAL_VIDEO_LEVEL_H264_41,
667 +       MMAL_VIDEO_LEVEL_H264_42,
668 +       MMAL_VIDEO_LEVEL_H264_5,
669 +       MMAL_VIDEO_LEVEL_H264_51,
670 +       MMAL_VIDEO_LEVEL_DUMMY = 0x7FFFFFFF
671 +};
672 +
673 +struct mmal_parameter_video_profile {
674 +       enum mmal_video_profile profile;
675 +       enum mmal_video_level level;
676 +};
677 +
678  /* video parameters */
679  
680  enum mmal_parameter_video_type {