From aceebc39876d7cec8f2b4289a09ddeb94a5697d9 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Mon, 9 Dec 2013 11:03:54 +0000 Subject: [PATCH 139/174] V4L2: Add support for inline H264 headers Add support for V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER to control H264 inline headers. Requires firmware fix to work correctly, otherwise format has to be set to H264 before this parameter is set. Signed-off-by: Dave Stevenson --- drivers/media/platform/bcm2835/bcm2835-camera.h | 2 +- drivers/media/platform/bcm2835/controls.c | 115 ++++++++++++++++++----- drivers/media/platform/bcm2835/mmal-parameters.h | 11 ++- 3 files changed, 103 insertions(+), 25 deletions(-) --- a/drivers/media/platform/bcm2835/bcm2835-camera.h +++ b/drivers/media/platform/bcm2835/bcm2835-camera.h @@ -15,7 +15,7 @@ * core driver device */ -#define V4L2_CTRL_COUNT 20 /* number of v4l controls */ +#define V4L2_CTRL_COUNT 21 /* number of v4l controls */ enum { MMAL_COMPONENT_CAMERA = 0, --- a/drivers/media/platform/bcm2835/controls.c +++ b/drivers/media/platform/bcm2835/controls.c @@ -96,6 +96,7 @@ struct bm2835_mmal_v4l2_ctrl { const s64 *imenu; /* integer menu array */ u32 mmal_id; /* mmal parameter id */ bm2835_mmal_v4l2_ctrl_cb *setter; + bool ignore_errors; }; struct v4l2_to_mmal_effects_setting { @@ -606,12 +607,29 @@ static int ctrl_set_image_encode_output( &u32_value, sizeof(u32_value)); } +static int ctrl_set_video_encode_param_output(struct bm2835_mmal_dev *dev, + struct v4l2_ctrl *ctrl, + const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl) +{ + u32 u32_value; + struct vchiq_mmal_port *vid_enc_ctl; + + vid_enc_ctl = &dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->output[0]; + + u32_value = ctrl->val; + + return vchiq_mmal_port_parameter_set(dev->instance, vid_enc_ctl, + mmal_ctrl->mmal_id, + &u32_value, sizeof(u32_value)); +} + static int bm2835_mmal_s_ctrl(struct v4l2_ctrl *ctrl) { struct bm2835_mmal_dev *dev = container_of(ctrl->handler, struct bm2835_mmal_dev, ctrl_handler); const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl = ctrl->priv; + int ret; if ((mmal_ctrl == NULL) || (mmal_ctrl->id != ctrl->id) || @@ -620,7 +638,10 @@ static int bm2835_mmal_s_ctrl(struct v4l return -EINVAL; } - return mmal_ctrl->setter(dev, ctrl, mmal_ctrl); + ret = mmal_ctrl->setter(dev, ctrl, mmal_ctrl); + if (mmal_ctrl->ignore_errors) + ret = 0; + return ret; } static const struct v4l2_ctrl_ops bm2835_mmal_ctrl_ops = { @@ -633,32 +654,44 @@ static const struct bm2835_mmal_v4l2_ctr { V4L2_CID_SATURATION, MMAL_CONTROL_TYPE_STD, -100, 100, 0, 1, NULL, - MMAL_PARAMETER_SATURATION, &ctrl_set_rational + MMAL_PARAMETER_SATURATION, + &ctrl_set_rational, + false }, { V4L2_CID_SHARPNESS, MMAL_CONTROL_TYPE_STD, -100, 100, 0, 1, NULL, - MMAL_PARAMETER_SHARPNESS, &ctrl_set_rational + MMAL_PARAMETER_SHARPNESS, + &ctrl_set_rational, + false }, { V4L2_CID_CONTRAST, MMAL_CONTROL_TYPE_STD, -100, 100, 0, 1, NULL, - MMAL_PARAMETER_CONTRAST, &ctrl_set_rational + MMAL_PARAMETER_CONTRAST, + &ctrl_set_rational, + false }, { V4L2_CID_BRIGHTNESS, MMAL_CONTROL_TYPE_STD, 0, 100, 50, 1, NULL, - MMAL_PARAMETER_BRIGHTNESS, &ctrl_set_rational + MMAL_PARAMETER_BRIGHTNESS, + &ctrl_set_rational, + false }, { V4L2_CID_ISO_SENSITIVITY, MMAL_CONTROL_TYPE_INT_MENU, 0, ARRAY_SIZE(iso_qmenu) - 1, 0, 1, iso_qmenu, - MMAL_PARAMETER_ISO, &ctrl_set_value_menu + MMAL_PARAMETER_ISO, + &ctrl_set_value_menu, + false }, { V4L2_CID_IMAGE_STABILIZATION, MMAL_CONTROL_TYPE_STD, 0, 1, 0, 1, NULL, - MMAL_PARAMETER_VIDEO_STABILISATION, &ctrl_set_value + MMAL_PARAMETER_VIDEO_STABILISATION, + &ctrl_set_value, + false }, /* { 0, MMAL_CONTROL_TYPE_CLUSTER, 3, 1, 0, NULL, 0, NULL @@ -666,7 +699,9 @@ static const struct bm2835_mmal_v4l2_ctr */ { V4L2_CID_EXPOSURE_AUTO, MMAL_CONTROL_TYPE_STD_MENU, ~0x03, 3, V4L2_EXPOSURE_AUTO, 0, NULL, - MMAL_PARAMETER_EXPOSURE_MODE, &ctrl_set_exposure + MMAL_PARAMETER_EXPOSURE_MODE, + &ctrl_set_exposure, + false }, /* todo this needs mixing in with set exposure { @@ -677,86 +712,120 @@ static const struct bm2835_mmal_v4l2_ctr V4L2_CID_EXPOSURE_ABSOLUTE, MMAL_CONTROL_TYPE_STD, /* Units of 100usecs */ 1, 1*1000*10, 100*10, 1, NULL, - MMAL_PARAMETER_SHUTTER_SPEED, &ctrl_set_exposure + MMAL_PARAMETER_SHUTTER_SPEED, + &ctrl_set_exposure, + false }, { V4L2_CID_AUTO_EXPOSURE_BIAS, MMAL_CONTROL_TYPE_INT_MENU, 0, ARRAY_SIZE(ev_bias_qmenu) - 1, (ARRAY_SIZE(ev_bias_qmenu)+1)/2 - 1, 0, ev_bias_qmenu, - MMAL_PARAMETER_EXPOSURE_COMP, &ctrl_set_value_ev + MMAL_PARAMETER_EXPOSURE_COMP, + &ctrl_set_value_ev, + false }, { V4L2_CID_EXPOSURE_METERING, MMAL_CONTROL_TYPE_STD_MENU, ~0x7, 2, V4L2_EXPOSURE_METERING_AVERAGE, 0, NULL, - MMAL_PARAMETER_EXP_METERING_MODE, &ctrl_set_metering_mode + MMAL_PARAMETER_EXP_METERING_MODE, + &ctrl_set_metering_mode, + false }, { V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE, MMAL_CONTROL_TYPE_STD_MENU, ~0x3fe, 9, V4L2_WHITE_BALANCE_AUTO, 0, NULL, - MMAL_PARAMETER_AWB_MODE, &ctrl_set_awb_mode + MMAL_PARAMETER_AWB_MODE, + &ctrl_set_awb_mode, + false }, { V4L2_CID_COLORFX, MMAL_CONTROL_TYPE_STD_MENU, 0, 15, V4L2_COLORFX_NONE, 0, NULL, - MMAL_PARAMETER_IMAGE_EFFECT, &ctrl_set_image_effect + MMAL_PARAMETER_IMAGE_EFFECT, + &ctrl_set_image_effect, + false }, { V4L2_CID_COLORFX_CBCR, MMAL_CONTROL_TYPE_STD, 0, 0xffff, 0x8080, 1, NULL, - MMAL_PARAMETER_COLOUR_EFFECT, &ctrl_set_colfx + MMAL_PARAMETER_COLOUR_EFFECT, + &ctrl_set_colfx, + false }, { V4L2_CID_ROTATE, MMAL_CONTROL_TYPE_STD, 0, 360, 0, 90, NULL, - MMAL_PARAMETER_ROTATION, &ctrl_set_rotate + MMAL_PARAMETER_ROTATION, + &ctrl_set_rotate, + false }, { V4L2_CID_HFLIP, MMAL_CONTROL_TYPE_STD, 0, 1, 0, 1, NULL, - MMAL_PARAMETER_MIRROR, &ctrl_set_flip + MMAL_PARAMETER_MIRROR, + &ctrl_set_flip, + false }, { V4L2_CID_VFLIP, MMAL_CONTROL_TYPE_STD, 0, 1, 0, 1, NULL, - MMAL_PARAMETER_MIRROR, &ctrl_set_flip + MMAL_PARAMETER_MIRROR, + &ctrl_set_flip, + false }, { V4L2_CID_MPEG_VIDEO_BITRATE_MODE, MMAL_CONTROL_TYPE_STD_MENU, 0, ARRAY_SIZE(bitrate_mode_qmenu) - 1, 0, 0, bitrate_mode_qmenu, - MMAL_PARAMETER_RATECONTROL, &ctrl_set_bitrate_mode + MMAL_PARAMETER_RATECONTROL, + &ctrl_set_bitrate_mode, + false }, { V4L2_CID_MPEG_VIDEO_BITRATE, MMAL_CONTROL_TYPE_STD, 25*1000, 25*1000*1000, 10*1000*1000, 25*1000, NULL, - MMAL_PARAMETER_VIDEO_BIT_RATE, &ctrl_set_bitrate + MMAL_PARAMETER_VIDEO_BIT_RATE, + &ctrl_set_bitrate, + false }, { V4L2_CID_JPEG_COMPRESSION_QUALITY, MMAL_CONTROL_TYPE_STD, 1, 100, 30, 1, NULL, - MMAL_PARAMETER_JPEG_Q_FACTOR, &ctrl_set_image_encode_output + MMAL_PARAMETER_JPEG_Q_FACTOR, + &ctrl_set_image_encode_output, + false }, { V4L2_CID_POWER_LINE_FREQUENCY, MMAL_CONTROL_TYPE_STD_MENU, 0, ARRAY_SIZE(mains_freq_qmenu) - 1, 1, 1, NULL, - MMAL_PARAMETER_FLICKER_AVOID, &ctrl_set_flicker_avoidance + MMAL_PARAMETER_FLICKER_AVOID, + &ctrl_set_flicker_avoidance, + false + }, + { + V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER, MMAL_CONTROL_TYPE_STD, + 0, 1, + 0, 1, NULL, + MMAL_PARAMETER_VIDEO_ENCODE_INLINE_HEADER, + &ctrl_set_video_encode_param_output, + true /* Errors ignored as requires latest firmware to work */ }, }; int bm2835_mmal_set_all_camera_controls(struct bm2835_mmal_dev *dev) { int c; - int ret; + int ret = 0; for (c = 0; c < V4L2_CTRL_COUNT; c++) { if ((dev->ctrls[c]) && (v4l2_ctrls[c].setter)) { ret = v4l2_ctrls[c].setter(dev, dev->ctrls[c], &v4l2_ctrls[c]); - if (ret) + if (!v4l2_ctrls[c]. ignore_errors && ret) break; } } --- a/drivers/media/platform/bcm2835/mmal-parameters.h +++ b/drivers/media/platform/bcm2835/mmal-parameters.h @@ -421,7 +421,16 @@ enum mmal_parameter_video_type { MMAL_PARAMETER_VIDEO_DRM_PROTECT_BUFFER, /** @ref MMAL_PARAMETER_BYTES_T */ - MMAL_PARAMETER_VIDEO_DECODE_CONFIG_VD3 + MMAL_PARAMETER_VIDEO_DECODE_CONFIG_VD3, + + /**< @ref MMAL_PARAMETER_BOOLEAN_T */ + MMAL_PARAMETER_VIDEO_ENCODE_H264_VCL_HRD_PARAMETERS, + + /**< @ref MMAL_PARAMETER_BOOLEAN_T */ + MMAL_PARAMETER_VIDEO_ENCODE_H264_LOW_DELAY_HRD_FLAG, + + /**< @ref MMAL_PARAMETER_BOOLEAN_T */ + MMAL_PARAMETER_VIDEO_ENCODE_INLINE_HEADER }; /** Valid mirror modes */