1 From c8fb291144efa1ab7f0628119894a1e72f08bce4 Mon Sep 17 00:00:00 2001
2 From: Dave Stevenson <dsteve@broadcom.com>
3 Date: Mon, 9 Dec 2013 10:58:01 +0000
4 Subject: [PATCH 028/114] V4L2: Fixes from 6by9
6 V4L2: Fix EV values. Add manual shutter speed control
8 V4L2 EV values should be in units of 1/1000. Corrected.
9 Add support for V4L2_CID_EXPOSURE_ABSOLUTE which should
10 give manual shutter control. Requires manual exposure mode
13 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
15 V4L2: Correct JPEG Q-factor range
17 Should be 1-100, not 0-100
19 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
21 V4L2: Fix issue of driver jamming if STREAMON failed.
23 Fix issue where the driver was left in a partially enabled
24 state if STREAMON failed, and would then reject many IOCTLs
25 as it thought it was streaming.
27 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
29 V4L2: Fix ISO controls.
31 Driver was passing the index to the GPU, and not the desired
34 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
36 V4L2: Add flicker avoidance controls
38 Add support for V4L2_CID_POWER_LINE_FREQUENCY to set flicker
39 avoidance frequencies.
41 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
43 V4L2: Add support for frame rate control.
45 Add support for frame rate (or time per frame as V4L2
46 inverts it) control via s_parm.
48 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
50 V4L2: Improve G_FBUF handling so we pass conformance
52 Return some sane numbers for get framebuffer so that
55 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
57 V4L2: Fix information advertised through g_vidfmt
59 Width and height were being stored based on incorrect
62 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
64 V4L2: Add support for inline H264 headers
66 Add support for V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER
67 to control H264 inline headers.
68 Requires firmware fix to work correctly, otherwise format
69 has to be set to H264 before this parameter is set.
71 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
73 V4L2: Fix JPEG timestamp issue
75 JPEG images were coming through from the GPU with timestamp
76 of 0. Detect this and give current system time instead
77 of some invalid value.
79 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
81 V4L2: Fix issue when switching down JPEG resolution.
83 JPEG buffer size calculation is based on input resolution.
84 Input resolution was being configured after output port
85 format. Caused failures if switching from one JPEG resolution
88 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
90 V4L2: Enable MJPEG encoding
92 Requires GPU firmware update to support MJPEG encoder.
94 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
96 V4L2: Correct flag settings for compressed formats
98 Set flags field correctly on enum_fmt_vid_cap for compressed
101 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
103 V4L2: H264 profile & level ctrls, FPS control and auto exp pri
105 Several control handling updates.
106 H264 profile and level controls.
107 Timeperframe/FPS reworked to add V4L2_CID_EXPOSURE_AUTO_PRIORITY to
108 select whether AE is allowed to override the framerate specified.
110 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
112 V4L2: Correct BGR24 to RGB24 in format table
114 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
116 V4L2: Add additional pixel formats. Correct colourspace
118 Adds the other flavours of YUYV, and NV12.
119 Corrects the overlay advertised colourspace.
121 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
123 V4L2: Drop logging msg from info to debug
125 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
127 V4L2: Initial pass at scene modes.
129 Only supports exposure mode and metering modes.
131 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
133 V4L2: Add manual white balance control.
135 Adds support for V4L2_CID_RED_BALANCE and
136 V4L2_CID_BLUE_BALANCE. Only has an effect if
137 V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE has
138 V4L2_WHITE_BALANCE_MANUAL selected.
140 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
142 config: Enable V4L / MMAL driver
144 V4L2: Increase the MMAL timeout to 3sec
146 MJPEG codec flush is now taking longer and results
147 in a kernel panic if the driver has stopped waiting for
148 the result when it finally completes.
149 Increase the timeout value from 1 to 3secs.
151 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
153 V4L2: Add support for setting H264_I_PERIOD
155 Adds support for the parameter V4L2_CID_MPEG_VIDEO_H264_I_PERIOD
156 to set the frequency with which I frames are produced.
158 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
160 V4L2: Enable GPU function for removing padding from images.
162 GPU can now support arbitrary strides, although may require
163 additional processing to achieve it. Enable this feature
164 so that the images delivered are the size requested.
166 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
168 V4L2: Add support for V4L2_PIX_FMT_BGR32
170 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
172 V4L2: Set the colourspace to avoid odd YUV-RGB conversions
174 Removes the amiguity from the conversion routines and stops
175 them dropping back to the SD vs HD choice of coeffs.
177 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
179 V4L2: Make video/still threshold a run-time param
181 Move the define for at what resolution the driver
182 switches from a video mode capture to a stills mode
183 capture to module parameters.
185 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
187 V4L2: Fix incorrect pool sizing
189 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
191 V4L2: Add option to disable enum_framesizes.
193 Gstreamer's handling of a driver that advertises
194 V4L2_FRMSIZE_TYPE_STEPWISE to define the supported
195 resolutions is broken. See bug
196 https://bugzilla.gnome.org/show_bug.cgi?id=726521
198 Optional parameter of gst_v4l2src_is_broken added.
199 If non-zero, the driver claims not to support that
200 ioctl, and gstreamer should be happy again (it
201 guesses a set of defaults for itself).
203 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
205 V4L2: Add support for more image formats
207 Adds YVU420 (YV12), YVU420SP (NV21), and BGR888.
209 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
211 V4L2: Extend range for V4L2_CID_MPEG_VIDEO_H264_I_PERIOD
213 Request to extend the range from the fairly arbitrary
214 1000 frames (33 seconds at 30fps). Extend out to the
215 max range supported (int32 value).
216 Also allow 0, which is handled by the codec as only
217 send an I-frame on the first frame and never again.
218 There may be an exception if it detects a significant
219 scene change, but there's no easy way around that.
221 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
223 bcm2835-camera: stop_streaming now has a void return
225 arch/arm/configs/bcmrpi_defconfig | 3 +
226 drivers/media/platform/bcm2835/bcm2835-camera.c | 578 ++++++++++++++----
227 drivers/media/platform/bcm2835/bcm2835-camera.h | 23 +-
228 drivers/media/platform/bcm2835/controls.c | 723 +++++++++++++++++++++--
229 drivers/media/platform/bcm2835/mmal-common.h | 1 +
230 drivers/media/platform/bcm2835/mmal-encodings.h | 34 ++
231 drivers/media/platform/bcm2835/mmal-parameters.h | 121 +++-
232 drivers/media/platform/bcm2835/mmal-vchiq.c | 4 +-
233 8 files changed, 1300 insertions(+), 187 deletions(-)
235 --- a/arch/arm/configs/bcmrpi_defconfig
236 +++ b/arch/arm/configs/bcmrpi_defconfig
237 @@ -708,6 +708,9 @@ CONFIG_DVB_AS102=m
238 CONFIG_VIDEO_EM28XX=m
239 CONFIG_VIDEO_EM28XX_ALSA=m
240 CONFIG_VIDEO_EM28XX_DVB=m
241 +CONFIG_V4L_PLATFORM_DRIVERS=y
242 +CONFIG_VIDEO_BCM2835=y
243 +CONFIG_VIDEO_BCM2835_MMAL=m
244 CONFIG_RADIO_SI470X=y
247 --- a/drivers/media/platform/bcm2835/bcm2835-camera.c
248 +++ b/drivers/media/platform/bcm2835/bcm2835-camera.c
251 #define BM2835_MMAL_VERSION "0.0.2"
252 #define BM2835_MMAL_MODULE_NAME "bcm2835-v4l2"
254 +#define MIN_WIDTH 16
255 +#define MIN_HEIGHT 16
256 #define MAX_WIDTH 2592
257 #define MAX_HEIGHT 1944
258 #define MIN_BUFFER_SIZE (80*1024)
259 @@ -53,13 +54,43 @@ int bcm2835_v4l2_debug;
260 module_param_named(debug, bcm2835_v4l2_debug, int, 0644);
261 MODULE_PARM_DESC(bcm2835_v4l2_debug, "Debug level 0-2");
263 +int max_video_width = MAX_VIDEO_MODE_WIDTH;
264 +int max_video_height = MAX_VIDEO_MODE_HEIGHT;
265 +module_param(max_video_width, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
266 +MODULE_PARM_DESC(max_video_width, "Threshold for video mode");
267 +module_param(max_video_height, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
268 +MODULE_PARM_DESC(max_video_height, "Threshold for video mode");
270 +/* Gstreamer bug https://bugzilla.gnome.org/show_bug.cgi?id=726521
271 + * v4l2src does bad (and actually wrong) things when the vidioc_enum_framesizes
272 + * function says type V4L2_FRMSIZE_TYPE_STEPWISE, which we do by default.
273 + * It's happier if we just don't say anything at all, when it then
274 + * sets up a load of defaults that it thinks might work.
275 + * If gst_v4l2src_is_broken is non-zero, then we remove the function from
276 + * our function table list (actually switch to an alternate set, but same
279 +int gst_v4l2src_is_broken = 0;
280 +module_param(gst_v4l2src_is_broken, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
281 +MODULE_PARM_DESC(gst_v4l2src_is_broken, "If non-zero, enable workaround for Gstreamer");
283 static struct bm2835_mmal_dev *gdev; /* global device data */
288 +/* timeperframe: min/max and default */
289 +static const struct v4l2_fract
290 + tpf_min = {.numerator = 1, .denominator = FPS_MAX},
291 + tpf_max = {.numerator = 1, .denominator = FPS_MIN},
292 + tpf_default = {.numerator = 1000, .denominator = 30000};
295 static struct mmal_fmt formats[] = {
297 .name = "4:2:0, packed YUV",
298 .fourcc = V4L2_PIX_FMT_YUV420,
300 .mmal = MMAL_ENCODING_I420,
302 .mmal_component = MMAL_COMPONENT_CAMERA,
303 @@ -67,13 +98,15 @@ static struct mmal_fmt formats[] = {
305 .name = "4:2:2, packed, YUYV",
306 .fourcc = V4L2_PIX_FMT_YUYV,
308 .mmal = MMAL_ENCODING_YUYV,
310 .mmal_component = MMAL_COMPONENT_CAMERA,
313 - .name = "RGB24 (BE)",
314 - .fourcc = V4L2_PIX_FMT_BGR24,
315 + .name = "RGB24 (LE)",
316 + .fourcc = V4L2_PIX_FMT_RGB24,
318 .mmal = MMAL_ENCODING_BGR24,
320 .mmal_component = MMAL_COMPONENT_CAMERA,
321 @@ -81,6 +114,7 @@ static struct mmal_fmt formats[] = {
324 .fourcc = V4L2_PIX_FMT_JPEG,
325 + .flags = V4L2_FMT_FLAG_COMPRESSED,
326 .mmal = MMAL_ENCODING_JPEG,
328 .mmal_component = MMAL_COMPONENT_IMAGE_ENCODE,
329 @@ -88,10 +122,83 @@ static struct mmal_fmt formats[] = {
332 .fourcc = V4L2_PIX_FMT_H264,
333 + .flags = V4L2_FMT_FLAG_COMPRESSED,
334 .mmal = MMAL_ENCODING_H264,
336 .mmal_component = MMAL_COMPONENT_VIDEO_ENCODE,
341 + .fourcc = V4L2_PIX_FMT_MJPEG,
342 + .flags = V4L2_FMT_FLAG_COMPRESSED,
343 + .mmal = MMAL_ENCODING_MJPEG,
345 + .mmal_component = MMAL_COMPONENT_VIDEO_ENCODE,
348 + .name = "4:2:2, packed, YVYU",
349 + .fourcc = V4L2_PIX_FMT_YVYU,
351 + .mmal = MMAL_ENCODING_YVYU,
353 + .mmal_component = MMAL_COMPONENT_CAMERA,
356 + .name = "4:2:2, packed, VYUY",
357 + .fourcc = V4L2_PIX_FMT_VYUY,
359 + .mmal = MMAL_ENCODING_VYUY,
361 + .mmal_component = MMAL_COMPONENT_CAMERA,
364 + .name = "4:2:2, packed, UYVY",
365 + .fourcc = V4L2_PIX_FMT_UYVY,
367 + .mmal = MMAL_ENCODING_UYVY,
369 + .mmal_component = MMAL_COMPONENT_CAMERA,
372 + .name = "4:2:0, packed, NV12",
373 + .fourcc = V4L2_PIX_FMT_NV12,
375 + .mmal = MMAL_ENCODING_NV12,
377 + .mmal_component = MMAL_COMPONENT_CAMERA,
380 + .name = "RGB24 (BE)",
381 + .fourcc = V4L2_PIX_FMT_BGR24,
383 + .mmal = MMAL_ENCODING_RGB24,
385 + .mmal_component = MMAL_COMPONENT_CAMERA,
388 + .name = "4:2:0, packed YVU",
389 + .fourcc = V4L2_PIX_FMT_YVU420,
391 + .mmal = MMAL_ENCODING_YV12,
393 + .mmal_component = MMAL_COMPONENT_CAMERA,
396 + .name = "4:2:0, packed, NV21",
397 + .fourcc = V4L2_PIX_FMT_NV21,
399 + .mmal = MMAL_ENCODING_NV21,
401 + .mmal_component = MMAL_COMPONENT_CAMERA,
404 + .name = "RGB32 (BE)",
405 + .fourcc = V4L2_PIX_FMT_BGR32,
407 + .mmal = MMAL_ENCODING_BGRA,
409 + .mmal_component = MMAL_COMPONENT_CAMERA,
413 static struct mmal_fmt *get_format(struct v4l2_format *f)
414 @@ -229,7 +336,8 @@ static void buffer_cb(struct vchiq_mmal_
417 if (dev->capture.frame_count) {
418 - if (dev->capture.vc_start_timestamp != -1) {
419 + if (dev->capture.vc_start_timestamp != -1 &&
421 s64 runtime_us = pts -
422 dev->capture.vc_start_timestamp;
424 @@ -250,7 +358,7 @@ static void buffer_cb(struct vchiq_mmal_
427 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
428 - "Convert start time %d.%06d and %llu"
429 + "Convert start time %d.%06d and %llu "
430 "with offset %llu to %d.%06d\n",
431 (int)dev->capture.kernel_start_ts.
433 @@ -425,7 +533,15 @@ static int start_streaming(struct vb2_qu
434 vchiq_mmal_port_enable(dev->instance, dev->capture.port, buffer_cb);
436 v4l2_err(&dev->v4l2_dev,
437 - "Failed to enable capture port - error %d\n", ret);
438 + "Failed to enable capture port - error %d. "
439 + "Disabling camera port again\n", ret);
441 + vchiq_mmal_port_disable(dev->instance,
442 + dev->capture.camera_port);
443 + if (disable_camera(dev) < 0) {
444 + v4l2_err(&dev->v4l2_dev, "Failed to disable camera\n");
450 @@ -439,7 +555,7 @@ static int start_streaming(struct vb2_qu
453 /* abort streaming and wait for last buffer */
454 -static int stop_streaming(struct vb2_queue *vq)
455 +static void stop_streaming(struct vb2_queue *vq)
458 struct bm2835_mmal_dev *dev = vb2_get_drv_priv(vq);
459 @@ -451,8 +567,11 @@ static int stop_streaming(struct vb2_que
460 dev->capture.frame_count = 0;
462 /* ensure a format has actually been set */
463 - if (dev->capture.port == NULL)
465 + if (dev->capture.port == NULL) {
466 + v4l2_err(&dev->v4l2_dev,
467 + "no capture port - stream not started?\n");
471 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, "stopping capturing\n");
473 @@ -483,12 +602,8 @@ static int stop_streaming(struct vb2_que
477 - if (disable_camera(dev) < 0) {
478 - v4l2_err(&dev->v4l2_dev, "Failed to disable camera");
483 + if (disable_camera(dev) < 0)
484 + v4l2_err(&dev->v4l2_dev, "Failed to disable camera\n");
487 static void bm2835_mmal_lock(struct vb2_queue *vq)
488 @@ -530,6 +645,7 @@ static int vidioc_enum_fmt_vid_overlay(s
490 strlcpy(f->description, fmt->name, sizeof(f->description));
491 f->pixelformat = fmt->fourcc;
492 + f->flags = fmt->flags;
496 @@ -647,10 +763,18 @@ static int vidioc_g_fbuf(struct file *fi
498 /* The video overlay must stay within the framebuffer and can't be
499 positioned independently. */
500 + struct bm2835_mmal_dev *dev = video_drvdata(file);
501 + struct vchiq_mmal_port *preview_port =
502 + &dev->component[MMAL_COMPONENT_CAMERA]->
503 + output[MMAL_CAMERA_PORT_PREVIEW];
504 a->flags = V4L2_FBUF_FLAG_OVERLAY;
506 - /* todo: v4l2_framebuffer still needs more info filling in
507 - * in order to pass the v4l2-compliance test. */
508 + a->fmt.width = preview_port->es.video.width;
509 + a->fmt.height = preview_port->es.video.height;
510 + a->fmt.pixelformat = V4L2_PIX_FMT_YUV420;
511 + a->fmt.bytesperline = (preview_port->es.video.width * 3)>>1;
512 + a->fmt.sizeimage = (preview_port->es.video.width *
513 + preview_port->es.video.height * 3)>>1;
514 + a->fmt.colorspace = V4L2_COLORSPACE_JPEG;
518 @@ -717,6 +841,8 @@ static int vidioc_enum_fmt_vid_cap(struc
520 strlcpy(f->description, fmt->name, sizeof(f->description));
521 f->pixelformat = fmt->fourcc;
522 + f->flags = fmt->flags;
527 @@ -729,20 +855,13 @@ static int vidioc_g_fmt_vid_cap(struct f
528 f->fmt.pix.height = dev->capture.height;
529 f->fmt.pix.field = V4L2_FIELD_NONE;
530 f->fmt.pix.pixelformat = dev->capture.fmt->fourcc;
531 - f->fmt.pix.bytesperline =
532 - (f->fmt.pix.width * dev->capture.fmt->depth) >> 3;
533 - f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
534 - if (dev->capture.fmt->fourcc == V4L2_PIX_FMT_JPEG
535 - && f->fmt.pix.sizeimage < (100 << 10)) {
536 - /* Need a minimum size for JPEG to account for EXIF. */
537 - f->fmt.pix.sizeimage = (100 << 10);
539 + f->fmt.pix.bytesperline = dev->capture.stride;
540 + f->fmt.pix.sizeimage = dev->capture.buffersize;
542 - if (dev->capture.fmt->fourcc == V4L2_PIX_FMT_YUYV ||
543 - dev->capture.fmt->fourcc == V4L2_PIX_FMT_UYVY)
544 - f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
546 + if (dev->capture.fmt->fourcc == V4L2_PIX_FMT_RGB24)
547 f->fmt.pix.colorspace = V4L2_COLORSPACE_SRGB;
549 + f->fmt.pix.colorspace = V4L2_COLORSPACE_JPEG;
552 v4l2_dump_pix_format(1, bcm2835_v4l2_debug, &dev->v4l2_dev, &f->fmt.pix,
553 @@ -766,21 +885,35 @@ static int vidioc_try_fmt_vid_cap(struct
556 f->fmt.pix.field = V4L2_FIELD_NONE;
557 - /* image must be a multiple of 32 pixels wide and 16 lines high */
558 - v4l_bound_align_image(&f->fmt.pix.width, 48, MAX_WIDTH, 5,
559 - &f->fmt.pix.height, 32, MAX_HEIGHT, 4, 0);
560 - f->fmt.pix.bytesperline = (f->fmt.pix.width * mfmt->depth) >> 3;
561 - f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
562 - if (f->fmt.pix.sizeimage < MIN_BUFFER_SIZE)
564 + v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
565 + "Clipping/aligning %dx%d format %08X\n",
566 + f->fmt.pix.width, f->fmt.pix.height, f->fmt.pix.pixelformat);
568 + v4l_bound_align_image(&f->fmt.pix.width, MIN_WIDTH, MAX_WIDTH, 1,
569 + &f->fmt.pix.height, MIN_HEIGHT, MAX_HEIGHT, 1, 0);
570 + f->fmt.pix.bytesperline = (f->fmt.pix.width * mfmt->depth)>>3;
572 + /* Image buffer has to be padded to allow for alignment, even though
573 + * we then remove that padding before delivering the buffer.
575 + f->fmt.pix.sizeimage = ((f->fmt.pix.height+15)&~15) *
576 + (((f->fmt.pix.width+31)&~31) * mfmt->depth) >> 3;
578 + if ((mfmt->flags & V4L2_FMT_FLAG_COMPRESSED) &&
579 + f->fmt.pix.sizeimage < MIN_BUFFER_SIZE)
580 f->fmt.pix.sizeimage = MIN_BUFFER_SIZE;
582 - if (mfmt->fourcc == V4L2_PIX_FMT_YUYV ||
583 - mfmt->fourcc == V4L2_PIX_FMT_UYVY)
584 - f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
586 + if (dev->capture.fmt->fourcc == V4L2_PIX_FMT_RGB24)
587 f->fmt.pix.colorspace = V4L2_COLORSPACE_SRGB;
589 + f->fmt.pix.colorspace = V4L2_COLORSPACE_JPEG;
592 + v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
593 + "Now %dx%d format %08X\n",
594 + f->fmt.pix.width, f->fmt.pix.height, f->fmt.pix.pixelformat);
596 v4l2_dump_pix_format(1, bcm2835_v4l2_debug, &dev->v4l2_dev, &f->fmt.pix,
599 @@ -818,8 +951,8 @@ static int mmal_setup_components(struct
600 switch (mfmt->mmal_component) {
601 case MMAL_COMPONENT_CAMERA:
602 /* Make a further decision on port based on resolution */
603 - if (f->fmt.pix.width <= MAX_VIDEO_MODE_WIDTH
604 - && f->fmt.pix.height <= MAX_VIDEO_MODE_HEIGHT)
605 + if (f->fmt.pix.width <= max_video_width
606 + && f->fmt.pix.height <= max_video_height)
608 &dev->component[MMAL_COMPONENT_CAMERA]->
609 output[MMAL_CAMERA_PORT_VIDEO];
610 @@ -861,8 +994,9 @@ static int mmal_setup_components(struct
611 camera_port->es.video.crop.y = 0;
612 camera_port->es.video.crop.width = f->fmt.pix.width;
613 camera_port->es.video.crop.height = f->fmt.pix.height;
614 - camera_port->es.video.frame_rate.num = 30;
615 + camera_port->es.video.frame_rate.num = 0;
616 camera_port->es.video.frame_rate.den = 1;
617 + camera_port->es.video.color_space = MMAL_COLOR_SPACE_JPEG_JFIF;
619 ret = vchiq_mmal_port_set_format(dev->instance, camera_port);
621 @@ -896,8 +1030,10 @@ static int mmal_setup_components(struct
622 preview_port->es.video.crop.y = 0;
623 preview_port->es.video.crop.width = f->fmt.pix.width;
624 preview_port->es.video.crop.height = f->fmt.pix.height;
625 - preview_port->es.video.frame_rate.num = 30;
626 - preview_port->es.video.frame_rate.den = 1;
627 + preview_port->es.video.frame_rate.num =
628 + dev->capture.timeperframe.denominator;
629 + preview_port->es.video.frame_rate.den =
630 + dev->capture.timeperframe.numerator;
631 ret = vchiq_mmal_port_set_format(dev->instance, preview_port);
632 if (overlay_enabled) {
633 ret = vchiq_mmal_port_connect_tunnel(
634 @@ -913,7 +1049,9 @@ static int mmal_setup_components(struct
637 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
638 - "%s failed to set format\n", __func__);
639 + "%s failed to set format %dx%d %08X\n", __func__,
640 + f->fmt.pix.width, f->fmt.pix.height,
641 + f->fmt.pix.pixelformat);
642 /* ensure capture is not going to be tried */
643 dev->capture.port = NULL;
645 @@ -927,69 +1065,91 @@ static int mmal_setup_components(struct
646 camera_port->current_buffer.num =
647 camera_port->recommended_buffer.num;
649 - port->format.encoding = mfmt->mmal;
650 - port->format.encoding_variant = 0;
651 - /* Set any encoding specific parameters */
652 - switch (mfmt->mmal_component) {
653 - case MMAL_COMPONENT_VIDEO_ENCODE:
654 - port->format.bitrate =
655 - dev->capture.encode_bitrate;
657 - case MMAL_COMPONENT_IMAGE_ENCODE:
658 - /* Could set EXIF parameters here */
663 - ret = vchiq_mmal_port_set_format(dev->instance, port);
666 + vchiq_mmal_port_connect_tunnel(
669 + &encode_component->input[0]);
671 - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
672 - "%s failed to set format\n", __func__);
673 + v4l2_dbg(1, bcm2835_v4l2_debug,
675 + "%s failed to create connection\n",
677 + /* ensure capture is not going to be tried */
678 + dev->capture.port = NULL;
680 + port->es.video.width = f->fmt.pix.width;
681 + port->es.video.height = f->fmt.pix.height;
682 + port->es.video.crop.x = 0;
683 + port->es.video.crop.y = 0;
684 + port->es.video.crop.width = f->fmt.pix.width;
685 + port->es.video.crop.height = f->fmt.pix.height;
686 + port->es.video.frame_rate.num =
687 + dev->capture.timeperframe.denominator;
688 + port->es.video.frame_rate.den =
689 + dev->capture.timeperframe.numerator;
691 + port->format.encoding = mfmt->mmal;
692 + port->format.encoding_variant = 0;
693 + /* Set any encoding specific parameters */
694 + switch (mfmt->mmal_component) {
695 + case MMAL_COMPONENT_VIDEO_ENCODE:
696 + port->format.bitrate =
697 + dev->capture.encode_bitrate;
699 + case MMAL_COMPONENT_IMAGE_ENCODE:
700 + /* Could set EXIF parameters here */
705 + ret = vchiq_mmal_port_set_format(dev->instance,
708 + v4l2_dbg(1, bcm2835_v4l2_debug,
710 + "%s failed to set format %dx%d fmt %08X\n",
714 + f->fmt.pix.pixelformat
719 ret = vchiq_mmal_component_enable(
723 v4l2_dbg(1, bcm2835_v4l2_debug,
725 - "%s Failed to enable encode components\n",
728 - /* configure buffering */
729 - port->current_buffer.num = 1;
730 - port->current_buffer.size =
731 - f->fmt.pix.sizeimage;
732 - if (port->format.encoding ==
733 - MMAL_ENCODING_JPEG) {
734 - v4l2_dbg(1, bcm2835_v4l2_debug,
736 - "JPEG - fiddle buffer size\n");
737 - port->current_buffer.size =
738 - (f->fmt.pix.sizeimage <
740 - ? (100 << 10) : f->fmt.pix.
744 + "%s Failed to enable encode components\n",
749 + /* configure buffering */
750 + port->current_buffer.num = 1;
751 + port->current_buffer.size =
752 + f->fmt.pix.sizeimage;
753 + if (port->format.encoding ==
754 + MMAL_ENCODING_JPEG) {
755 v4l2_dbg(1, bcm2835_v4l2_debug,
757 - "vid_cap - current_buffer.size being set to %d\n",
758 - f->fmt.pix.sizeimage);
759 - port->current_buffer.alignment = 0;
761 - vchiq_mmal_port_connect_tunnel(
764 - &encode_component->input[0]);
766 - v4l2_dbg(1, bcm2835_v4l2_debug,
768 - "%s failed to create connection\n",
770 - /* ensure capture is not going to be tried */
771 - dev->capture.port = NULL;
774 + "JPG - buf size now %d was %d\n",
775 + f->fmt.pix.sizeimage,
776 + port->current_buffer.size);
777 + port->current_buffer.size =
778 + (f->fmt.pix.sizeimage <
780 + ? (100 << 10) : f->fmt.pix.
783 + v4l2_dbg(1, bcm2835_v4l2_debug,
785 + "vid_cap - cur_buf.size set to %d\n",
786 + f->fmt.pix.sizeimage);
787 + port->current_buffer.alignment = 0;
790 /* configure buffering */
791 @@ -1001,13 +1161,20 @@ static int mmal_setup_components(struct
793 dev->capture.fmt = mfmt;
794 dev->capture.stride = f->fmt.pix.bytesperline;
795 - dev->capture.width = port->es.video.crop.width;
796 - dev->capture.height = port->es.video.crop.height;
797 + dev->capture.width = camera_port->es.video.crop.width;
798 + dev->capture.height = camera_port->es.video.crop.height;
799 + dev->capture.buffersize = port->current_buffer.size;
801 /* select port for capture */
802 dev->capture.port = port;
803 dev->capture.camera_port = camera_port;
804 dev->capture.encode_component = encode_component;
805 + v4l2_dbg(1, bcm2835_v4l2_debug,
807 + "Set dev->capture.fmt %08X, %dx%d, stride %d, size %d",
808 + port->format.encoding,
809 + dev->capture.width, dev->capture.height,
810 + dev->capture.stride, dev->capture.buffersize);
814 @@ -1048,14 +1215,115 @@ static int vidioc_s_fmt_vid_cap(struct f
817 ret = mmal_setup_components(dev, f);
820 v4l2_err(&dev->v4l2_dev,
821 "%s: failed to setup mmal components: %d\n",
829 +int vidioc_enum_framesizes(struct file *file, void *fh,
830 + struct v4l2_frmsizeenum *fsize)
832 + static const struct v4l2_frmsize_stepwise sizes = {
833 + MIN_WIDTH, MAX_WIDTH, 2,
834 + MIN_HEIGHT, MAX_HEIGHT, 2
840 + for (i = 0; i < ARRAY_SIZE(formats); i++)
841 + if (formats[i].fourcc == fsize->pixel_format)
843 + if (i == ARRAY_SIZE(formats))
845 + fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE;
846 + fsize->stepwise = sizes;
850 +/* timeperframe is arbitrary and continous */
851 +static int vidioc_enum_frameintervals(struct file *file, void *priv,
852 + struct v4l2_frmivalenum *fival)
859 + for (i = 0; i < ARRAY_SIZE(formats); i++)
860 + if (formats[i].fourcc == fival->pixel_format)
862 + if (i == ARRAY_SIZE(formats))
865 + /* regarding width & height - we support any within range */
866 + if (fival->width < MIN_WIDTH || fival->width > MAX_WIDTH ||
867 + fival->height < MIN_HEIGHT || fival->height > MAX_HEIGHT)
870 + fival->type = V4L2_FRMIVAL_TYPE_CONTINUOUS;
872 + /* fill in stepwise (step=1.0 is requred by V4L2 spec) */
873 + fival->stepwise.min = tpf_min;
874 + fival->stepwise.max = tpf_max;
875 + fival->stepwise.step = (struct v4l2_fract) {1, 1};
880 +static int vidioc_g_parm(struct file *file, void *priv,
881 + struct v4l2_streamparm *parm)
883 + struct bm2835_mmal_dev *dev = video_drvdata(file);
885 + if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
888 + parm->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
889 + parm->parm.capture.timeperframe = dev->capture.timeperframe;
890 + parm->parm.capture.readbuffers = 1;
894 +#define FRACT_CMP(a, OP, b) \
895 + ((u64)(a).numerator * (b).denominator OP \
896 + (u64)(b).numerator * (a).denominator)
898 +static int vidioc_s_parm(struct file *file, void *priv,
899 + struct v4l2_streamparm *parm)
901 + struct bm2835_mmal_dev *dev = video_drvdata(file);
902 + struct v4l2_fract tpf;
903 + struct mmal_parameter_rational fps_param;
905 + if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
908 + tpf = parm->parm.capture.timeperframe;
910 + /* tpf: {*, 0} resets timing; clip to [min, max]*/
911 + tpf = tpf.denominator ? tpf : tpf_default;
912 + tpf = FRACT_CMP(tpf, <, tpf_min) ? tpf_min : tpf;
913 + tpf = FRACT_CMP(tpf, >, tpf_max) ? tpf_max : tpf;
915 + dev->capture.timeperframe = tpf;
916 + parm->parm.capture.timeperframe = tpf;
917 + parm->parm.capture.readbuffers = 1;
919 + fps_param.num = 0; /* Select variable fps, and then use
920 + * FPS_RANGE to select the actual limits.
923 + set_framerate_params(dev);
928 static const struct v4l2_ioctl_ops camera0_ioctl_ops = {
930 .vidioc_enum_fmt_vid_overlay = vidioc_enum_fmt_vid_overlay,
931 @@ -1084,6 +1352,51 @@ static const struct v4l2_ioctl_ops camer
932 .vidioc_querybuf = vb2_ioctl_querybuf,
933 .vidioc_qbuf = vb2_ioctl_qbuf,
934 .vidioc_dqbuf = vb2_ioctl_dqbuf,
935 + .vidioc_enum_framesizes = vidioc_enum_framesizes,
936 + .vidioc_enum_frameintervals = vidioc_enum_frameintervals,
937 + .vidioc_g_parm = vidioc_g_parm,
938 + .vidioc_s_parm = vidioc_s_parm,
939 + .vidioc_streamon = vb2_ioctl_streamon,
940 + .vidioc_streamoff = vb2_ioctl_streamoff,
942 + .vidioc_log_status = v4l2_ctrl_log_status,
943 + .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
944 + .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
947 +static const struct v4l2_ioctl_ops camera0_ioctl_ops_gstreamer = {
949 + .vidioc_enum_fmt_vid_overlay = vidioc_enum_fmt_vid_overlay,
950 + .vidioc_g_fmt_vid_overlay = vidioc_g_fmt_vid_overlay,
951 + .vidioc_try_fmt_vid_overlay = vidioc_try_fmt_vid_overlay,
952 + .vidioc_s_fmt_vid_overlay = vidioc_s_fmt_vid_overlay,
953 + .vidioc_overlay = vidioc_overlay,
954 + .vidioc_g_fbuf = vidioc_g_fbuf,
957 + .vidioc_enum_input = vidioc_enum_input,
958 + .vidioc_g_input = vidioc_g_input,
959 + .vidioc_s_input = vidioc_s_input,
962 + .vidioc_querycap = vidioc_querycap,
963 + .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
964 + .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
965 + .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
966 + .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
968 + /* buffer management */
969 + .vidioc_reqbufs = vb2_ioctl_reqbufs,
970 + .vidioc_create_bufs = vb2_ioctl_create_bufs,
971 + .vidioc_prepare_buf = vb2_ioctl_prepare_buf,
972 + .vidioc_querybuf = vb2_ioctl_querybuf,
973 + .vidioc_qbuf = vb2_ioctl_qbuf,
974 + .vidioc_dqbuf = vb2_ioctl_dqbuf,
975 + /* Remove this function ptr to fix gstreamer bug
976 + .vidioc_enum_framesizes = vidioc_enum_framesizes, */
977 + .vidioc_enum_frameintervals = vidioc_enum_frameintervals,
978 + .vidioc_g_parm = vidioc_g_parm,
979 + .vidioc_s_parm = vidioc_s_parm,
980 .vidioc_streamon = vb2_ioctl_streamon,
981 .vidioc_streamoff = vb2_ioctl_streamoff,
983 @@ -1122,8 +1435,10 @@ static int set_camera_parameters(struct
984 .max_stills_h = MAX_HEIGHT,
986 .one_shot_stills = 1,
987 - .max_preview_video_w = 1920,
988 - .max_preview_video_h = 1088,
989 + .max_preview_video_w = (max_video_width > 1920) ?
990 + max_video_width : 1920,
991 + .max_preview_video_h = (max_video_height > 1088) ?
992 + max_video_height : 1088,
993 .num_preview_video_frames = 3,
994 .stills_capture_circular_buffer_height = 0,
995 .fast_preview_resume = 0,
996 @@ -1141,6 +1456,7 @@ static int __init mmal_init(struct bm283
999 struct mmal_es_format *format;
1000 + u32 bool_true = 1;
1002 ret = vchiq_mmal_init(&dev->instance);
1004 @@ -1176,8 +1492,8 @@ static int __init mmal_init(struct bm283
1005 format->es->video.crop.y = 0;
1006 format->es->video.crop.width = 1024;
1007 format->es->video.crop.height = 768;
1008 - format->es->video.frame_rate.num = PREVIEW_FRAME_RATE_NUM;
1009 - format->es->video.frame_rate.den = PREVIEW_FRAME_RATE_DEN;
1010 + format->es->video.frame_rate.num = 0; /* Rely on fps_range */
1011 + format->es->video.frame_rate.den = 1;
1014 &dev->component[MMAL_COMPONENT_CAMERA]->
1015 @@ -1192,8 +1508,14 @@ static int __init mmal_init(struct bm283
1016 format->es->video.crop.y = 0;
1017 format->es->video.crop.width = 1024;
1018 format->es->video.crop.height = 768;
1019 - format->es->video.frame_rate.num = PREVIEW_FRAME_RATE_NUM;
1020 - format->es->video.frame_rate.den = PREVIEW_FRAME_RATE_DEN;
1021 + format->es->video.frame_rate.num = 0; /* Rely on fps_range */
1022 + format->es->video.frame_rate.den = 1;
1024 + vchiq_mmal_port_parameter_set(dev->instance,
1025 + &dev->component[MMAL_COMPONENT_CAMERA]->
1026 + output[MMAL_CAMERA_PORT_VIDEO],
1027 + MMAL_PARAMETER_NO_IMAGE_PADDING,
1028 + &bool_true, sizeof(bool_true));
1031 &dev->component[MMAL_COMPONENT_CAMERA]->
1032 @@ -1207,13 +1529,22 @@ static int __init mmal_init(struct bm283
1033 format->es->video.crop.y = 0;
1034 format->es->video.crop.width = 2592;
1035 format->es->video.crop.height = 1944;
1036 - format->es->video.frame_rate.num = 30;
1037 + format->es->video.frame_rate.num = 0; /* Rely on fps_range */
1038 format->es->video.frame_rate.den = 1;
1040 dev->capture.width = format->es->video.width;
1041 dev->capture.height = format->es->video.height;
1042 dev->capture.fmt = &formats[0];
1043 dev->capture.encode_component = NULL;
1044 + dev->capture.timeperframe = tpf_default;
1045 + dev->capture.enc_profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH;
1046 + dev->capture.enc_level = V4L2_MPEG_VIDEO_H264_LEVEL_4_0;
1048 + vchiq_mmal_port_parameter_set(dev->instance,
1049 + &dev->component[MMAL_COMPONENT_CAMERA]->
1050 + output[MMAL_CAMERA_PORT_CAPTURE],
1051 + MMAL_PARAMETER_NO_IMAGE_PADDING,
1052 + &bool_true, sizeof(bool_true));
1054 /* get the preview component ready */
1055 ret = vchiq_mmal_component_init(
1056 @@ -1260,6 +1591,14 @@ static int __init mmal_init(struct bm283
1060 + struct vchiq_mmal_port *encoder_port =
1061 + &dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->output[0];
1062 + encoder_port->format.encoding = MMAL_ENCODING_H264;
1063 + ret = vchiq_mmal_port_set_format(dev->instance,
1068 unsigned int enable = 1;
1069 vchiq_mmal_port_parameter_set(
1071 @@ -1312,6 +1651,11 @@ static int __init bm2835_mmal_init_devic
1074 *vfd = vdev_template;
1075 + if (gst_v4l2src_is_broken) {
1076 + v4l2_info(&dev->v4l2_dev,
1077 + "Work-around for gstreamer issue is active.\n");
1078 + vfd->ioctl_ops = &camera0_ioctl_ops_gstreamer;
1081 vfd->v4l2_dev = &dev->v4l2_dev;
1083 @@ -1326,8 +1670,9 @@ static int __init bm2835_mmal_init_devic
1087 - v4l2_info(vfd->v4l2_dev, "V4L2 device registered as %s\n",
1088 - video_device_node_name(vfd));
1089 + v4l2_info(vfd->v4l2_dev,
1090 + "V4L2 device registered as %s - stills mode > %dx%d\n",
1091 + video_device_node_name(vfd), max_video_width, max_video_height);
1095 @@ -1335,9 +1680,9 @@ static int __init bm2835_mmal_init_devic
1096 static struct v4l2_format default_v4l2_format = {
1097 .fmt.pix.pixelformat = V4L2_PIX_FMT_JPEG,
1098 .fmt.pix.width = 1024,
1099 - .fmt.pix.bytesperline = 1024 * 3 / 2,
1100 + .fmt.pix.bytesperline = 1024,
1101 .fmt.pix.height = 768,
1102 - .fmt.pix.sizeimage = 1<<18,
1103 + .fmt.pix.sizeimage = 1024*768,
1106 static int __init bm2835_mmal_init(void)
1107 @@ -1400,6 +1745,9 @@ static int __init bm2835_mmal_init(void)
1111 + /* Really want to call vidioc_s_fmt_vid_cap with the default
1112 + * format, but currently the APIs don't join up.
1114 ret = mmal_setup_components(dev, &default_v4l2_format);
1116 v4l2_err(&dev->v4l2_dev,
1117 --- a/drivers/media/platform/bcm2835/bcm2835-camera.h
1118 +++ b/drivers/media/platform/bcm2835/bcm2835-camera.h
1120 * core driver device
1123 -#define V4L2_CTRL_COUNT 18 /* number of v4l controls */
1124 +#define V4L2_CTRL_COUNT 28 /* number of v4l controls */
1127 MMAL_COMPONENT_CAMERA = 0,
1128 @@ -32,9 +32,6 @@ enum {
1129 MMAL_CAMERA_PORT_COUNT
1132 -#define PREVIEW_FRAME_RATE_NUM 30
1133 -#define PREVIEW_FRAME_RATE_DEN 1
1135 #define PREVIEW_LAYER 2
1137 extern int bcm2835_v4l2_debug;
1138 @@ -48,9 +45,19 @@ struct bm2835_mmal_dev {
1140 struct v4l2_ctrl_handler ctrl_handler;
1141 struct v4l2_ctrl *ctrls[V4L2_CTRL_COUNT];
1142 + enum v4l2_scene_mode scene_mode;
1143 struct mmal_colourfx colourfx;
1148 + enum mmal_parameter_exposuremode exposure_mode_user;
1149 + enum v4l2_exposure_auto_type exposure_mode_v4l2_user;
1150 + /* active exposure mode may differ if selected via a scene mode */
1151 + enum mmal_parameter_exposuremode exposure_mode_active;
1152 + enum mmal_parameter_exposuremeteringmode metering_mode;
1153 + unsigned int manual_shutter_speed;
1154 + bool exp_auto_priority;
1156 /* allocated mmal instance and components */
1157 struct vchiq_mmal_instance *instance;
1158 @@ -63,12 +70,18 @@ struct bm2835_mmal_dev {
1159 unsigned int width; /* width */
1160 unsigned int height; /* height */
1161 unsigned int stride; /* stride */
1162 + unsigned int buffersize; /* buffer size with padding */
1163 struct mmal_fmt *fmt;
1164 + struct v4l2_fract timeperframe;
1166 /* H264 encode bitrate */
1168 /* H264 bitrate mode. CBR/VBR */
1169 int encode_bitrate_mode;
1170 + /* H264 profile */
1171 + enum v4l2_mpeg_video_h264_profile enc_profile;
1173 + enum v4l2_mpeg_video_h264_level enc_level;
1177 @@ -98,7 +111,7 @@ int bm2835_mmal_init_controls(
1178 struct v4l2_ctrl_handler *hdl);
1180 int bm2835_mmal_set_all_camera_controls(struct bm2835_mmal_dev *dev);
1182 +int set_framerate_params(struct bm2835_mmal_dev *dev);
1186 --- a/drivers/media/platform/bcm2835/controls.c
1187 +++ b/drivers/media/platform/bcm2835/controls.c
1189 #include "mmal-parameters.h"
1190 #include "bcm2835-camera.h"
1192 -/* The supported V4L2_CID_AUTO_EXPOSURE_BIAS values are from -24 to +24.
1193 - * These are in 1/6th increments so the effective range is -4.0EV to +4.0EV.
1194 +/* The supported V4L2_CID_AUTO_EXPOSURE_BIAS values are from -4.0 to +4.0.
1195 + * MMAL values are in 1/6th increments so the MMAL range is -24 to +24.
1196 + * V4L2 docs say value "is expressed in terms of EV, drivers should interpret
1197 + * the values as 0.001 EV units, where the value 1000 stands for +1 EV."
1198 + * V4L2 is limited to a max of 32 values in a menu, so count in 1/3rds from
1201 static const s64 ev_bias_qmenu[] = {
1202 - -24, -21, -18, -15, -12, -9, -6, -3, 0, 3, 6, 9, 12, 15, 18, 21, 24
1203 + -4000, -3667, -3333,
1204 + -3000, -2667, -2333,
1205 + -2000, -1667, -1333,
1206 + -1000, -667, -333,
1214 /* Supported ISO values
1215 @@ -44,13 +56,19 @@ static const s64 iso_qmenu[] = {
1216 0, 100, 200, 400, 800,
1219 +static const s64 mains_freq_qmenu[] = {
1220 + V4L2_CID_POWER_LINE_FREQUENCY_DISABLED,
1221 + V4L2_CID_POWER_LINE_FREQUENCY_50HZ,
1222 + V4L2_CID_POWER_LINE_FREQUENCY_60HZ,
1223 + V4L2_CID_POWER_LINE_FREQUENCY_AUTO
1226 /* Supported video encode modes */
1227 static const s64 bitrate_mode_qmenu[] = {
1228 (s64)V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
1229 (s64)V4L2_MPEG_VIDEO_BITRATE_MODE_CBR,
1233 enum bm2835_mmal_ctrl_type {
1234 MMAL_CONTROL_TYPE_STD,
1235 MMAL_CONTROL_TYPE_STD_MENU,
1236 @@ -77,6 +95,7 @@ struct bm2835_mmal_v4l2_ctrl {
1237 const s64 *imenu; /* integer menu array */
1238 u32 mmal_id; /* mmal parameter id */
1239 bm2835_mmal_v4l2_ctrl_cb *setter;
1240 + bool ignore_errors;
1243 struct v4l2_to_mmal_effects_setting {
1244 @@ -126,6 +145,25 @@ static const struct v4l2_to_mmal_effects
1245 1, 1, 0, 0, 0, {0, 0, 0, 0, 0} }
1248 +struct v4l2_mmal_scene_config {
1249 + enum v4l2_scene_mode v4l2_scene;
1250 + enum mmal_parameter_exposuremode exposure_mode;
1251 + enum mmal_parameter_exposuremeteringmode metering_mode;
1254 +static const struct v4l2_mmal_scene_config scene_configs[] = {
1255 + /* V4L2_SCENE_MODE_NONE automatically added */
1257 + V4L2_SCENE_MODE_NIGHT,
1258 + MMAL_PARAM_EXPOSUREMODE_NIGHT,
1259 + MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE
1262 + V4L2_SCENE_MODE_SPORTS,
1263 + MMAL_PARAM_EXPOSUREMODE_SPORTS,
1264 + MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE
1268 /* control handlers*/
1270 @@ -133,10 +171,7 @@ static int ctrl_set_rational(struct bm28
1271 struct v4l2_ctrl *ctrl,
1272 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
1275 - s32 num; /**< Numerator */
1276 - s32 den; /**< Denominator */
1278 + struct mmal_parameter_rational rational_value;
1279 struct vchiq_mmal_port *control;
1281 control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
1282 @@ -166,6 +201,41 @@ static int ctrl_set_value(struct bm2835_
1283 &u32_value, sizeof(u32_value));
1286 +static int ctrl_set_value_menu(struct bm2835_mmal_dev *dev,
1287 + struct v4l2_ctrl *ctrl,
1288 + const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
1291 + struct vchiq_mmal_port *control;
1293 + if (ctrl->val > mmal_ctrl->max || ctrl->val < mmal_ctrl->min)
1296 + control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
1298 + u32_value = mmal_ctrl->imenu[ctrl->val];
1300 + return vchiq_mmal_port_parameter_set(dev->instance, control,
1301 + mmal_ctrl->mmal_id,
1302 + &u32_value, sizeof(u32_value));
1305 +static int ctrl_set_value_ev(struct bm2835_mmal_dev *dev,
1306 + struct v4l2_ctrl *ctrl,
1307 + const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
1310 + struct vchiq_mmal_port *control;
1312 + control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
1314 + s32_value = (ctrl->val-12)*2; /* Convert from index to 1/6ths */
1316 + return vchiq_mmal_port_parameter_set(dev->instance, control,
1317 + mmal_ctrl->mmal_id,
1318 + &s32_value, sizeof(s32_value));
1321 static int ctrl_set_rotate(struct bm2835_mmal_dev *dev,
1322 struct v4l2_ctrl *ctrl,
1323 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
1324 @@ -245,37 +315,97 @@ static int ctrl_set_exposure(struct bm28
1325 struct v4l2_ctrl *ctrl,
1326 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
1329 + enum mmal_parameter_exposuremode exp_mode = dev->exposure_mode_user;
1330 + u32 shutter_speed = 0;
1331 struct vchiq_mmal_port *control;
1334 control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
1336 + if (mmal_ctrl->mmal_id == MMAL_PARAMETER_SHUTTER_SPEED) {
1337 + /* V4L2 is in 100usec increments.
1340 + dev->manual_shutter_speed = ctrl->val * 100;
1341 + } else if (mmal_ctrl->mmal_id == MMAL_PARAMETER_EXPOSURE_MODE) {
1342 + switch (ctrl->val) {
1343 + case V4L2_EXPOSURE_AUTO:
1344 + exp_mode = MMAL_PARAM_EXPOSUREMODE_AUTO;
1347 + case V4L2_EXPOSURE_MANUAL:
1348 + exp_mode = MMAL_PARAM_EXPOSUREMODE_OFF;
1351 + dev->exposure_mode_user = exp_mode;
1352 + dev->exposure_mode_v4l2_user = ctrl->val;
1353 + } else if (mmal_ctrl->id == V4L2_CID_EXPOSURE_AUTO_PRIORITY) {
1354 + dev->exp_auto_priority = ctrl->val;
1357 + if (dev->scene_mode == V4L2_SCENE_MODE_NONE) {
1358 + if (exp_mode == MMAL_PARAM_EXPOSUREMODE_OFF)
1359 + shutter_speed = dev->manual_shutter_speed;
1361 + ret = vchiq_mmal_port_parameter_set(dev->instance,
1363 + MMAL_PARAMETER_SHUTTER_SPEED,
1365 + sizeof(shutter_speed));
1366 + ret += vchiq_mmal_port_parameter_set(dev->instance,
1368 + MMAL_PARAMETER_EXPOSURE_MODE,
1371 + dev->exposure_mode_active = exp_mode;
1373 + /* exposure_dynamic_framerate (V4L2_CID_EXPOSURE_AUTO_PRIORITY) should
1374 + * always apply irrespective of scene mode.
1376 + ret += set_framerate_params(dev);
1381 +static int ctrl_set_metering_mode(struct bm2835_mmal_dev *dev,
1382 + struct v4l2_ctrl *ctrl,
1383 + const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
1385 switch (ctrl->val) {
1386 - case V4L2_EXPOSURE_AUTO:
1387 - u32_value = MMAL_PARAM_EXPOSUREMODE_AUTO;
1388 + case V4L2_EXPOSURE_METERING_AVERAGE:
1389 + dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE;
1392 - case V4L2_EXPOSURE_MANUAL:
1393 - u32_value = MMAL_PARAM_EXPOSUREMODE_OFF;
1394 + case V4L2_EXPOSURE_METERING_CENTER_WEIGHTED:
1395 + dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_BACKLIT;
1398 - case V4L2_EXPOSURE_SHUTTER_PRIORITY:
1399 - u32_value = MMAL_PARAM_EXPOSUREMODE_SPORTS;
1400 + case V4L2_EXPOSURE_METERING_SPOT:
1401 + dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_SPOT;
1404 - case V4L2_EXPOSURE_APERTURE_PRIORITY:
1405 - u32_value = MMAL_PARAM_EXPOSUREMODE_NIGHT;
1406 + /* todo matrix weighting not added to Linux API till 3.9
1407 + case V4L2_EXPOSURE_METERING_MATRIX:
1408 + dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_MATRIX;
1414 - /* todo: what about the other ten modes there are MMAL parameters for */
1415 - return vchiq_mmal_port_parameter_set(dev->instance, control,
1416 + if (dev->scene_mode == V4L2_SCENE_MODE_NONE) {
1417 + struct vchiq_mmal_port *control;
1418 + u32 u32_value = dev->metering_mode;
1420 + control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
1422 + return vchiq_mmal_port_parameter_set(dev->instance, control,
1424 &u32_value, sizeof(u32_value));
1429 -static int ctrl_set_metering_mode(struct bm2835_mmal_dev *dev,
1430 +static int ctrl_set_flicker_avoidance(struct bm2835_mmal_dev *dev,
1431 struct v4l2_ctrl *ctrl,
1432 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
1434 @@ -285,24 +415,18 @@ static int ctrl_set_metering_mode(struct
1435 control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
1437 switch (ctrl->val) {
1438 - case V4L2_EXPOSURE_METERING_AVERAGE:
1439 - u32_value = MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE;
1440 + case V4L2_CID_POWER_LINE_FREQUENCY_DISABLED:
1441 + u32_value = MMAL_PARAM_FLICKERAVOID_OFF;
1444 - case V4L2_EXPOSURE_METERING_CENTER_WEIGHTED:
1445 - u32_value = MMAL_PARAM_EXPOSUREMETERINGMODE_BACKLIT;
1446 + case V4L2_CID_POWER_LINE_FREQUENCY_50HZ:
1447 + u32_value = MMAL_PARAM_FLICKERAVOID_50HZ;
1450 - case V4L2_EXPOSURE_METERING_SPOT:
1451 - u32_value = MMAL_PARAM_EXPOSUREMETERINGMODE_SPOT;
1452 + case V4L2_CID_POWER_LINE_FREQUENCY_60HZ:
1453 + u32_value = MMAL_PARAM_FLICKERAVOID_60HZ;
1456 - /* todo matrix weighting not added to Linux API till 3.9
1457 - case V4L2_EXPOSURE_METERING_MATRIX:
1458 - u32_value = MMAL_PARAM_EXPOSUREMETERINGMODE_MATRIX;
1459 + case V4L2_CID_POWER_LINE_FREQUENCY_AUTO:
1460 + u32_value = MMAL_PARAM_FLICKERAVOID_AUTO;
1466 return vchiq_mmal_port_parameter_set(dev->instance, control,
1467 @@ -367,6 +491,29 @@ static int ctrl_set_awb_mode(struct bm28
1468 &u32_value, sizeof(u32_value));
1471 +static int ctrl_set_awb_gains(struct bm2835_mmal_dev *dev,
1472 + struct v4l2_ctrl *ctrl,
1473 + const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
1475 + struct vchiq_mmal_port *control;
1476 + struct mmal_parameter_awbgains gains;
1478 + control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
1480 + if (ctrl->id == V4L2_CID_RED_BALANCE)
1481 + dev->red_gain = ctrl->val;
1482 + else if (ctrl->id == V4L2_CID_BLUE_BALANCE)
1483 + dev->blue_gain = ctrl->val;
1485 + gains.r_gain.num = dev->red_gain;
1486 + gains.b_gain.num = dev->blue_gain;
1487 + gains.r_gain.den = gains.b_gain.den = 1000;
1489 + return vchiq_mmal_port_parameter_set(dev->instance, control,
1490 + mmal_ctrl->mmal_id,
1491 + &gains, sizeof(gains));
1494 static int ctrl_set_image_effect(struct bm2835_mmal_dev *dev,
1495 struct v4l2_ctrl *ctrl,
1496 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
1497 @@ -443,8 +590,8 @@ static int ctrl_set_colfx(struct bm2835_
1498 &dev->colourfx, sizeof(dev->colourfx));
1500 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
1501 - "After: mmal_ctrl:%p ctrl id:0x%x ctrl val:%d ret %d(%d)\n",
1502 - mmal_ctrl, ctrl->id, ctrl->val, ret,
1503 + "%s: After: mmal_ctrl:%p ctrl id:0x%x ctrl val:%d ret %d(%d)\n",
1504 + __func__, mmal_ctrl, ctrl->id, ctrl->val, ret,
1505 (ret == 0 ? 0 : -EINVAL));
1506 return (ret == 0 ? 0 : EINVAL);
1508 @@ -494,7 +641,7 @@ static int ctrl_set_bitrate_mode(struct
1512 -static int ctrl_set_q_factor(struct bm2835_mmal_dev *dev,
1513 +static int ctrl_set_image_encode_output(struct bm2835_mmal_dev *dev,
1514 struct v4l2_ctrl *ctrl,
1515 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
1517 @@ -510,12 +657,247 @@ static int ctrl_set_q_factor(struct bm28
1518 &u32_value, sizeof(u32_value));
1521 +static int ctrl_set_video_encode_param_output(struct bm2835_mmal_dev *dev,
1522 + struct v4l2_ctrl *ctrl,
1523 + const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
1526 + struct vchiq_mmal_port *vid_enc_ctl;
1528 + vid_enc_ctl = &dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->output[0];
1530 + u32_value = ctrl->val;
1532 + return vchiq_mmal_port_parameter_set(dev->instance, vid_enc_ctl,
1533 + mmal_ctrl->mmal_id,
1534 + &u32_value, sizeof(u32_value));
1537 +static int ctrl_set_video_encode_profile_level(struct bm2835_mmal_dev *dev,
1538 + struct v4l2_ctrl *ctrl,
1539 + const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
1541 + struct mmal_parameter_video_profile param;
1544 + if (ctrl->id == V4L2_CID_MPEG_VIDEO_H264_PROFILE) {
1545 + switch (ctrl->val) {
1546 + case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
1547 + case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE:
1548 + case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
1549 + case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
1550 + dev->capture.enc_profile = ctrl->val;
1556 + } else if (ctrl->id == V4L2_CID_MPEG_VIDEO_H264_LEVEL) {
1557 + switch (ctrl->val) {
1558 + case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
1559 + case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
1560 + case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
1561 + case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
1562 + case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
1563 + case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
1564 + case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
1565 + case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
1566 + case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
1567 + case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
1568 + case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
1569 + case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
1570 + dev->capture.enc_level = ctrl->val;
1579 + switch (dev->capture.enc_profile) {
1580 + case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
1581 + param.profile = MMAL_VIDEO_PROFILE_H264_BASELINE;
1583 + case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE:
1585 + MMAL_VIDEO_PROFILE_H264_CONSTRAINED_BASELINE;
1587 + case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
1588 + param.profile = MMAL_VIDEO_PROFILE_H264_MAIN;
1590 + case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
1591 + param.profile = MMAL_VIDEO_PROFILE_H264_HIGH;
1594 + /* Should never get here */
1598 + switch (dev->capture.enc_level) {
1599 + case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
1600 + param.level = MMAL_VIDEO_LEVEL_H264_1;
1602 + case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
1603 + param.level = MMAL_VIDEO_LEVEL_H264_1b;
1605 + case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
1606 + param.level = MMAL_VIDEO_LEVEL_H264_11;
1608 + case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
1609 + param.level = MMAL_VIDEO_LEVEL_H264_12;
1611 + case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
1612 + param.level = MMAL_VIDEO_LEVEL_H264_13;
1614 + case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
1615 + param.level = MMAL_VIDEO_LEVEL_H264_2;
1617 + case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
1618 + param.level = MMAL_VIDEO_LEVEL_H264_21;
1620 + case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
1621 + param.level = MMAL_VIDEO_LEVEL_H264_22;
1623 + case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
1624 + param.level = MMAL_VIDEO_LEVEL_H264_3;
1626 + case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
1627 + param.level = MMAL_VIDEO_LEVEL_H264_31;
1629 + case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
1630 + param.level = MMAL_VIDEO_LEVEL_H264_32;
1632 + case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
1633 + param.level = MMAL_VIDEO_LEVEL_H264_4;
1636 + /* Should never get here */
1640 + ret = vchiq_mmal_port_parameter_set(dev->instance,
1641 + &dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->output[0],
1642 + mmal_ctrl->mmal_id,
1643 + ¶m, sizeof(param));
1648 +static int ctrl_set_scene_mode(struct bm2835_mmal_dev *dev,
1649 + struct v4l2_ctrl *ctrl,
1650 + const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
1653 + int shutter_speed;
1654 + struct vchiq_mmal_port *control;
1656 + v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev,
1657 + "scene mode selected %d, was %d\n", ctrl->val,
1659 + control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
1661 + if (ctrl->val == dev->scene_mode)
1664 + if (ctrl->val == V4L2_SCENE_MODE_NONE) {
1665 + /* Restore all user selections */
1666 + dev->scene_mode = V4L2_SCENE_MODE_NONE;
1668 + if (dev->exposure_mode_user == MMAL_PARAM_EXPOSUREMODE_OFF)
1669 + shutter_speed = dev->manual_shutter_speed;
1671 + shutter_speed = 0;
1673 + v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev,
1674 + "%s: scene mode none: shut_speed %d, exp_mode %d, metering %d\n",
1675 + __func__, shutter_speed, dev->exposure_mode_user,
1676 + dev->metering_mode);
1677 + ret = vchiq_mmal_port_parameter_set(dev->instance,
1679 + MMAL_PARAMETER_SHUTTER_SPEED,
1681 + sizeof(shutter_speed));
1682 + ret += vchiq_mmal_port_parameter_set(dev->instance,
1684 + MMAL_PARAMETER_EXPOSURE_MODE,
1685 + &dev->exposure_mode_user,
1687 + dev->exposure_mode_active = dev->exposure_mode_user;
1688 + ret += vchiq_mmal_port_parameter_set(dev->instance,
1690 + MMAL_PARAMETER_EXP_METERING_MODE,
1691 + &dev->metering_mode,
1693 + ret += set_framerate_params(dev);
1695 + /* Set up scene mode */
1697 + const struct v4l2_mmal_scene_config *scene = NULL;
1698 + int shutter_speed;
1699 + enum mmal_parameter_exposuremode exposure_mode;
1700 + enum mmal_parameter_exposuremeteringmode metering_mode;
1702 + for (i = 0; i < ARRAY_SIZE(scene_configs); i++) {
1703 + if (scene_configs[i].v4l2_scene ==
1705 + scene = &scene_configs[i];
1709 + if (i >= ARRAY_SIZE(scene_configs))
1712 + /* Set all the values */
1713 + dev->scene_mode = ctrl->val;
1715 + if (scene->exposure_mode == MMAL_PARAM_EXPOSUREMODE_OFF)
1716 + shutter_speed = dev->manual_shutter_speed;
1718 + shutter_speed = 0;
1719 + exposure_mode = scene->exposure_mode;
1720 + metering_mode = scene->metering_mode;
1722 + v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
1723 + "%s: scene mode none: shut_speed %d, exp_mode %d, metering %d\n",
1724 + __func__, shutter_speed, exposure_mode, metering_mode);
1726 + ret = vchiq_mmal_port_parameter_set(dev->instance, control,
1727 + MMAL_PARAMETER_SHUTTER_SPEED,
1729 + sizeof(shutter_speed));
1730 + ret += vchiq_mmal_port_parameter_set(dev->instance,
1732 + MMAL_PARAMETER_EXPOSURE_MODE,
1735 + dev->exposure_mode_active = exposure_mode;
1736 + ret += vchiq_mmal_port_parameter_set(dev->instance, control,
1737 + MMAL_PARAMETER_EXPOSURE_MODE,
1740 + ret += vchiq_mmal_port_parameter_set(dev->instance, control,
1741 + MMAL_PARAMETER_EXP_METERING_MODE,
1744 + ret += set_framerate_params(dev);
1747 + v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
1748 + "%s: Setting scene to %d, ret=%d\n",
1749 + __func__, ctrl->val, ret);
1755 static int bm2835_mmal_s_ctrl(struct v4l2_ctrl *ctrl)
1757 struct bm2835_mmal_dev *dev =
1758 container_of(ctrl->handler, struct bm2835_mmal_dev,
1760 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl = ctrl->priv;
1763 if ((mmal_ctrl == NULL) ||
1764 (mmal_ctrl->id != ctrl->id) ||
1765 @@ -524,7 +906,13 @@ static int bm2835_mmal_s_ctrl(struct v4l
1769 - return mmal_ctrl->setter(dev, ctrl, mmal_ctrl);
1770 + ret = mmal_ctrl->setter(dev, ctrl, mmal_ctrl);
1772 + pr_warn("ctrl id:%d/MMAL param %08X- returned ret %d\n",
1773 + ctrl->id, mmal_ctrl->mmal_id, ret);
1774 + if (mmal_ctrl->ignore_errors)
1779 static const struct v4l2_ctrl_ops bm2835_mmal_ctrl_ops = {
1780 @@ -537,40 +925,54 @@ static const struct bm2835_mmal_v4l2_ctr
1782 V4L2_CID_SATURATION, MMAL_CONTROL_TYPE_STD,
1783 -100, 100, 0, 1, NULL,
1784 - MMAL_PARAMETER_SATURATION, &ctrl_set_rational
1785 + MMAL_PARAMETER_SATURATION,
1786 + &ctrl_set_rational,
1790 V4L2_CID_SHARPNESS, MMAL_CONTROL_TYPE_STD,
1791 -100, 100, 0, 1, NULL,
1792 - MMAL_PARAMETER_SHARPNESS, &ctrl_set_rational
1793 + MMAL_PARAMETER_SHARPNESS,
1794 + &ctrl_set_rational,
1798 V4L2_CID_CONTRAST, MMAL_CONTROL_TYPE_STD,
1799 -100, 100, 0, 1, NULL,
1800 - MMAL_PARAMETER_CONTRAST, &ctrl_set_rational
1801 + MMAL_PARAMETER_CONTRAST,
1802 + &ctrl_set_rational,
1806 V4L2_CID_BRIGHTNESS, MMAL_CONTROL_TYPE_STD,
1807 0, 100, 50, 1, NULL,
1808 - MMAL_PARAMETER_BRIGHTNESS, &ctrl_set_rational
1809 + MMAL_PARAMETER_BRIGHTNESS,
1810 + &ctrl_set_rational,
1814 V4L2_CID_ISO_SENSITIVITY, MMAL_CONTROL_TYPE_INT_MENU,
1815 0, ARRAY_SIZE(iso_qmenu) - 1, 0, 1, iso_qmenu,
1816 - MMAL_PARAMETER_ISO, &ctrl_set_value
1817 + MMAL_PARAMETER_ISO,
1818 + &ctrl_set_value_menu,
1822 V4L2_CID_IMAGE_STABILIZATION, MMAL_CONTROL_TYPE_STD,
1824 - MMAL_PARAMETER_VIDEO_STABILISATION, &ctrl_set_value
1825 + MMAL_PARAMETER_VIDEO_STABILISATION,
1830 0, MMAL_CONTROL_TYPE_CLUSTER, 3, 1, 0, NULL, 0, NULL
1835 V4L2_CID_EXPOSURE_AUTO, MMAL_CONTROL_TYPE_STD_MENU,
1836 ~0x03, 3, V4L2_EXPOSURE_AUTO, 0, NULL,
1837 - MMAL_PARAMETER_EXPOSURE_MODE, &ctrl_set_exposure
1838 + MMAL_PARAMETER_EXPOSURE_MODE,
1839 + &ctrl_set_exposure,
1842 /* todo this needs mixing in with set exposure
1844 @@ -578,83 +980,258 @@ static const struct bm2835_mmal_v4l2_ctr
1848 + V4L2_CID_EXPOSURE_ABSOLUTE, MMAL_CONTROL_TYPE_STD,
1849 + /* Units of 100usecs */
1850 + 1, 1*1000*10, 100*10, 1, NULL,
1851 + MMAL_PARAMETER_SHUTTER_SPEED,
1852 + &ctrl_set_exposure,
1856 V4L2_CID_AUTO_EXPOSURE_BIAS, MMAL_CONTROL_TYPE_INT_MENU,
1857 0, ARRAY_SIZE(ev_bias_qmenu) - 1,
1858 (ARRAY_SIZE(ev_bias_qmenu)+1)/2 - 1, 0, ev_bias_qmenu,
1859 - MMAL_PARAMETER_EXPOSURE_COMP, &ctrl_set_value
1860 + MMAL_PARAMETER_EXPOSURE_COMP,
1861 + &ctrl_set_value_ev,
1865 + V4L2_CID_EXPOSURE_AUTO_PRIORITY, MMAL_CONTROL_TYPE_STD,
1868 + 0, /* Dummy MMAL ID as it gets mapped into FPS range*/
1869 + &ctrl_set_exposure,
1873 V4L2_CID_EXPOSURE_METERING,
1874 MMAL_CONTROL_TYPE_STD_MENU,
1875 ~0x7, 2, V4L2_EXPOSURE_METERING_AVERAGE, 0, NULL,
1876 - MMAL_PARAMETER_EXP_METERING_MODE, &ctrl_set_metering_mode
1877 + MMAL_PARAMETER_EXP_METERING_MODE,
1878 + &ctrl_set_metering_mode,
1882 V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE,
1883 MMAL_CONTROL_TYPE_STD_MENU,
1884 - ~0x3fe, 9, V4L2_WHITE_BALANCE_AUTO, 0, NULL,
1885 - MMAL_PARAMETER_AWB_MODE, &ctrl_set_awb_mode
1886 + ~0x3ff, 9, V4L2_WHITE_BALANCE_AUTO, 0, NULL,
1887 + MMAL_PARAMETER_AWB_MODE,
1888 + &ctrl_set_awb_mode,
1892 + V4L2_CID_RED_BALANCE, MMAL_CONTROL_TYPE_STD,
1893 + 1, 7999, 1000, 1, NULL,
1894 + MMAL_PARAMETER_CUSTOM_AWB_GAINS,
1895 + &ctrl_set_awb_gains,
1899 + V4L2_CID_BLUE_BALANCE, MMAL_CONTROL_TYPE_STD,
1900 + 1, 7999, 1000, 1, NULL,
1901 + MMAL_PARAMETER_CUSTOM_AWB_GAINS,
1902 + &ctrl_set_awb_gains,
1906 V4L2_CID_COLORFX, MMAL_CONTROL_TYPE_STD_MENU,
1907 0, 15, V4L2_COLORFX_NONE, 0, NULL,
1908 - MMAL_PARAMETER_IMAGE_EFFECT, &ctrl_set_image_effect
1909 + MMAL_PARAMETER_IMAGE_EFFECT,
1910 + &ctrl_set_image_effect,
1914 V4L2_CID_COLORFX_CBCR, MMAL_CONTROL_TYPE_STD,
1915 0, 0xffff, 0x8080, 1, NULL,
1916 - MMAL_PARAMETER_COLOUR_EFFECT, &ctrl_set_colfx
1917 + MMAL_PARAMETER_COLOUR_EFFECT,
1922 V4L2_CID_ROTATE, MMAL_CONTROL_TYPE_STD,
1923 0, 360, 0, 90, NULL,
1924 - MMAL_PARAMETER_ROTATION, &ctrl_set_rotate
1925 + MMAL_PARAMETER_ROTATION,
1930 V4L2_CID_HFLIP, MMAL_CONTROL_TYPE_STD,
1932 - MMAL_PARAMETER_MIRROR, &ctrl_set_flip
1933 + MMAL_PARAMETER_MIRROR,
1938 V4L2_CID_VFLIP, MMAL_CONTROL_TYPE_STD,
1940 - MMAL_PARAMETER_MIRROR, &ctrl_set_flip
1941 + MMAL_PARAMETER_MIRROR,
1946 V4L2_CID_MPEG_VIDEO_BITRATE_MODE, MMAL_CONTROL_TYPE_STD_MENU,
1947 0, ARRAY_SIZE(bitrate_mode_qmenu) - 1,
1948 0, 0, bitrate_mode_qmenu,
1949 - MMAL_PARAMETER_RATECONTROL, &ctrl_set_bitrate_mode
1950 + MMAL_PARAMETER_RATECONTROL,
1951 + &ctrl_set_bitrate_mode,
1955 V4L2_CID_MPEG_VIDEO_BITRATE, MMAL_CONTROL_TYPE_STD,
1956 25*1000, 25*1000*1000, 10*1000*1000, 25*1000, NULL,
1957 - MMAL_PARAMETER_VIDEO_BIT_RATE, &ctrl_set_bitrate
1958 + MMAL_PARAMETER_VIDEO_BIT_RATE,
1959 + &ctrl_set_bitrate,
1963 V4L2_CID_JPEG_COMPRESSION_QUALITY, MMAL_CONTROL_TYPE_STD,
1967 - MMAL_PARAMETER_JPEG_Q_FACTOR, &ctrl_set_q_factor
1968 + MMAL_PARAMETER_JPEG_Q_FACTOR,
1969 + &ctrl_set_image_encode_output,
1973 + V4L2_CID_POWER_LINE_FREQUENCY, MMAL_CONTROL_TYPE_STD_MENU,
1974 + 0, ARRAY_SIZE(mains_freq_qmenu) - 1,
1976 + MMAL_PARAMETER_FLICKER_AVOID,
1977 + &ctrl_set_flicker_avoidance,
1981 + V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER, MMAL_CONTROL_TYPE_STD,
1984 + MMAL_PARAMETER_VIDEO_ENCODE_INLINE_HEADER,
1985 + &ctrl_set_video_encode_param_output,
1986 + true /* Errors ignored as requires latest firmware to work */
1989 + V4L2_CID_MPEG_VIDEO_H264_PROFILE,
1990 + MMAL_CONTROL_TYPE_STD_MENU,
1991 + ~((1<<V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) |
1992 + (1<<V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) |
1993 + (1<<V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) |
1994 + (1<<V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)),
1995 + V4L2_MPEG_VIDEO_H264_PROFILE_HIGH,
1996 + V4L2_MPEG_VIDEO_H264_PROFILE_HIGH, 1, NULL,
1997 + MMAL_PARAMETER_PROFILE,
1998 + &ctrl_set_video_encode_profile_level,
2002 + V4L2_CID_MPEG_VIDEO_H264_LEVEL, MMAL_CONTROL_TYPE_STD_MENU,
2003 + ~((1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_0) |
2004 + (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1B) |
2005 + (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_1) |
2006 + (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_2) |
2007 + (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_3) |
2008 + (1<<V4L2_MPEG_VIDEO_H264_LEVEL_2_0) |
2009 + (1<<V4L2_MPEG_VIDEO_H264_LEVEL_2_1) |
2010 + (1<<V4L2_MPEG_VIDEO_H264_LEVEL_2_2) |
2011 + (1<<V4L2_MPEG_VIDEO_H264_LEVEL_3_0) |
2012 + (1<<V4L2_MPEG_VIDEO_H264_LEVEL_3_1) |
2013 + (1<<V4L2_MPEG_VIDEO_H264_LEVEL_3_2) |
2014 + (1<<V4L2_MPEG_VIDEO_H264_LEVEL_4_0)),
2015 + V4L2_MPEG_VIDEO_H264_LEVEL_4_0,
2016 + V4L2_MPEG_VIDEO_H264_LEVEL_4_0, 1, NULL,
2017 + MMAL_PARAMETER_PROFILE,
2018 + &ctrl_set_video_encode_profile_level,
2022 + V4L2_CID_SCENE_MODE, MMAL_CONTROL_TYPE_STD_MENU,
2023 + -1, /* Min is computed at runtime */
2024 + V4L2_SCENE_MODE_TEXT,
2025 + V4L2_SCENE_MODE_NONE, 1, NULL,
2026 + MMAL_PARAMETER_PROFILE,
2027 + &ctrl_set_scene_mode,
2031 + V4L2_CID_MPEG_VIDEO_H264_I_PERIOD, MMAL_CONTROL_TYPE_STD,
2032 + 0, 0x7FFFFFFF, 60, 1, NULL,
2033 + MMAL_PARAMETER_INTRAPERIOD,
2034 + &ctrl_set_video_encode_param_output,
2039 int bm2835_mmal_set_all_camera_controls(struct bm2835_mmal_dev *dev)
2045 for (c = 0; c < V4L2_CTRL_COUNT; c++) {
2046 if ((dev->ctrls[c]) && (v4l2_ctrls[c].setter)) {
2047 ret = v4l2_ctrls[c].setter(dev, dev->ctrls[c],
2050 + if (!v4l2_ctrls[c].ignore_errors && ret) {
2051 + v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
2052 + "Failed when setting default values for ctrl %d\n",
2061 +int set_framerate_params(struct bm2835_mmal_dev *dev)
2063 + struct mmal_parameter_fps_range fps_range;
2066 + if ((dev->exposure_mode_active != MMAL_PARAM_EXPOSUREMODE_OFF) &&
2067 + (dev->exp_auto_priority)) {
2068 + /* Variable FPS. Define min FPS as 1fps.
2069 + * Max as max defined FPS.
2071 + fps_range.fps_low.num = 1;
2072 + fps_range.fps_low.den = 1;
2073 + fps_range.fps_high.num = dev->capture.timeperframe.denominator;
2074 + fps_range.fps_high.den = dev->capture.timeperframe.numerator;
2076 + /* Fixed FPS - set min and max to be the same */
2077 + fps_range.fps_low.num = fps_range.fps_high.num =
2078 + dev->capture.timeperframe.denominator;
2079 + fps_range.fps_low.den = fps_range.fps_high.den =
2080 + dev->capture.timeperframe.numerator;
2083 + v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
2084 + "Set fps range to %d/%d to %d/%d\n",
2085 + fps_range.fps_low.num,
2086 + fps_range.fps_low.den,
2087 + fps_range.fps_high.num,
2088 + fps_range.fps_high.den
2091 + ret = vchiq_mmal_port_parameter_set(dev->instance,
2092 + &dev->component[MMAL_COMPONENT_CAMERA]->
2093 + output[MMAL_CAMERA_PORT_PREVIEW],
2094 + MMAL_PARAMETER_FPS_RANGE,
2095 + &fps_range, sizeof(fps_range));
2096 + ret += vchiq_mmal_port_parameter_set(dev->instance,
2097 + &dev->component[MMAL_COMPONENT_CAMERA]->
2098 + output[MMAL_CAMERA_PORT_VIDEO],
2099 + MMAL_PARAMETER_FPS_RANGE,
2100 + &fps_range, sizeof(fps_range));
2101 + ret += vchiq_mmal_port_parameter_set(dev->instance,
2102 + &dev->component[MMAL_COMPONENT_CAMERA]->
2103 + output[MMAL_CAMERA_PORT_CAPTURE],
2104 + MMAL_PARAMETER_FPS_RANGE,
2105 + &fps_range, sizeof(fps_range));
2107 + v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev,
2108 + "Failed to set fps ret %d\n",
2115 int bm2835_mmal_init_controls(struct bm2835_mmal_dev *dev,
2116 struct v4l2_ctrl_handler *hdl)
2118 @@ -674,10 +1251,30 @@ int bm2835_mmal_init_controls(struct bm2
2121 case MMAL_CONTROL_TYPE_STD_MENU:
2123 + int mask = ctrl->min;
2125 + if (ctrl->id == V4L2_CID_SCENE_MODE) {
2126 + /* Special handling to work out the mask
2127 + * value based on the scene_configs array
2128 + * at runtime. Reduces the chance of
2132 + mask = 1<<V4L2_SCENE_MODE_NONE;
2134 + i < ARRAY_SIZE(scene_configs);
2136 + mask |= 1<<scene_configs[i].v4l2_scene;
2141 dev->ctrls[c] = v4l2_ctrl_new_std_menu(hdl,
2142 &bm2835_mmal_ctrl_ops, ctrl->id,
2143 - ctrl->max, ctrl->min, ctrl->def);
2144 + ctrl->max, mask, ctrl->def);
2148 case MMAL_CONTROL_TYPE_INT_MENU:
2149 dev->ctrls[c] = v4l2_ctrl_new_int_menu(hdl,
2150 --- a/drivers/media/platform/bcm2835/mmal-common.h
2151 +++ b/drivers/media/platform/bcm2835/mmal-common.h
2155 u32 fourcc; /* v4l2 format id */
2156 + int flags; /* v4l2 flags field */
2159 u32 mmal_component; /* MMAL component index to be used to encode */
2160 --- a/drivers/media/platform/bcm2835/mmal-encodings.h
2161 +++ b/drivers/media/platform/bcm2835/mmal-encodings.h
2163 * Simon Mellor <simellor@broadcom.com>
2164 * Luke Diamand <luked@broadcom.com>
2166 +#ifndef MMAL_ENCODINGS_H
2167 +#define MMAL_ENCODINGS_H
2169 #define MMAL_ENCODING_H264 MMAL_FOURCC('H', '2', '6', '4')
2170 #define MMAL_ENCODING_H263 MMAL_FOURCC('H', '2', '6', '3')
2172 #define MMAL_ENCODING_VP6 MMAL_FOURCC('V', 'P', '6', ' ')
2173 #define MMAL_ENCODING_THEORA MMAL_FOURCC('T', 'H', 'E', 'O')
2174 #define MMAL_ENCODING_SPARK MMAL_FOURCC('S', 'P', 'R', 'K')
2175 +#define MMAL_ENCODING_MJPEG MMAL_FOURCC('M', 'J', 'P', 'G')
2177 #define MMAL_ENCODING_JPEG MMAL_FOURCC('J', 'P', 'E', 'G')
2178 #define MMAL_ENCODING_GIF MMAL_FOURCC('G', 'I', 'F', ' ')
2180 #define MMAL_ENCODING_VARIANT_H264_AVC1 MMAL_FOURCC('A', 'V', 'C', '1')
2181 /** Implicitly delineated NAL units without emulation prevention */
2182 #define MMAL_ENCODING_VARIANT_H264_RAW MMAL_FOURCC('R', 'A', 'W', ' ')
2185 +/** \defgroup MmalColorSpace List of pre-defined video color spaces
2186 + * This defines a list of common color spaces. This list isn't exhaustive and
2187 + * is only provided as a convenience to avoid clients having to use FourCC
2188 + * codes directly. However components are allowed to define and use their own
2193 +/** Unknown color space */
2194 +#define MMAL_COLOR_SPACE_UNKNOWN 0
2195 +/** ITU-R BT.601-5 [SDTV] */
2196 +#define MMAL_COLOR_SPACE_ITUR_BT601 MMAL_FOURCC('Y', '6', '0', '1')
2197 +/** ITU-R BT.709-3 [HDTV] */
2198 +#define MMAL_COLOR_SPACE_ITUR_BT709 MMAL_FOURCC('Y', '7', '0', '9')
2200 +#define MMAL_COLOR_SPACE_JPEG_JFIF MMAL_FOURCC('Y', 'J', 'F', 'I')
2201 +/** Title 47 Code of Federal Regulations (2003) 73.682 (a) (20) */
2202 +#define MMAL_COLOR_SPACE_FCC MMAL_FOURCC('Y', 'F', 'C', 'C')
2203 +/** Society of Motion Picture and Television Engineers 240M (1999) */
2204 +#define MMAL_COLOR_SPACE_SMPTE240M MMAL_FOURCC('Y', '2', '4', '0')
2205 +/** ITU-R BT.470-2 System M */
2206 +#define MMAL_COLOR_SPACE_BT470_2_M MMAL_FOURCC('Y', '_', '_', 'M')
2207 +/** ITU-R BT.470-2 System BG */
2208 +#define MMAL_COLOR_SPACE_BT470_2_BG MMAL_FOURCC('Y', '_', 'B', 'G')
2209 +/** JPEG JFIF, but with 16..255 luma */
2210 +#define MMAL_COLOR_SPACE_JFIF_Y16_255 MMAL_FOURCC('Y', 'Y', '1', '6')
2211 +/* @} MmalColorSpace List */
2213 +#endif /* MMAL_ENCODINGS_H */
2214 --- a/drivers/media/platform/bcm2835/mmal-parameters.h
2215 +++ b/drivers/media/platform/bcm2835/mmal-parameters.h
2216 @@ -57,7 +57,8 @@ enum mmal_parameter_common_type {
2217 MMAL_PARAMETER_SEEK, /**< MMAL_PARAMETER_SEEK_T */
2218 MMAL_PARAMETER_POWERMON_ENABLE, /**< MMAL_PARAMETER_BOOLEAN_T */
2219 MMAL_PARAMETER_LOGGING, /**< MMAL_PARAMETER_LOGGING_T */
2220 - MMAL_PARAMETER_SYSTEM_TIME /**< MMAL_PARAMETER_UINT64_T */
2221 + MMAL_PARAMETER_SYSTEM_TIME, /**< MMAL_PARAMETER_UINT64_T */
2222 + MMAL_PARAMETER_NO_IMAGE_PADDING /**< MMAL_PARAMETER_BOOLEAN_T */
2225 /* camera parameters */
2226 @@ -161,6 +162,13 @@ enum mmal_parameter_camera_type {
2227 MMAL_PARAMETER_SW_SHARPEN_DISABLE, /**< @ref MMAL_PARAMETER_BOOLEAN_T */
2228 MMAL_PARAMETER_FLASH_REQUIRED, /**< @ref MMAL_PARAMETER_BOOLEAN_T */
2229 MMAL_PARAMETER_SW_SATURATION_DISABLE, /**< @ref MMAL_PARAMETER_BOOLEAN_T */
2230 + MMAL_PARAMETER_SHUTTER_SPEED, /**< Takes a @ref MMAL_PARAMETER_UINT32_T */
2231 + MMAL_PARAMETER_CUSTOM_AWB_GAINS, /**< Takes a @ref MMAL_PARAMETER_AWB_GAINS_T */
2234 +struct mmal_parameter_rational {
2235 + s32 num; /**< Numerator */
2236 + s32 den; /**< Denominator */
2239 enum mmal_parameter_camera_config_timestamp_mode {
2240 @@ -176,6 +184,14 @@ enum mmal_parameter_camera_config_timest
2244 +struct mmal_parameter_fps_range {
2245 + /**< Low end of the permitted framerate range */
2246 + struct mmal_parameter_rational fps_low;
2247 + /**< High end of the permitted framerate range */
2248 + struct mmal_parameter_rational fps_high;
2252 /* camera configuration parameter */
2253 struct mmal_parameter_camera_config {
2254 /* Parameters for setting up the image pools */
2255 @@ -270,6 +286,19 @@ enum mmal_parameter_imagefx {
2256 MMAL_PARAM_IMAGEFX_CARTOON,
2259 +enum MMAL_PARAM_FLICKERAVOID_T {
2260 + MMAL_PARAM_FLICKERAVOID_OFF,
2261 + MMAL_PARAM_FLICKERAVOID_AUTO,
2262 + MMAL_PARAM_FLICKERAVOID_50HZ,
2263 + MMAL_PARAM_FLICKERAVOID_60HZ,
2264 + MMAL_PARAM_FLICKERAVOID_MAX = 0x7FFFFFFF
2267 +struct mmal_parameter_awbgains {
2268 + struct mmal_parameter_rational r_gain; /**< Red gain */
2269 + struct mmal_parameter_rational b_gain; /**< Blue gain */
2272 /** Manner of video rate control */
2273 enum mmal_parameter_rate_control_mode {
2274 MMAL_VIDEO_RATECONTROL_DEFAULT,
2275 @@ -279,6 +308,85 @@ enum mmal_parameter_rate_control_mode {
2276 MMAL_VIDEO_RATECONTROL_CONSTANT_SKIP_FRAMES
2279 +enum mmal_video_profile {
2280 + MMAL_VIDEO_PROFILE_H263_BASELINE,
2281 + MMAL_VIDEO_PROFILE_H263_H320CODING,
2282 + MMAL_VIDEO_PROFILE_H263_BACKWARDCOMPATIBLE,
2283 + MMAL_VIDEO_PROFILE_H263_ISWV2,
2284 + MMAL_VIDEO_PROFILE_H263_ISWV3,
2285 + MMAL_VIDEO_PROFILE_H263_HIGHCOMPRESSION,
2286 + MMAL_VIDEO_PROFILE_H263_INTERNET,
2287 + MMAL_VIDEO_PROFILE_H263_INTERLACE,
2288 + MMAL_VIDEO_PROFILE_H263_HIGHLATENCY,
2289 + MMAL_VIDEO_PROFILE_MP4V_SIMPLE,
2290 + MMAL_VIDEO_PROFILE_MP4V_SIMPLESCALABLE,
2291 + MMAL_VIDEO_PROFILE_MP4V_CORE,
2292 + MMAL_VIDEO_PROFILE_MP4V_MAIN,
2293 + MMAL_VIDEO_PROFILE_MP4V_NBIT,
2294 + MMAL_VIDEO_PROFILE_MP4V_SCALABLETEXTURE,
2295 + MMAL_VIDEO_PROFILE_MP4V_SIMPLEFACE,
2296 + MMAL_VIDEO_PROFILE_MP4V_SIMPLEFBA,
2297 + MMAL_VIDEO_PROFILE_MP4V_BASICANIMATED,
2298 + MMAL_VIDEO_PROFILE_MP4V_HYBRID,
2299 + MMAL_VIDEO_PROFILE_MP4V_ADVANCEDREALTIME,
2300 + MMAL_VIDEO_PROFILE_MP4V_CORESCALABLE,
2301 + MMAL_VIDEO_PROFILE_MP4V_ADVANCEDCODING,
2302 + MMAL_VIDEO_PROFILE_MP4V_ADVANCEDCORE,
2303 + MMAL_VIDEO_PROFILE_MP4V_ADVANCEDSCALABLE,
2304 + MMAL_VIDEO_PROFILE_MP4V_ADVANCEDSIMPLE,
2305 + MMAL_VIDEO_PROFILE_H264_BASELINE,
2306 + MMAL_VIDEO_PROFILE_H264_MAIN,
2307 + MMAL_VIDEO_PROFILE_H264_EXTENDED,
2308 + MMAL_VIDEO_PROFILE_H264_HIGH,
2309 + MMAL_VIDEO_PROFILE_H264_HIGH10,
2310 + MMAL_VIDEO_PROFILE_H264_HIGH422,
2311 + MMAL_VIDEO_PROFILE_H264_HIGH444,
2312 + MMAL_VIDEO_PROFILE_H264_CONSTRAINED_BASELINE,
2313 + MMAL_VIDEO_PROFILE_DUMMY = 0x7FFFFFFF
2316 +enum mmal_video_level {
2317 + MMAL_VIDEO_LEVEL_H263_10,
2318 + MMAL_VIDEO_LEVEL_H263_20,
2319 + MMAL_VIDEO_LEVEL_H263_30,
2320 + MMAL_VIDEO_LEVEL_H263_40,
2321 + MMAL_VIDEO_LEVEL_H263_45,
2322 + MMAL_VIDEO_LEVEL_H263_50,
2323 + MMAL_VIDEO_LEVEL_H263_60,
2324 + MMAL_VIDEO_LEVEL_H263_70,
2325 + MMAL_VIDEO_LEVEL_MP4V_0,
2326 + MMAL_VIDEO_LEVEL_MP4V_0b,
2327 + MMAL_VIDEO_LEVEL_MP4V_1,
2328 + MMAL_VIDEO_LEVEL_MP4V_2,
2329 + MMAL_VIDEO_LEVEL_MP4V_3,
2330 + MMAL_VIDEO_LEVEL_MP4V_4,
2331 + MMAL_VIDEO_LEVEL_MP4V_4a,
2332 + MMAL_VIDEO_LEVEL_MP4V_5,
2333 + MMAL_VIDEO_LEVEL_MP4V_6,
2334 + MMAL_VIDEO_LEVEL_H264_1,
2335 + MMAL_VIDEO_LEVEL_H264_1b,
2336 + MMAL_VIDEO_LEVEL_H264_11,
2337 + MMAL_VIDEO_LEVEL_H264_12,
2338 + MMAL_VIDEO_LEVEL_H264_13,
2339 + MMAL_VIDEO_LEVEL_H264_2,
2340 + MMAL_VIDEO_LEVEL_H264_21,
2341 + MMAL_VIDEO_LEVEL_H264_22,
2342 + MMAL_VIDEO_LEVEL_H264_3,
2343 + MMAL_VIDEO_LEVEL_H264_31,
2344 + MMAL_VIDEO_LEVEL_H264_32,
2345 + MMAL_VIDEO_LEVEL_H264_4,
2346 + MMAL_VIDEO_LEVEL_H264_41,
2347 + MMAL_VIDEO_LEVEL_H264_42,
2348 + MMAL_VIDEO_LEVEL_H264_5,
2349 + MMAL_VIDEO_LEVEL_H264_51,
2350 + MMAL_VIDEO_LEVEL_DUMMY = 0x7FFFFFFF
2353 +struct mmal_parameter_video_profile {
2354 + enum mmal_video_profile profile;
2355 + enum mmal_video_level level;
2358 /* video parameters */
2360 enum mmal_parameter_video_type {
2361 @@ -407,7 +515,16 @@ enum mmal_parameter_video_type {
2362 MMAL_PARAMETER_VIDEO_DRM_PROTECT_BUFFER,
2364 /** @ref MMAL_PARAMETER_BYTES_T */
2365 - MMAL_PARAMETER_VIDEO_DECODE_CONFIG_VD3
2366 + MMAL_PARAMETER_VIDEO_DECODE_CONFIG_VD3,
2368 + /**< @ref MMAL_PARAMETER_BOOLEAN_T */
2369 + MMAL_PARAMETER_VIDEO_ENCODE_H264_VCL_HRD_PARAMETERS,
2371 + /**< @ref MMAL_PARAMETER_BOOLEAN_T */
2372 + MMAL_PARAMETER_VIDEO_ENCODE_H264_LOW_DELAY_HRD_FLAG,
2374 + /**< @ref MMAL_PARAMETER_BOOLEAN_T */
2375 + MMAL_PARAMETER_VIDEO_ENCODE_INLINE_HEADER
2378 /** Valid mirror modes */
2379 --- a/drivers/media/platform/bcm2835/mmal-vchiq.c
2380 +++ b/drivers/media/platform/bcm2835/mmal-vchiq.c
2381 @@ -742,7 +742,7 @@ static int send_synchronous_mmal_msg(str
2385 - ret = wait_for_completion_timeout(&msg_context.u.sync.cmplt, HZ);
2386 + ret = wait_for_completion_timeout(&msg_context.u.sync.cmplt, 3*HZ);
2388 pr_err("error %d waiting for sync completion\n", ret);
2390 @@ -1326,7 +1326,7 @@ static int port_parameter_get(struct vch
2391 memcpy(value, &rmsg->u.port_parameter_get_reply.value,
2392 rmsg->u.port_parameter_get_reply.size);
2394 - pr_info("%s:result:%d component:0x%x port:%d parameter:%d\n", __func__,
2395 + pr_debug("%s:result:%d component:0x%x port:%d parameter:%d\n", __func__,
2396 ret, port->component->handle, port->handle, parameter_id);