aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArun Kumar K <arun.kk@samsung.com>2013-11-15 00:29:22 -0500
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-01-13 07:55:27 -0500
commit4773ab99aa8bda57de22bf54ddbaa1a941b25fb0 (patch)
treef0c674ec3f6096a4f69fd20a23d50b5ee445daa2
parentee97207c6e7e9a75f49e2abb7ecf944d319ed969 (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.xml32
-rw-r--r--drivers/media/platform/s5p-mfc/s5p_mfc_common.h4
-rw-r--r--drivers/media/platform/s5p-mfc/s5p_mfc_enc.c44
-rw-r--r--drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c20
-rw-r--r--drivers/media/v4l2-core/v4l2-ctrls.c4
-rw-r--r--include/uapi/linux/v4l2-controls.h4
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>&nbsp;</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>&nbsp;</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)