diff mbox

venus: venc: add support for ext controls

Message ID 1530530783-9480-1-git-send-email-vgarodia@codeaurora.org (mailing list archive)
State New, archived
Headers show

Commit Message

Vikash Garodia July 2, 2018, 11:26 a.m. UTC
There is a requirement to add frame level rate control.

Signed-off-by: Vikash Garodia <vgarodia@codeaurora.org>
---
 drivers/media/platform/qcom/venus/venc.c | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

Comments

Hans Verkuil July 2, 2018, 11:44 a.m. UTC | #1
On 02/07/18 13:26, Vikash Garodia wrote:
> There is a requirement to add frame level rate control.
> 
> Signed-off-by: Vikash Garodia <vgarodia@codeaurora.org>
> ---
>  drivers/media/platform/qcom/venus/venc.c | 28 ++++++++++++++++++++++++++++
>  1 file changed, 28 insertions(+)
> 
> diff --git a/drivers/media/platform/qcom/venus/venc.c b/drivers/media/platform/qcom/venus/venc.c
> index a2c6a4b..eaf2fa8 100644
> --- a/drivers/media/platform/qcom/venus/venc.c
> +++ b/drivers/media/platform/qcom/venus/venc.c
> @@ -546,6 +546,33 @@ static int venc_g_parm(struct file *file, void *fh, struct v4l2_streamparm *a)
>  	return 0;
>  }
>  
> +static int venc_s_ext_ctrls(struct file *file, void *fh,
> +				struct v4l2_ext_controls *ctrl)
> +{
> +	struct venus_inst *inst = to_inst(file);
> +	struct v4l2_ext_control *control;
> +	u32 ptype, i, ret;
> +	struct hfi_enable en = { .enable = 1 };
> +	void *pdata = NULL;
> +
> +	control = ctrl->controls;
> +	for (i = 0; i < ctrl->count; i++) {
> +		switch (control[i].id) {
> +		case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:
> +			ptype = HFI_PROPERTY_PARAM_VENC_DISABLE_RC_TIMESTAMP;
> +			en.enable = control[i].value;
> +			pdata = &en;
> +			break;
> +		default:
> +			return -EINVAL;
> +		}
> +	}
> +	ret = hfi_session_set_property(inst, ptype, pdata);
> +	if (ret)
> +		return ret;
> +	return 0;
> +}
> +
>  static int venc_enum_framesizes(struct file *file, void *fh,
>  				struct v4l2_frmsizeenum *fsize)
>  {
> @@ -638,6 +665,7 @@ static int venc_enum_frameintervals(struct file *file, void *fh,
>  	.vidioc_streamoff = v4l2_m2m_ioctl_streamoff,
>  	.vidioc_s_parm = venc_s_parm,
>  	.vidioc_g_parm = venc_g_parm,
> +	.vidioc_s_ext_ctrl = venc_s_ext_ctrls,

No, that's not how you do this. See venc_ctrls.c on how to handle controls.

Nacked-by: Hans Verkuil <hans.verkuil@cisco.com>

Regards,

	Hans

>  	.vidioc_enum_framesizes = venc_enum_framesizes,
>  	.vidioc_enum_frameintervals = venc_enum_frameintervals,
>  	.vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
>
kernel test robot July 2, 2018, 3:39 p.m. UTC | #2
Hi Vikash,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on linuxtv-media/master]
[also build test ERROR on v4.18-rc3 next-20180702]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Vikash-Garodia/venus-venc-add-support-for-ext-controls/20180702-213140
base:   git://linuxtv.org/media_tree.git master
config: i386-allmodconfig (attached as .config)
compiler: gcc-7 (Debian 7.3.0-16) 7.3.0
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All errors (new ones prefixed by >>):

>> drivers/media/platform/qcom/venus/venc.c:653:3: error: 'const struct v4l2_ioctl_ops' has no member named 'vidioc_s_ext_ctrl'; did you mean 'vidioc_s_ext_ctrls'?
     .vidioc_s_ext_ctrl = venc_s_ext_ctrls,
      ^~~~~~~~~~~~~~~~~
      vidioc_s_ext_ctrls
>> drivers/media/platform/qcom/venus/venc.c:653:23: error: positional initialization of field in 'struct' declared with 'designated_init' attribute [-Werror=designated-init]
     .vidioc_s_ext_ctrl = venc_s_ext_ctrls,
                          ^~~~~~~~~~~~~~~~
   drivers/media/platform/qcom/venus/venc.c:653:23: note: (near initialization for 'venc_ioctl_ops')
>> drivers/media/platform/qcom/venus/venc.c:653:23: error: initialization from incompatible pointer type [-Werror=incompatible-pointer-types]
   drivers/media/platform/qcom/venus/venc.c:653:23: note: (near initialization for 'venc_ioctl_ops.vidioc_try_fmt_vid_out_mplane')
   cc1: some warnings being treated as errors

vim +653 drivers/media/platform/qcom/venus/venc.c

   629	
   630	static const struct v4l2_ioctl_ops venc_ioctl_ops = {
   631		.vidioc_querycap = venc_querycap,
   632		.vidioc_enum_fmt_vid_cap_mplane = venc_enum_fmt,
   633		.vidioc_enum_fmt_vid_out_mplane = venc_enum_fmt,
   634		.vidioc_s_fmt_vid_cap_mplane = venc_s_fmt,
   635		.vidioc_s_fmt_vid_out_mplane = venc_s_fmt,
   636		.vidioc_g_fmt_vid_cap_mplane = venc_g_fmt,
   637		.vidioc_g_fmt_vid_out_mplane = venc_g_fmt,
   638		.vidioc_try_fmt_vid_cap_mplane = venc_try_fmt,
   639		.vidioc_try_fmt_vid_out_mplane = venc_try_fmt,
   640		.vidioc_g_selection = venc_g_selection,
   641		.vidioc_s_selection = venc_s_selection,
   642		.vidioc_reqbufs = v4l2_m2m_ioctl_reqbufs,
   643		.vidioc_querybuf = v4l2_m2m_ioctl_querybuf,
   644		.vidioc_create_bufs = v4l2_m2m_ioctl_create_bufs,
   645		.vidioc_prepare_buf = v4l2_m2m_ioctl_prepare_buf,
   646		.vidioc_qbuf = v4l2_m2m_ioctl_qbuf,
   647		.vidioc_expbuf = v4l2_m2m_ioctl_expbuf,
   648		.vidioc_dqbuf = v4l2_m2m_ioctl_dqbuf,
   649		.vidioc_streamon = v4l2_m2m_ioctl_streamon,
   650		.vidioc_streamoff = v4l2_m2m_ioctl_streamoff,
   651		.vidioc_s_parm = venc_s_parm,
   652		.vidioc_g_parm = venc_g_parm,
 > 653		.vidioc_s_ext_ctrl = venc_s_ext_ctrls,
   654		.vidioc_enum_framesizes = venc_enum_framesizes,
   655		.vidioc_enum_frameintervals = venc_enum_frameintervals,
   656		.vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
   657		.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
   658	};
   659	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
kernel test robot July 2, 2018, 5 p.m. UTC | #3
Hi Vikash,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on linuxtv-media/master]
[also build test ERROR on v4.18-rc3 next-20180702]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Vikash-Garodia/venus-venc-add-support-for-ext-controls/20180702-213140
base:   git://linuxtv.org/media_tree.git master
config: ia64-allmodconfig (attached as .config)
compiler: ia64-linux-gcc (GCC) 8.1.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        GCC_VERSION=8.1.0 make.cross ARCH=ia64 

All errors (new ones prefixed by >>):

   drivers/media/platform/qcom/venus/venc.c:653:3: error: 'const struct v4l2_ioctl_ops' has no member named 'vidioc_s_ext_ctrl'; did you mean 'vidioc_s_ext_ctrls'?
     .vidioc_s_ext_ctrl = venc_s_ext_ctrls,
      ^~~~~~~~~~~~~~~~~
      vidioc_s_ext_ctrls
>> drivers/media/platform/qcom/venus/venc.c:653:23: error: initialization of 'int (*)(struct file *, void *, struct v4l2_streamparm *)' from incompatible pointer type 'int (*)(struct file *, void *, struct v4l2_ext_controls *)' [-Werror=incompatible-pointer-types]
     .vidioc_s_ext_ctrl = venc_s_ext_ctrls,
                          ^~~~~~~~~~~~~~~~
   drivers/media/platform/qcom/venus/venc.c:653:23: note: (near initialization for 'venc_ioctl_ops.vidioc_s_parm')
   cc1: some warnings being treated as errors

vim +653 drivers/media/platform/qcom/venus/venc.c

   629	
   630	static const struct v4l2_ioctl_ops venc_ioctl_ops = {
   631		.vidioc_querycap = venc_querycap,
   632		.vidioc_enum_fmt_vid_cap_mplane = venc_enum_fmt,
   633		.vidioc_enum_fmt_vid_out_mplane = venc_enum_fmt,
   634		.vidioc_s_fmt_vid_cap_mplane = venc_s_fmt,
   635		.vidioc_s_fmt_vid_out_mplane = venc_s_fmt,
   636		.vidioc_g_fmt_vid_cap_mplane = venc_g_fmt,
   637		.vidioc_g_fmt_vid_out_mplane = venc_g_fmt,
   638		.vidioc_try_fmt_vid_cap_mplane = venc_try_fmt,
   639		.vidioc_try_fmt_vid_out_mplane = venc_try_fmt,
   640		.vidioc_g_selection = venc_g_selection,
   641		.vidioc_s_selection = venc_s_selection,
   642		.vidioc_reqbufs = v4l2_m2m_ioctl_reqbufs,
   643		.vidioc_querybuf = v4l2_m2m_ioctl_querybuf,
   644		.vidioc_create_bufs = v4l2_m2m_ioctl_create_bufs,
   645		.vidioc_prepare_buf = v4l2_m2m_ioctl_prepare_buf,
   646		.vidioc_qbuf = v4l2_m2m_ioctl_qbuf,
   647		.vidioc_expbuf = v4l2_m2m_ioctl_expbuf,
   648		.vidioc_dqbuf = v4l2_m2m_ioctl_dqbuf,
   649		.vidioc_streamon = v4l2_m2m_ioctl_streamon,
   650		.vidioc_streamoff = v4l2_m2m_ioctl_streamoff,
   651		.vidioc_s_parm = venc_s_parm,
   652		.vidioc_g_parm = venc_g_parm,
 > 653		.vidioc_s_ext_ctrl = venc_s_ext_ctrls,
   654		.vidioc_enum_framesizes = venc_enum_framesizes,
   655		.vidioc_enum_frameintervals = venc_enum_frameintervals,
   656		.vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
   657		.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
   658	};
   659	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
diff mbox

Patch

diff --git a/drivers/media/platform/qcom/venus/venc.c b/drivers/media/platform/qcom/venus/venc.c
index a2c6a4b..eaf2fa8 100644
--- a/drivers/media/platform/qcom/venus/venc.c
+++ b/drivers/media/platform/qcom/venus/venc.c
@@ -546,6 +546,33 @@  static int venc_g_parm(struct file *file, void *fh, struct v4l2_streamparm *a)
 	return 0;
 }
 
+static int venc_s_ext_ctrls(struct file *file, void *fh,
+				struct v4l2_ext_controls *ctrl)
+{
+	struct venus_inst *inst = to_inst(file);
+	struct v4l2_ext_control *control;
+	u32 ptype, i, ret;
+	struct hfi_enable en = { .enable = 1 };
+	void *pdata = NULL;
+
+	control = ctrl->controls;
+	for (i = 0; i < ctrl->count; i++) {
+		switch (control[i].id) {
+		case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:
+			ptype = HFI_PROPERTY_PARAM_VENC_DISABLE_RC_TIMESTAMP;
+			en.enable = control[i].value;
+			pdata = &en;
+			break;
+		default:
+			return -EINVAL;
+		}
+	}
+	ret = hfi_session_set_property(inst, ptype, pdata);
+	if (ret)
+		return ret;
+	return 0;
+}
+
 static int venc_enum_framesizes(struct file *file, void *fh,
 				struct v4l2_frmsizeenum *fsize)
 {
@@ -638,6 +665,7 @@  static int venc_enum_frameintervals(struct file *file, void *fh,
 	.vidioc_streamoff = v4l2_m2m_ioctl_streamoff,
 	.vidioc_s_parm = venc_s_parm,
 	.vidioc_g_parm = venc_g_parm,
+	.vidioc_s_ext_ctrl = venc_s_ext_ctrls,
 	.vidioc_enum_framesizes = venc_enum_framesizes,
 	.vidioc_enum_frameintervals = venc_enum_frameintervals,
 	.vidioc_subscribe_event = v4l2_ctrl_subscribe_event,