[PATCH] [media] s5p-mfc: Add Horizontal and Vertical search range for Video Macro Blocks
From: Kamil Debski <hidden>
Date: 2014-01-23 10:11:39
Also in:
linux-media, linux-samsung-soc, lkml
Hi Amit,
quoted hunk ↗ jump to hunk
From: Amit Grover [mailto:amit.grover at samsung.com] Sent: Monday, December 30, 2013 11:43 AM This patch adds Controls to set Horizontal and Vertical search range for Motion Estimation block for Samsung MFC video Encoders. Signed-off-by: Swami Nathan <redacted> Signed-off-by: Amit Grover <redacted> --- Documentation/DocBook/media/v4l/controls.xml | 14 +++++++++++++ drivers/media/platform/s5p-mfc/s5p_mfc_common.h | 2 ++ drivers/media/platform/s5p-mfc/s5p_mfc_enc.c | 24 +++++++++++++++++++++++ drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c | 8 ++------ drivers/media/v4l2-core/v4l2-ctrls.c | 14 +++++++++++++ include/uapi/linux/v4l2-controls.h | 2 ++ 6 files changed, 58 insertions(+), 6 deletions(-)diff --git a/Documentation/DocBook/media/v4l/controls.xmlb/Documentation/DocBook/media/v4l/controls.xml index 7a3b49b..70a0f6f 100644--- a/Documentation/DocBook/media/v4l/controls.xml +++ b/Documentation/DocBook/media/v4l/controls.xml@@ -2258,6 +2258,20 @@ Applicable to the MPEG1, MPEG2, MPEG4encoders.</entry> VBV buffer control.</entry> </row> + <row><entry></entry></row> + <row id="v4l2-mpeg-video-horz-search-range"> + <entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_HORZ_SEARCH_RANGE</constant
HORZ is nowhere used. HOR is more commonly used in control names. V4L2_CID_MPEG_VIDEO_MV_H_SEARCH_RANGE seems better.
quoted
</entry>+ <entry>integer</entry> + </row><row><entry spanname="descr">Sets the Horizontal search range for Video Macro blocks.</entry> + </row>
It's expressed in pixels? If so then it should be mentioned here. Also I think this lacks the mention that it is used for motion estimation. Please add a more detailed description.
+ + <row><entry></entry></row> + <row id="v4l2-mpeg-video-vert-search-range"> + <entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_VERT_SEARCH_RANGE</constantquoted
</entry>
V4L2_CID_MPEG_VIDEO_MV_V_SEARCH_RANGE seems better.
+ <entry>integer</entry> + </row><row><entry spanname="descr">Sets the Vertical search range for Video Macro blocks.</entry> + </row> +
This description is too vague as well.
quoted hunk ↗ jump to hunk
<row><entry></entry></row> <row> <entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE</constant>&nb sp;</entry>diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_common.hb/drivers/media/platform/s5p-mfc/s5p_mfc_common.h index 6920b54..f2c13c3 100644--- a/drivers/media/platform/s5p-mfc/s5p_mfc_common.h +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_common.h@@ -430,6 +430,8 @@ struct s5p_mfc_vp8_enc_params { struct s5p_mfc_enc_params { u16 width; u16 height; + u32 horz_range; + u32 vert_range;
mv_h_range ? mv_v_range ?
quoted hunk ↗ jump to hunk
u16 gop_size; enum v4l2_mpeg_video_multi_slice_mode slice_mode;diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_enc.cb/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c index 4ff3b6c..a02e7b8 100644--- a/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c@@ -208,6 +208,24 @@ static struct mfc_control controls[] = { .default_value = 0, }, { + .id = V4L2_CID_MPEG_VIDEO_HORZ_SEARCH_RANGE, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "horizontal search range of video macro block",
This too should be property capitalised. Please mention the motion vectors too.
+ .minimum = 16,
+ .maximum = 128,
+ .step = 16,
+ .default_value = 32,
+ },
+ {
+ .id = V4L2_CID_MPEG_VIDEO_VERT_SEARCH_RANGE,
+ .type = V4L2_CTRL_TYPE_INTEGER,
+ .name = "vertical search range of video macro block",This too should be property capitalised. Please mention the motion vectors too.
quoted hunk ↗ jump to hunk
+ .minimum = 16, + .maximum = 128, + .step = 16, + .default_value = 32, + }, + { .id = V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE, .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 0,@@ -1377,6 +1395,12 @@ static int s5p_mfc_enc_s_ctrl(struct v4l2_ctrl*ctrl) case V4L2_CID_MPEG_VIDEO_VBV_SIZE: p->vbv_size = ctrl->val; break; + case V4L2_CID_MPEG_VIDEO_HORZ_SEARCH_RANGE: + p->horz_range = ctrl->val; + break; + case V4L2_CID_MPEG_VIDEO_VERT_SEARCH_RANGE: + p->vert_range = ctrl->val; + break; case V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE: p->codec.h264.cpb_size = ctrl->val; break;diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.cb/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c index 461358c..47e1807 100644--- a/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c@@ -727,14 +727,10 @@ static int s5p_mfc_set_enc_params(structs5p_mfc_ctx *ctx) WRITEL(reg, S5P_FIMV_E_RC_CONFIG_V6); /* setting for MV range [16, 256] */ - reg = 0; - reg &= ~(0x3FFF); - reg = 256; + reg = (p->horz_range & 0x3fff); /* conditional check in app */ WRITEL(reg, S5P_FIMV_E_MV_HOR_RANGE_V6);
Please add a S5P_FIMV_E_MV_HOR_RANGE_V6_MASK or something instead of this magic number.
- reg = 0; - reg &= ~(0x3FFF); - reg = 256; + reg = (p->vert_range & 0x3fff); /* conditional check in app */
Please add a S5P_FIMV_E_MV_VER_RANGE_V6_MASK or something instead of this magic number.
quoted hunk ↗ jump to hunk
WRITEL(reg, S5P_FIMV_E_MV_VER_RANGE_V6); WRITEL(0x0, S5P_FIMV_E_FRAME_INSERTION_V6);diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c index fb46790..7cf23d5 100644--- a/drivers/media/v4l2-core/v4l2-ctrls.c +++ b/drivers/media/v4l2-core/v4l2-ctrls.c@@ -735,6 +735,8 @@ const char *v4l2_ctrl_get_name(u32 id) case V4L2_CID_MPEG_VIDEO_DEC_PTS: return
"Video
Decoder PTS"; case V4L2_CID_MPEG_VIDEO_DEC_FRAME: return
"Video
Decoder Frame Count"; case V4L2_CID_MPEG_VIDEO_VBV_DELAY: return
"Initial
Delay for VBV Control"; + case V4L2_CID_MPEG_VIDEO_HORZ_SEARCH_RANGE: return "hor search range of video MB";
This should be property capitalised. Please mention the motion vectors too.
+ case V4L2_CID_MPEG_VIDEO_VERT_SEARCH_RANGE: return "vert search range of video MB";
This too should be property capitalised. Please mention the motion vectors too.
quoted hunk ↗ jump to hunk
case V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER: return "Repeat Sequence Header"; /* VPX controls */@@ -905,6 +907,18 @@ void v4l2_ctrl_fill(u32 id, const char **name,enum v4l2_ctrl_type *type, *min = 0; *max = *step = 1; break; + case V4L2_CID_MPEG_VIDEO_HORZ_SEARCH_RANGE: + *type = V4L2_CTRL_TYPE_INTEGER; + *min = 16; + *max = 128; + *step = 16; + break; + case V4L2_CID_MPEG_VIDEO_VERT_SEARCH_RANGE: + *type = V4L2_CTRL_TYPE_INTEGER; + *min = 16; + *max = 128; + *step = 16; + break; case V4L2_CID_PAN_RESET: case V4L2_CID_TILT_RESET: case V4L2_CID_FLASH_STROBE:diff --git a/include/uapi/linux/v4l2-controls.hb/include/uapi/linux/v4l2-controls.h index 1666aab..bcce536 100644--- a/include/uapi/linux/v4l2-controls.h +++ b/include/uapi/linux/v4l2-controls.h@@ -372,6 +372,8 @@ enum v4l2_mpeg_video_multi_slice_mode { #define V4L2_CID_MPEG_VIDEO_DEC_FRAME(V4L2_CID_MPEG_BASE+224) #define V4L2_CID_MPEG_VIDEO_VBV_DELAY (V4L2_CID_MPEG_BASE+225) #define V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER (V4L2_CID_MPEG_BASE+226) +#define V4L2_CID_MPEG_VIDEO_HORZ_SEARCH_RANGE (V4L2_CID_MPEG_BASE+227) +#define V4L2_CID_MPEG_VIDEO_VERT_SEARCH_RANGE (V4L2_CID_MPEG_BASE+228) #define V4L2_CID_MPEG_VIDEO_H263_I_FRAME_QP (V4L2_CID_MPEG_BASE+300) #define V4L2_CID_MPEG_VIDEO_H263_P_FRAME_QP (V4L2_CID_MPEG_BASE+301) -- 1.7.9.5
Best wishes, -- Kamil Debski Samsung R&D Institute Poland