Hi Arun, This patch sets looks very good. Please check my comments below. > From: Arun Kumar K [mailto:arun.kk@xxxxxxxxxxx] > > This patch adds new V4L controls for VP8 encoding. > > Signed-off-by: Kiran AVND <avnd.kiran@xxxxxxxxxxx> > Signed-off-by: Arun Kumar K <arun.kk@xxxxxxxxxxx> > --- > Documentation/DocBook/media/v4l/controls.xml | 150 > ++++++++++++++++++++++++++ > drivers/media/v4l2-core/v4l2-ctrls.c | 33 ++++++ > include/uapi/linux/v4l2-controls.h | 29 ++++- > 3 files changed, 210 insertions(+), 2 deletions(-) > > diff --git a/Documentation/DocBook/media/v4l/controls.xml > b/Documentation/DocBook/media/v4l/controls.xml > index 8d7a779..736c991 100644 > --- a/Documentation/DocBook/media/v4l/controls.xml > +++ b/Documentation/DocBook/media/v4l/controls.xml > @@ -3009,6 +3009,156 @@ in by the application. 0 = do not insert, 1 = > insert packets.</entry> > </tgroup> > </table> > </section> > + > + <section> > + <title>VPX Control Reference</title> > + > + <para>The VPX controls include controls for encoding parameters > + of VPx video codec.</para> > + > + <table pgwide="1" frame="none" id="vpx-control-id"> > + <title>VPX Control IDs</title> > + > + <tgroup cols="4"> > + <colspec colname="c1" colwidth="1*" /> > + <colspec colname="c2" colwidth="6*" /> > + <colspec colname="c3" colwidth="2*" /> > + <colspec colname="c4" colwidth="6*" /> > + <spanspec namest="c1" nameend="c2" spanname="id" /> > + <spanspec namest="c2" nameend="c4" spanname="descr" /> > + <thead> > + <row> > + <entry spanname="id" align="left">ID</entry> > + <entry align="left">Type</entry> > + </row><row rowsep="1"><entry spanname="descr" > align="left">Description</entry> > + </row> > + </thead> > + <tbody valign="top"> > + <row><entry></entry></row> > + > + <row><entry></entry></row> > + <row id="v4l2-vpx-num-partitions"> > + <entry > spanname="id"><constant>V4L2_CID_VPX_NUM_PARTITIONS</constant></entry> > + <entry>enum v4l2_vp8_num_partitions</entry> > + </row> > + <row><entry spanname="descr">The number of token partitions > to use in VP8 encoder. > +Possible values are:</entry> > + </row> > + <row> > + <entrytbl spanname="descr" cols="2"> > + <tbody valign="top"> > + <row> > + > <entry><constant>V4L2_VPX_1_PARTITION</constant></entry> > + <entry>1 coefficient partition</entry> > + </row> > + <row> > + > <entry><constant>V4L2_VPX_2_PARTITIONS</constant></entry> > + <entry>2 partitions</entry> > + </row> > + <row> > + > <entry><constant>V4L2_VPX_4_PARTITIONS</constant></entry> > + <entry>4 partitions</entry> > + </row> > + <row> > + > <entry><constant>V4L2_VPX_8_PARTITIONS</constant></entry> > + <entry>8 partitions</entry> > + </row> > + </tbody> > + </entrytbl> > + </row> > + > + <row><entry></entry></row> > + <row> > + <entry > spanname="id"><constant>V4L2_CID_VPX_IMD_DISABLE_4X4</constant></entry> > + <entry>boolean</entry> > + </row> > + <row><entry spanname="descr">Setting this prevents intra > 4x4 mode in the intra mode decision.</entry> > + </row> > + > + <row><entry></entry></row> > + <row id="v4l2-vpx-num-ref-frames"> > + <entry > spanname="id"><constant>V4L2_CID_VPX_NUM_REF_FRAMES</constant></entry> > + <entry>enum v4l2_vp8_num_ref_frames</entry> > + </row> > + <row><entry spanname="descr">The number of reference > pictures for encoding P frames. > +Possible values are:</entry> > + </row> > + <row> > + <entrytbl spanname="descr" cols="2"> > + <tbody valign="top"> > + <row> > + > <entry><constant>V4L2_VPX_1_REF_FRAME</constant></entry> > + <entry>Last encoded frame will be searched</entry> > + </row> > + <row> > + > <entry><constant>V4L2_VPX_2_REF_FRAME</constant></entry> > + <entry>Two frames would be searched among last > encoded frame, > +golden frame and altref frame. Encoder implementation can decide which > two are chosen.</entry> > + </row> > + <row> > + > <entry><constant>V4L2_VPX_3_REF_FRAME</constant></entry> > + <entry>The last encoded frame, golden frame and > altref frame will be searched.</entry> > + </row> > + </tbody> > + </entrytbl> > + </row> > + > + <row><entry></entry></row> > + <row> > + <entry > spanname="id"><constant>V4L2_CID_VPX_FILTER_LEVEL</constant></entry> > + <entry>integer</entry> > + </row> > + <row><entry spanname="descr">Indicates the loop filter > level. > +The adjustment of loop filter level is done via a delta value against > a baseline loop filter value.</entry> > + </row> > + > + <row><entry></entry></row> > + <row> > + <entry > spanname="id"><constant>V4L2_CID_VPX_FILTER_SHARPNESS</constant></entry> > + <entry>integer</entry> > + </row> > + <row><entry spanname="descr">This parameter affects the > loop > +filter. Anything above zero weakens the deblocking effect on loop > filter.</entry> > + </row> > + > + <row><entry></entry></row> > + <row> > + <entry > spanname="id"><constant>V4L2_CID_VPX_GOLDEN_FRAME_REF_PERIOD</constant> > </entry> > + <entry>integer</entry> > + </row> > + <row><entry spanname="descr">Sets the refresh period for > golden > +frame. Period is defined in number of frames. For a value of 'n', > every nth frame will be taken as golden frame.</entry> > + </row> > + > + <row><entry></entry></row> > + <row id="v4l2-vpx-golden-frame-sel"> > + <entry > spanname="id"><constant>V4L2_CID_VPX_GOLDEN_FRAME_SEL</constant></entry> > + <entry>enum v4l2_vp8_golden_frame_sel</entry> > + </row> > + <row><entry spanname="descr">Selects the golden frame for > encoding. > +Possible values are:</entry> > + </row> > + <row> > + <entrytbl spanname="descr" cols="2"> > + <tbody valign="top"> > + <row> > + > <entry><constant>V4L2_VPX_GOLDEN_FRAME_USE_PREV</constant></entry> > + <entry>Use the last to last or (n-2)th frame as a > golden frame. Current frame index being 'n'.</entry> > + </row> > + <row> > + > <entry><constant>V4L2_VPX_GOLDEN_FRAME_USE_REF_PERIOD</constant></entry> > + <entry>Use the previous specific frame indicated by > V4L2_CID_VPX_GOLDEN_FRAME_REF_PERIOD as a golden frame</entry> > + </row> > + </tbody> > + </entrytbl> > + </row> > + > + <row><entry></entry></row> > + </tbody> > + </tgroup> > + </table> > + > + </section> > </section> > > <section id="camera-controls"> > diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2- > core/v4l2-ctrls.c > index e03a2e8..891f595 100644 > --- a/drivers/media/v4l2-core/v4l2-ctrls.c > +++ b/drivers/media/v4l2-core/v4l2-ctrls.c > @@ -424,6 +424,12 @@ const char * const *v4l2_ctrl_get_menu(u32 id) > NULL, > }; > > + static const char * const vpx_golden_frame_sel[] = { > + "Use Previous Frame", > + "Use Previous Specific Frame", "Use Previous Specific Frame" seems unclear. Maybe "Use Previous Golden Frame" or "Use Periodic Golden Frame"? I'm not sure if I get the description right. > + NULL, > + }; > + > static const char * const flash_led_mode[] = { > "Off", > "Flash", > @@ -538,6 +544,8 @@ const char * const *v4l2_ctrl_get_menu(u32 id) > return mpeg_mpeg4_level; > case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE: > return mpeg4_profile; > + case V4L2_CID_VPX_GOLDEN_FRAME_SEL: > + return vpx_golden_frame_sel; > case V4L2_CID_JPEG_CHROMA_SUBSAMPLING: > return jpeg_chroma_subsampling; > case V4L2_CID_DV_TX_MODE: > @@ -552,13 +560,26 @@ const char * const *v4l2_ctrl_get_menu(u32 id) } > EXPORT_SYMBOL(v4l2_ctrl_get_menu); > > +#define __v4l2_qmenu_int_len(arr, len) ({ *(len) = ARRAY_SIZE(arr); > +arr; }) > /* > * Returns NULL or an s64 type array containing the menu for given > * control ID. The total number of the menu items is returned in @len. > */ > const s64 const *v4l2_ctrl_get_int_menu(u32 id, u32 *len) { > + static const s64 const qmenu_int_vpx_num_partitions[] = { > + 1, 2, 4, 8, > + }; > + > + static const s64 const qmenu_int_vpx_num_ref_frames[] = { > + 1, 2, 3, > + }; > + > switch (id) { > + case V4L2_CID_VPX_NUM_PARTITIONS: > + return __v4l2_qmenu_int_len(qmenu_int_vpx_num_partitions, > len); > + case V4L2_CID_VPX_NUM_REF_FRAMES: > + return __v4l2_qmenu_int_len(qmenu_int_vpx_num_ref_frames, > len); > default: > *len = 0; > return NULL; > @@ -714,6 +735,15 @@ const char *v4l2_ctrl_get_name(u32 id) > case V4L2_CID_MPEG_VIDEO_VBV_DELAY: return "Initial > Delay for VBV Control"; > case V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER: return > "Repeat Sequence Header"; > > + /* VPX controls */ > + case V4L2_CID_VPX_NUM_PARTITIONS: return "VPX Number > of partitions"; > + case V4L2_CID_VPX_IMD_DISABLE_4X4: return "VPX Intra > mode decision disable"; > + case V4L2_CID_VPX_NUM_REF_FRAMES: return "VPX No. of > refs for P frame"; > + case V4L2_CID_VPX_FILTER_LEVEL: return "VPX > Loop filter level range"; > + case V4L2_CID_VPX_FILTER_SHARPNESS: return "VPX > Deblocking effect control"; > + case V4L2_CID_VPX_GOLDEN_FRAME_REF_PERIOD: return "VPX > Golden frame refresh period"; > + case V4L2_CID_VPX_GOLDEN_FRAME_SEL: return "VPX Golden > frame indicator"; > + > /* CAMERA controls */ > /* Keep the order of the 'case's the same as in videodev2.h! */ > case V4L2_CID_CAMERA_CLASS: return "Camera Controls"; > @@ -928,6 +958,7 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum > v4l2_ctrl_type *type, > case V4L2_CID_DV_RX_RGB_RANGE: > case V4L2_CID_TEST_PATTERN: > case V4L2_CID_TUNE_DEEMPHASIS: > + case V4L2_CID_VPX_GOLDEN_FRAME_SEL: > *type = V4L2_CTRL_TYPE_MENU; > break; > case V4L2_CID_LINK_FREQ: > @@ -939,6 +970,8 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum > v4l2_ctrl_type *type, > break; > case V4L2_CID_ISO_SENSITIVITY: > case V4L2_CID_AUTO_EXPOSURE_BIAS: > + case V4L2_CID_VPX_NUM_PARTITIONS: > + case V4L2_CID_VPX_NUM_REF_FRAMES: > *type = V4L2_CTRL_TYPE_INTEGER_MENU; > break; > case V4L2_CID_USER_CLASS: > diff --git a/include/uapi/linux/v4l2-controls.h > b/include/uapi/linux/v4l2-controls.h > index 69bd5bb..8d6ffc9 100644 > --- a/include/uapi/linux/v4l2-controls.h > +++ b/include/uapi/linux/v4l2-controls.h > @@ -522,6 +522,33 @@ enum v4l2_mpeg_video_mpeg4_profile { }; > #define V4L2_CID_MPEG_VIDEO_MPEG4_QPEL (V4L2_CID_MPEG_BASE+407) > > +/* Control IDs for VP8 streams > + * Though VP8 is not part of MPEG, adding it here as MPEG class is > + * already handling other video compression standards */ > +#define V4L2_CID_VPX_NUM_PARTITIONS (V4L2_CID_MPEG_BASE+500) > +enum v4l2_vp8_num_partitions { > + V4L2_VPX_1_PARTITION = 0, > + V4L2_VPX_2_PARTITIONS = 1, > + V4L2_VPX_4_PARTITIONS = 2, > + V4L2_VPX_8_PARTITIONS = 3, > +}; > +#define V4L2_CID_VPX_IMD_DISABLE_4X4 (V4L2_CID_MPEG_BASE+501) > +#define V4L2_CID_VPX_NUM_REF_FRAMES (V4L2_CID_MPEG_BASE+502) > +enum v4l2_vp8_num_ref_frames { > + V4L2_VPX_1_REF_FRAME = 0, > + V4L2_VPX_2_REF_FRAME = 1, > + V4L2_VPX_3_REF_FRAME = 2, > +}; > +#define V4L2_CID_VPX_FILTER_LEVEL (V4L2_CID_MPEG_BASE+503) > +#define V4L2_CID_VPX_FILTER_SHARPNESS (V4L2_CID_MPEG_BASE+504) > +#define V4L2_CID_VPX_GOLDEN_FRAME_REF_PERIOD (V4L2_CID_MPEG_BASE+505) > +#define V4L2_CID_VPX_GOLDEN_FRAME_SEL (V4L2_CID_MPEG_BASE+506) > +enum v4l2_vp8_golden_frame_sel { > + V4L2_VPX_GOLDEN_FRAME_USE_PREV = 0, > + V4L2_VPX_GOLDEN_FRAME_USE_REF_PERIOD = 1, > +}; > + > /* MPEG-class control IDs specific to the CX2341x driver as defined > by V4L2 */ > #define V4L2_CID_MPEG_CX2341X_BASE > (V4L2_CTRL_CLASS_MPEG | 0x1000) > #define V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE > (V4L2_CID_MPEG_CX2341X_BASE+0) > @@ -590,7 +617,6 @@ enum v4l2_mpeg_mfc51_video_force_frame_type { > #define V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_STATIC > (V4L2_CID_MPEG_MFC51_BASE+53) > #define V4L2_CID_MPEG_MFC51_VIDEO_H264_NUM_REF_PIC_FOR_P > (V4L2_CID_MPEG_MFC51_BASE+54) > > - > /* Camera class control IDs */ > > #define V4L2_CID_CAMERA_CLASS_BASE (V4L2_CTRL_CLASS_CAMERA | > 0x900) > @@ -818,7 +844,6 @@ enum v4l2_jpeg_chroma_subsampling { > #define V4L2_CID_PIXEL_RATE > (V4L2_CID_IMAGE_PROC_CLASS_BASE + 2) > #define V4L2_CID_TEST_PATTERN > (V4L2_CID_IMAGE_PROC_CLASS_BASE + 3) > > - > /* DV-class control IDs defined by V4L2 */ > #define V4L2_CID_DV_CLASS_BASE (V4L2_CTRL_CLASS_DV | > 0x900) > #define V4L2_CID_DV_CLASS (V4L2_CTRL_CLASS_DV | 1) > -- > 1.7.9.5 Best wishes, -- Kamil Debski Linux Kernel Developer Samsung R&D Institute Poland -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html