On Tuesday, June 14, 2011 18:36:55 Kamil Debski wrote: > Add support for the codec controls to the v4l2 control framework. > > Signed-off-by: Kamil Debski <k.deb...@samsung.com> > Signed-off-by: Kyungmin Park <kyungmin.p...@samsung.com> > --- > drivers/media/video/v4l2-ctrls.c | 281 > ++++++++++++++++++++++++++++++++++++++ > 1 files changed, 281 insertions(+), 0 deletions(-) > > diff --git a/drivers/media/video/v4l2-ctrls.c > b/drivers/media/video/v4l2-ctrls.c > index 2412f08..acc76f5 100644 > --- a/drivers/media/video/v4l2-ctrls.c > +++ b/drivers/media/video/v4l2-ctrls.c > @@ -216,6 +216,118 @@ const char * const *v4l2_ctrl_get_menu(u32 id) > "75 useconds", > NULL, > }; > + static const char * const multi_slice[] = { > + "Single", > + "Max macroblocks", > + "Max bits", > + NULL,
The naming convention is to capitalize words (like in English titles). So this should be 'Max Macroblocks', 'Max Bits'. Ditto elsewhere. I noticed a few existing menu and control name items that didn't do this correctly either. I would be great if you could add a patch that fixes them as well. > + }; > + static const char * const force_frame[] = { > + "Disabled", > + "I frame", > + "Not coded", > + NULL, > + }; > + static const char * const header_mode[] = { > + "Separate buffer", > + "Joined with 1st frame", > + NULL, > + }; > + static const char * const frame_skip[] = { > + "Disabled", > + "Level limit", > + "VBV/CPB limit", > + NULL, > + }; > + static const char * const h264_profile[] = { > + "Baseline", > + "Constrained Baseline", > + "Main", > + "Extended", > + "High", > + "High 10", > + "High 422", > + "High 444 Predictive", > + "High 10 Intra", > + "High 422 Intra", > + "High 444 Intra", > + "CAVLC 444 Intra", > + "Scalable Baseline", > + "Scalable High", > + "Scalable High Intra", > + "Multiview High", > + NULL, > + }; > + static const char * const mpeg4_profile[] = { > + "Simple", > + "Adcanved simple", > + "Core", > + "Simple scalable", > + "Advanced Coding Efficency", > + NULL, > + }; > + static const char * const mpeg_h264_level[] = { > + "1", > + "1b", > + "1.1", > + "1.2", > + "1.3", > + "2", > + "2.1", > + "2.2", > + "3", > + "3.1", > + "3.2", > + "4", > + "4.1", > + "4.2", > + "5", > + "5.1", > + NULL, > + }; > + static const char * const mpeg_mpeg4_level[] = { > + "0", > + "0b", > + "1", > + "2", > + "3", > + "3b", > + "4", > + "5", > + NULL, > + }; > + static const char * const h264_loop_filter[] = { > + "Enabled", > + "Disabled", > + "Disabled at slice boundary", > + NULL, > + }; > + static const char * const symbol_mode[] = { > + "CAVLC", > + "CABAC", > + NULL, > + }; > + static const char * vui_sar_idc[] = { > + "Unspecified", > + "1:1", > + "12:11", > + "10:11", > + "16:11", > + "40:33", > + "24:11", > + "20:11", > + "32:11", > + "80:33", > + "18:11", > + "15:11", > + "64:33", > + "160:99", > + "4:3", > + "3:2", > + "2:1", > + "Extended SAR", > + NULL, > + }; > > switch (id) { > case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ: > @@ -256,6 +368,28 @@ const char * const *v4l2_ctrl_get_menu(u32 id) > return colorfx; > case V4L2_CID_TUNE_PREEMPHASIS: > return tune_preemphasis; > + case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE: > + return multi_slice; > + case V4L2_CID_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE: > + return force_frame; > + case V4L2_CID_MPEG_VIDEO_HEADER_MODE: > + return header_mode; > + case V4L2_CID_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE: > + return frame_skip; > + case V4L2_CID_MPEG_VIDEO_H264_PROFILE: > + return h264_profile; > + case V4L2_CID_MPEG_VIDEO_H264_LEVEL: > + return mpeg_h264_level; > + case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL: > + return mpeg_mpeg4_level; > + case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE: > + return h264_loop_filter; > + case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE: > + return symbol_mode; > + case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE: > + return mpeg4_profile; > + case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC: > + return vui_sar_idc; > default: > return NULL; > } > @@ -389,6 +523,72 @@ const char *v4l2_ctrl_get_name(u32 id) > case V4L2_CID_TUNE_POWER_LEVEL: return "Tune Power Level"; > case V4L2_CID_TUNE_ANTENNA_CAPACITOR: return "Tune Antenna Capacitor"; > > + case V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE: return "Decoder > Slice Interface"; Please add the MPEG controls to the MPEG control section in the switch instead of at the end. > + case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE: return "Minimum > number of cap bufs"; I'd phrase this as: "Minimum Capture Buffers". > + case V4L2_CID_MIN_BUFFERS_FOR_OUTPUT: return "Minimum > number of out bufs"; > + > + case V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY: > return "Decoder H264 Display Delay"; > + case V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY_ENABLE: > return "H264 Display Delay Enable"; > + case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER: > return "Mpeg4 Loop Filter Enable"; > + > + case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE: return "The > slice partitioning method"; > + case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB: return "The > number of MB in a slice"; > + case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES: return "The > maximum bits per slices"; > + case V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB: return "The > number of intra refresh MBs"; > + case V4L2_CID_MPEG_MFC51_VIDEO_PADDING: return "Padding > control enable"; > + case V4L2_CID_MPEG_MFC51_VIDEO_PADDING_YUV: return "Padding > color YUV value"; > + case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE: return "Frame > level rate control enable"; > + case V4L2_CID_MPEG_MFC51_VIDEO_RC_REACTION_COEFF: return "Rate > control reaction coeff."; > + case V4L2_CID_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE: return "Force > frame type"; > + case V4L2_CID_MPEG_VIDEO_VBV_SIZE: return "VBV > buffer size"; > + case V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE: return "H264 > CPB buffer size"; > + case V4L2_CID_MPEG_VIDEO_HEADER_MODE: return > "Sequence header mode"; > + case V4L2_CID_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE: return "Frame > skip enable"; > + case V4L2_CID_MPEG_MFC51_VIDEO_RC_FIXED_TARGET_BIT: return "Fixed > target bit enable"; > + case V4L2_CID_MPEG_VIDEO_H264_PROFILE: return "H264 > profile"; > + case V4L2_CID_MPEG_VIDEO_H264_LEVEL: return "H264 > level"; > + case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL: return "MPEG4 > level"; > + case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE: return "H264 > loop filter mode"; > + case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA: return "H264 > loop filter alpha offset"; > + case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA: return "H264 > loop filter beta offset"; > + case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE: return "H264 > entorpy mode"; > + case V4L2_CID_MPEG_VIDEO_MAX_REF_PIC: return "The max > number of ref. picture"; > + case V4L2_CID_MPEG_MFC51_VIDEO_H264_NUM_REF_PIC_FOR_P: return "The > number of ref. picture of P"; > + case V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM: return "H264 > 8x8 transform enable"; > + case V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE: return "H264 MB > level rate control"; > + > + case V4L2_CID_MPEG_VIDEO_H263_I_FRAME_QP: return "H263 > I-Frame QP value"; > + case V4L2_CID_MPEG_VIDEO_H263_MIN_QP: return "H263 > Minimum QP value"; > + case V4L2_CID_MPEG_VIDEO_H263_MAX_QP: return "H263 > Maximum QP value"; > + case V4L2_CID_MPEG_VIDEO_H263_P_FRAME_QP: return "H263 P > frame QP value"; > + case V4L2_CID_MPEG_VIDEO_H263_B_FRAME_QP: return "H263 B > frame QP value"; > + > + case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP: return "H264 > I-Frame QP value"; > + case V4L2_CID_MPEG_VIDEO_H264_MIN_QP: return "H264 > Minimum QP value"; > + case V4L2_CID_MPEG_VIDEO_H264_MAX_QP: return "H264 > Maximum QP value"; > + case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP: return "H264 P > frame QP value"; > + case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP: return "H264 B > frame QP value"; > + > + case V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP: return "MPEG4 > I-Frame QP value"; > + case V4L2_CID_MPEG_VIDEO_MPEG4_MIN_QP: return "MPEG4 > Minimum QP value"; > + case V4L2_CID_MPEG_VIDEO_MPEG4_MAX_QP: return "MPEG4 > Maximum QP value"; > + case V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP: return "MPEG4 P > frame QP value"; > + case V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP: return "MPEG4 B > frame QP value"; > + > + case V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_DARK: return "H264 > dark region adaptive"; > + case V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_SMOOTH: return "H264 > smooth region adaptive"; > + case V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_STATIC: return "H264 > static region adaptive"; > + case V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_ACTIVITY: return "H264 > MB activity adaptive"; > + case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE: return "Aspect > ratio VUI enable"; > + case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC: return "VUI > aspect ratio IDC"; > + case V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_WIDTH: return > "Horizontal size of SAR"; > + case V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_HEIGHT: return > "Vertical size of SAR"; > + case V4L2_CID_MPEG_VIDEO_H264_I_PERIOD: return "H264 I > period"; > + case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE: return "MPEG4 > profile"; > + case V4L2_CID_MPEG_VIDEO_MPEG4_QPEL: return "Quarter > pixel search enable"; > + case V4L2_CID_MPEG_VIDEO_MPEG4_VOP_TIME_RES: return "MPEG4 > vop time resolution"; > + case V4L2_CID_MPEG_VIDEO_MPEG4_VOP_TIME_INC: return "MPEG4 > frame delta"; Can you sort this list into general MPEG controls, MPEG4 controls, H263/4 controls and MFC51 controls? It's all mixed up now. It's the same elsewhere where you have a series of case statements. > + > default: > return NULL; > } > @@ -520,6 +720,87 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum > v4l2_ctrl_type *type, > *flags |= V4L2_CTRL_FLAG_WRITE_ONLY; > break; > } > + switch(id) { > + case V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE: > + *type = V4L2_CTRL_TYPE_BOOLEAN; Don't add a new switch, just add this to the already existing case statements for booleans, menus, etc. > + break; > + case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE: > + case V4L2_CID_MIN_BUFFERS_FOR_OUTPUT: > + *type = V4L2_CTRL_TYPE_INTEGER; No need to specify integer controls explicitly, that's already the default case. > + break; > + case V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY: > + *type = V4L2_CTRL_TYPE_INTEGER; > + break; > + case V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY_ENABLE: > + case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER: > + *type = V4L2_CTRL_TYPE_BOOLEAN; > + break; > + > + > + case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE: > + case V4L2_CID_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE: > + case V4L2_CID_MPEG_VIDEO_HEADER_MODE: > + case V4L2_CID_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE: > + case V4L2_CID_MPEG_VIDEO_H264_PROFILE: > + case V4L2_CID_MPEG_VIDEO_H264_LEVEL: > + case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL: > + case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE: > + case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE: > + case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE: > + case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC: > + *type = V4L2_CTRL_TYPE_MENU; > + break; > + > + case V4L2_CID_MPEG_MFC51_VIDEO_PADDING: > + case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE: > + case V4L2_CID_MPEG_MFC51_VIDEO_RC_FIXED_TARGET_BIT: > + case V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM: > + case V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE: > + case V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_DARK: > + case V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_SMOOTH: > + case V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_STATIC: > + case V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_ACTIVITY: > + case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE: > + case V4L2_CID_MPEG_VIDEO_MPEG4_QPEL: > + *type = V4L2_CTRL_TYPE_BOOLEAN; > + break; > + > + case V4L2_CID_MPEG_VIDEO_GOP_SIZE: > + case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB: > + case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES: > + case V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB: > + case V4L2_CID_MPEG_MFC51_VIDEO_PADDING_YUV: > + case V4L2_CID_MPEG_MFC51_VIDEO_RC_REACTION_COEFF: > + case V4L2_CID_MPEG_VIDEO_VBV_SIZE: > + case V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE: > + case V4L2_CID_MPEG_VIDEO_B_FRAMES: > + case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA: > + case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA: > + case V4L2_CID_MPEG_VIDEO_MAX_REF_PIC: > + case V4L2_CID_MPEG_MFC51_VIDEO_H264_NUM_REF_PIC_FOR_P: > + case V4L2_CID_MPEG_VIDEO_H263_I_FRAME_QP: > + case V4L2_CID_MPEG_VIDEO_H263_MIN_QP: > + case V4L2_CID_MPEG_VIDEO_H263_MAX_QP: > + case V4L2_CID_MPEG_VIDEO_H263_P_FRAME_QP: > + case V4L2_CID_MPEG_VIDEO_H263_B_FRAME_QP: > + case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP: > + case V4L2_CID_MPEG_VIDEO_H264_MIN_QP: > + case V4L2_CID_MPEG_VIDEO_H264_MAX_QP: > + case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP: > + case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP: > + case V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP: > + case V4L2_CID_MPEG_VIDEO_MPEG4_MIN_QP: > + case V4L2_CID_MPEG_VIDEO_MPEG4_MAX_QP: > + case V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP: > + case V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP: > + case V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_WIDTH: > + case V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_HEIGHT: > + case V4L2_CID_MPEG_VIDEO_H264_I_PERIOD: > + case V4L2_CID_MPEG_VIDEO_MPEG4_VOP_TIME_RES: > + case V4L2_CID_MPEG_VIDEO_MPEG4_VOP_TIME_INC: > + *type = V4L2_CTRL_TYPE_INTEGER; > + break; > + } > } > EXPORT_SYMBOL(v4l2_ctrl_fill); > > Regards, Hans -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html