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) |
