diff options
author | Arun Kumar K <arun.kk@samsung.com> | 2013-11-15 00:29:22 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2014-01-13 07:55:27 -0500 |
commit | 4773ab99aa8bda57de22bf54ddbaa1a941b25fb0 (patch) | |
tree | f0c674ec3f6096a4f69fd20a23d50b5ee445daa2 | |
parent | ee97207c6e7e9a75f49e2abb7ecf944d319ed969 (diff) |
[media] s5p-mfc: Add QP setting support for vp8 encoder
Adds v4l2 controls to set MIN, MAX QP values and
I, P frame QP for vp8 encoder.
Signed-off-by: Kiran AVND <avnd.kiran@samsung.com>
Signed-off-by: Arun Kumar K <arun.kk@samsung.com>
Signed-off-by: Kamil Debski <k.debski@samsung.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
-rw-r--r-- | Documentation/DocBook/media/v4l/controls.xml | 32 | ||||
-rw-r--r-- | drivers/media/platform/s5p-mfc/s5p_mfc_common.h | 4 | ||||
-rw-r--r-- | drivers/media/platform/s5p-mfc/s5p_mfc_enc.c | 44 | ||||
-rw-r--r-- | drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c | 20 | ||||
-rw-r--r-- | drivers/media/v4l2-core/v4l2-ctrls.c | 4 | ||||
-rw-r--r-- | include/uapi/linux/v4l2-controls.h | 4 |
6 files changed, 108 insertions, 0 deletions
diff --git a/Documentation/DocBook/media/v4l/controls.xml b/Documentation/DocBook/media/v4l/controls.xml index 7a3b49b3cc3b..e4db4ac4533f 100644 --- a/Documentation/DocBook/media/v4l/controls.xml +++ b/Documentation/DocBook/media/v4l/controls.xml | |||
@@ -3161,6 +3161,38 @@ V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_REF_PERIOD as a golden frame.</entry> | |||
3161 | </entrytbl> | 3161 | </entrytbl> |
3162 | </row> | 3162 | </row> |
3163 | 3163 | ||
3164 | <row><entry></entry></row> | ||
3165 | <row> | ||
3166 | <entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_VPX_MIN_QP</constant></entry> | ||
3167 | <entry>integer</entry> | ||
3168 | </row> | ||
3169 | <row><entry spanname="descr">Minimum quantization parameter for VP8.</entry> | ||
3170 | </row> | ||
3171 | |||
3172 | <row><entry></entry></row> | ||
3173 | <row> | ||
3174 | <entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_VPX_MAX_QP</constant></entry> | ||
3175 | <entry>integer</entry> | ||
3176 | </row> | ||
3177 | <row><entry spanname="descr">Maximum quantization parameter for VP8.</entry> | ||
3178 | </row> | ||
3179 | |||
3180 | <row><entry></entry></row> | ||
3181 | <row> | ||
3182 | <entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_VPX_I_FRAME_QP</constant> </entry> | ||
3183 | <entry>integer</entry> | ||
3184 | </row> | ||
3185 | <row><entry spanname="descr">Quantization parameter for an I frame for VP8.</entry> | ||
3186 | </row> | ||
3187 | |||
3188 | <row><entry></entry></row> | ||
3189 | <row> | ||
3190 | <entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_VPX_P_FRAME_QP</constant> </entry> | ||
3191 | <entry>integer</entry> | ||
3192 | </row> | ||
3193 | <row><entry spanname="descr">Quantization parameter for a P frame for VP8.</entry> | ||
3194 | </row> | ||
3195 | |||
3164 | <row><entry></entry></row> | 3196 | <row><entry></entry></row> |
3165 | </tbody> | 3197 | </tbody> |
3166 | </tgroup> | 3198 | </tgroup> |
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_common.h b/drivers/media/platform/s5p-mfc/s5p_mfc_common.h index 6920b546181a..d91f7575b088 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc_common.h +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_common.h | |||
@@ -422,6 +422,10 @@ struct s5p_mfc_vp8_enc_params { | |||
422 | enum v4l2_vp8_golden_frame_sel golden_frame_sel; | 422 | enum v4l2_vp8_golden_frame_sel golden_frame_sel; |
423 | u8 hier_layer; | 423 | u8 hier_layer; |
424 | u8 hier_layer_qp[3]; | 424 | u8 hier_layer_qp[3]; |
425 | u8 rc_min_qp; | ||
426 | u8 rc_max_qp; | ||
427 | u8 rc_frame_qp; | ||
428 | u8 rc_p_frame_qp; | ||
425 | }; | 429 | }; |
426 | 430 | ||
427 | /** | 431 | /** |
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c b/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c index f0b41f85ac71..cdf672c8f11e 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c | |||
@@ -618,6 +618,38 @@ static struct mfc_control controls[] = { | |||
618 | .default_value = V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_USE_PREV, | 618 | .default_value = V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_USE_PREV, |
619 | .menu_skip_mask = 0, | 619 | .menu_skip_mask = 0, |
620 | }, | 620 | }, |
621 | { | ||
622 | .id = V4L2_CID_MPEG_VIDEO_VPX_MAX_QP, | ||
623 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
624 | .minimum = 0, | ||
625 | .maximum = 127, | ||
626 | .step = 1, | ||
627 | .default_value = 127, | ||
628 | }, | ||
629 | { | ||
630 | .id = V4L2_CID_MPEG_VIDEO_VPX_MIN_QP, | ||
631 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
632 | .minimum = 0, | ||
633 | .maximum = 11, | ||
634 | .step = 1, | ||
635 | .default_value = 0, | ||
636 | }, | ||
637 | { | ||
638 | .id = V4L2_CID_MPEG_VIDEO_VPX_I_FRAME_QP, | ||
639 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
640 | .minimum = 0, | ||
641 | .maximum = 127, | ||
642 | .step = 1, | ||
643 | .default_value = 10, | ||
644 | }, | ||
645 | { | ||
646 | .id = V4L2_CID_MPEG_VIDEO_VPX_P_FRAME_QP, | ||
647 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
648 | .minimum = 0, | ||
649 | .maximum = 127, | ||
650 | .step = 1, | ||
651 | .default_value = 10, | ||
652 | }, | ||
621 | }; | 653 | }; |
622 | 654 | ||
623 | #define NUM_CTRLS ARRAY_SIZE(controls) | 655 | #define NUM_CTRLS ARRAY_SIZE(controls) |
@@ -1557,6 +1589,18 @@ static int s5p_mfc_enc_s_ctrl(struct v4l2_ctrl *ctrl) | |||
1557 | case V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_SEL: | 1589 | case V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_SEL: |
1558 | p->codec.vp8.golden_frame_sel = ctrl->val; | 1590 | p->codec.vp8.golden_frame_sel = ctrl->val; |
1559 | break; | 1591 | break; |
1592 | case V4L2_CID_MPEG_VIDEO_VPX_MIN_QP: | ||
1593 | p->codec.vp8.rc_min_qp = ctrl->val; | ||
1594 | break; | ||
1595 | case V4L2_CID_MPEG_VIDEO_VPX_MAX_QP: | ||
1596 | p->codec.vp8.rc_max_qp = ctrl->val; | ||
1597 | break; | ||
1598 | case V4L2_CID_MPEG_VIDEO_VPX_I_FRAME_QP: | ||
1599 | p->codec.vp8.rc_frame_qp = ctrl->val; | ||
1600 | break; | ||
1601 | case V4L2_CID_MPEG_VIDEO_VPX_P_FRAME_QP: | ||
1602 | p->codec.vp8.rc_p_frame_qp = ctrl->val; | ||
1603 | break; | ||
1560 | default: | 1604 | default: |
1561 | v4l2_err(&dev->v4l2_dev, "Invalid control, id=%d, val=%d\n", | 1605 | v4l2_err(&dev->v4l2_dev, "Invalid control, id=%d, val=%d\n", |
1562 | ctrl->id, ctrl->val); | 1606 | ctrl->id, ctrl->val); |
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c b/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c index 461358c4a790..b4886d636dbe 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c | |||
@@ -1218,6 +1218,26 @@ static int s5p_mfc_set_enc_params_vp8(struct s5p_mfc_ctx *ctx) | |||
1218 | WRITEL(reg, S5P_FIMV_E_RC_FRAME_RATE_V6); | 1218 | WRITEL(reg, S5P_FIMV_E_RC_FRAME_RATE_V6); |
1219 | } | 1219 | } |
1220 | 1220 | ||
1221 | /* frame QP */ | ||
1222 | reg &= ~(0x7F); | ||
1223 | reg |= p_vp8->rc_frame_qp & 0x7F; | ||
1224 | WRITEL(reg, S5P_FIMV_E_RC_CONFIG_V6); | ||
1225 | |||
1226 | /* other QPs */ | ||
1227 | WRITEL(0x0, S5P_FIMV_E_FIXED_PICTURE_QP_V6); | ||
1228 | if (!p->rc_frame && !p->rc_mb) { | ||
1229 | reg = 0; | ||
1230 | reg |= ((p_vp8->rc_p_frame_qp & 0x7F) << 8); | ||
1231 | reg |= p_vp8->rc_frame_qp & 0x7F; | ||
1232 | WRITEL(reg, S5P_FIMV_E_FIXED_PICTURE_QP_V6); | ||
1233 | } | ||
1234 | |||
1235 | /* max QP */ | ||
1236 | reg = ((p_vp8->rc_max_qp & 0x7F) << 8); | ||
1237 | /* min QP */ | ||
1238 | reg |= p_vp8->rc_min_qp & 0x7F; | ||
1239 | WRITEL(reg, S5P_FIMV_E_RC_QP_BOUND_V6); | ||
1240 | |||
1221 | /* vbv buffer size */ | 1241 | /* vbv buffer size */ |
1222 | if (p->frame_skip_mode == | 1242 | if (p->frame_skip_mode == |
1223 | V4L2_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE_BUF_LIMIT) { | 1243 | V4L2_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE_BUF_LIMIT) { |
diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c index fb46790d0eca..20840dff78e6 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls.c +++ b/drivers/media/v4l2-core/v4l2-ctrls.c | |||
@@ -745,6 +745,10 @@ const char *v4l2_ctrl_get_name(u32 id) | |||
745 | case V4L2_CID_MPEG_VIDEO_VPX_FILTER_SHARPNESS: return "VPX Deblocking Effect Control"; | 745 | case V4L2_CID_MPEG_VIDEO_VPX_FILTER_SHARPNESS: return "VPX Deblocking Effect Control"; |
746 | case V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_REF_PERIOD: return "VPX Golden Frame Refresh Period"; | 746 | case V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_REF_PERIOD: return "VPX Golden Frame Refresh Period"; |
747 | case V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_SEL: return "VPX Golden Frame Indicator"; | 747 | case V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_SEL: return "VPX Golden Frame Indicator"; |
748 | case V4L2_CID_MPEG_VIDEO_VPX_MIN_QP: return "VPX Minimum QP Value"; | ||
749 | case V4L2_CID_MPEG_VIDEO_VPX_MAX_QP: return "VPX Maximum QP Value"; | ||
750 | case V4L2_CID_MPEG_VIDEO_VPX_I_FRAME_QP: return "VPX I-Frame QP Value"; | ||
751 | case V4L2_CID_MPEG_VIDEO_VPX_P_FRAME_QP: return "VPX P-Frame QP Value"; | ||
748 | 752 | ||
749 | /* CAMERA controls */ | 753 | /* CAMERA controls */ |
750 | /* Keep the order of the 'case's the same as in videodev2.h! */ | 754 | /* Keep the order of the 'case's the same as in videodev2.h! */ |
diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h index 8e4d1d974eda..28cddb45afe0 100644 --- a/include/uapi/linux/v4l2-controls.h +++ b/include/uapi/linux/v4l2-controls.h | |||
@@ -558,6 +558,10 @@ enum v4l2_vp8_golden_frame_sel { | |||
558 | V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_USE_PREV = 0, | 558 | V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_USE_PREV = 0, |
559 | V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_USE_REF_PERIOD = 1, | 559 | V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_USE_REF_PERIOD = 1, |
560 | }; | 560 | }; |
561 | #define V4L2_CID_MPEG_VIDEO_VPX_MIN_QP (V4L2_CID_MPEG_BASE+507) | ||
562 | #define V4L2_CID_MPEG_VIDEO_VPX_MAX_QP (V4L2_CID_MPEG_BASE+508) | ||
563 | #define V4L2_CID_MPEG_VIDEO_VPX_I_FRAME_QP (V4L2_CID_MPEG_BASE+509) | ||
564 | #define V4L2_CID_MPEG_VIDEO_VPX_P_FRAME_QP (V4L2_CID_MPEG_BASE+510) | ||
561 | 565 | ||
562 | /* MPEG-class control IDs specific to the CX2341x driver as defined by V4L2 */ | 566 | /* MPEG-class control IDs specific to the CX2341x driver as defined by V4L2 */ |
563 | #define V4L2_CID_MPEG_CX2341X_BASE (V4L2_CTRL_CLASS_MPEG | 0x1000) | 567 | #define V4L2_CID_MPEG_CX2341X_BASE (V4L2_CTRL_CLASS_MPEG | 0x1000) |