From 70e05eb7d344cba69a36dec20e2cd3d7acadc511 Mon Sep 17 00:00:00 2001 From: Ashray Kulkarni Date: Mon, 14 Jan 2013 17:16:34 -0800 Subject: [PATCH] msm_vidc: vidc: Add support for GOB in driver and v4l2 framework. GOB control was missing in v4l2 framework, so GOB settings could not be conveyed to firmware. This change adds the GOB support in v4l2 framework and driver. CRs-fixed: 433888 Change-Id: Ia276782042ba1b275ec4350b64183c14ada000be Signed-off-by: Ashray Kulkarni --- drivers/media/video/msm_vidc/msm_venc.c | 26 +++++++++++++++++++++++-- drivers/media/video/v4l2-ctrls.c | 1 + include/linux/videodev2.h | 4 +++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/drivers/media/video/msm_vidc/msm_venc.c b/drivers/media/video/msm_vidc/msm_venc.c index 0326c79dcd8..05d3570eeed 100644 --- a/drivers/media/video/msm_vidc/msm_venc.c +++ b/drivers/media/video/msm_vidc/msm_venc.c @@ -390,10 +390,16 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .name = "Slice Mode", .type = V4L2_CTRL_TYPE_MENU, .minimum = V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE, - .maximum = V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES, + .maximum = V4L2_MPEG_VIDEO_MULTI_SLICE_GOB, .default_value = V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE, .step = 1, - .menu_skip_mask = 0, + .menu_skip_mask = ~( + (1 << V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE) | + (1 << V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB) | + (1 << V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES) | + (1 << V4L2_MPEG_VIDEO_MULTI_SLICE_GOB) + ), + .qmenu = NULL, .cluster = MSM_VENC_CTRL_CLUSTER_SLICING, }, { @@ -420,6 +426,18 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .qmenu = NULL, .cluster = MSM_VENC_CTRL_CLUSTER_SLICING, }, + { + .id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_GOB, + .name = "Slice GOB", + .type = V4L2_CTRL_TYPE_INTEGER, + .minimum = 1, + .maximum = MAX_SLICE_MB_SIZE, + .default_value = 1, + .step = 1, + .menu_skip_mask = 0, + .qmenu = NULL, + .cluster = MSM_VENC_CTRL_CLUSTER_SLICING, + }, { .id = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_MODE, .name = "Intra Refresh Mode", @@ -1281,6 +1299,9 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) case V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES: temp = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES; break; + case V4L2_MPEG_VIDEO_MULTI_SLICE_GOB: + temp = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_GOB; + break; case V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE: default: temp = 0; @@ -1300,6 +1321,7 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) } case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES: case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB: + case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_GOB: temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE); property_id = diff --git a/drivers/media/video/v4l2-ctrls.c b/drivers/media/video/v4l2-ctrls.c index 4012fec5a02..3222ea02a34 100644 --- a/drivers/media/video/v4l2-ctrls.c +++ b/drivers/media/video/v4l2-ctrls.c @@ -259,6 +259,7 @@ const char * const *v4l2_ctrl_get_menu(u32 id) "Single", "Max Macroblocks", "Max Bytes", + "GOB", NULL, }; static const char * const entropy_mode[] = { diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index bc25e24df64..9d38db32ae1 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h @@ -1498,6 +1498,7 @@ enum v4l2_mpeg_video_multi_slice_mode { V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE = 0, V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB = 1, V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES = 2, + V4L2_MPEG_VIDEO_MULTI_SLICE_GOB = 3, }; #define V4L2_CID_MPEG_VIDEO_VBV_SIZE (V4L2_CID_MPEG_BASE+222) #define V4L2_CID_MPEG_VIDEO_DEC_PTS (V4L2_CID_MPEG_BASE+223) @@ -1845,7 +1846,8 @@ enum v4l2_mpeg_vidc_perf_level { V4L2_CID_MPEG_VIDC_PERF_LEVEL_PERFORMANCE = 0, V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO = 1, }; - +#define V4L2_CID_MPEG_VIDEO_MULTI_SLICE_GOB \ + (V4L2_CID_MPEG_MSM_VIDC_BASE+27) /* Camera class control IDs */ #define V4L2_CID_CAMERA_CLASS_BASE (V4L2_CTRL_CLASS_CAMERA | 0x900) #define V4L2_CID_CAMERA_CLASS (V4L2_CTRL_CLASS_CAMERA | 1)