Re: [PATCH v2] media: venus: add support for selection rectangles

From: mgottam
Date: Fri Nov 09 2018 - 04:20:48 EST


On 2018-11-09 07:56, Tomasz Figa wrote:
Hi Malathi,

On Fri, Nov 9, 2018 at 4:39 PM Malathi Gottam <mgottam@xxxxxxxxxxxxxx> wrote:

Handles target type crop by setting the new active rectangle
to hardware. The new rectangle should be within YUV size.

Signed-off-by: Malathi Gottam <mgottam@xxxxxxxxxxxxxx>
---
drivers/media/platform/qcom/venus/venc.c | 26 ++++++++++++++++++++++----
1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/drivers/media/platform/qcom/venus/venc.c b/drivers/media/platform/qcom/venus/venc.c
index ce85962..d26c129 100644
--- a/drivers/media/platform/qcom/venus/venc.c
+++ b/drivers/media/platform/qcom/venus/venc.c
@@ -478,16 +478,34 @@ static int venc_g_fmt(struct file *file, void *fh, struct v4l2_format *f)
venc_s_selection(struct file *file, void *fh, struct v4l2_selection *s)
{
struct venus_inst *inst = to_inst(file);
+ int ret;
+ u32 buftype;

if (s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
return -EINVAL;

switch (s->target) {
case V4L2_SEL_TGT_CROP:
- if (s->r.width != inst->out_width ||
- s->r.height != inst->out_height ||
- s->r.top != 0 || s->r.left != 0)
- return -EINVAL;
+ if (s->r.left != 0) {
+ s->r.width += s->r.left;
+ s->r.left = 0;
+ }
+
+ if (s->r.top != 0) {
+ s->r.height += s->r.top;
+ s->r.top = 0;
+ }
+
+ if (s->r.width > inst->width)
+ s->r.width = inst->width;
+ else
+ inst->width = s->r.width;
+
+ if (s->r.height > inst->height)
+ s->r.height = inst->height;
+ else
+ inst->height = s->r.height;
+

From semantic point of view, it looks fine, but where is the rectangle
actually set to the hardware?

Best regards,
Tomasz

As this set selection call occurs before the hfi session initialization,
for now we are holding these values in driver.

As this call is followed by VIDIOC_REQBUFS(), as a part of this
we have venc_init_session

static int venc_init_session(struct venus_inst *inst)
{
int ret;

ret = hfi_session_init(inst, inst->fmt_cap->pixfmt);
if (ret)
return ret;

ret = venus_helper_set_input_resolution(inst, inst->width,
inst->height);
if (ret)
goto deinit;

ret = venus_helper_set_output_resolution(inst, inst->width,
inst->height,
HFI_BUFFER_OUTPUT);
if (ret)
goto deinit;

ret = venus_helper_set_color_format(inst, inst->fmt_out->pixfmt);
if (ret)
goto deinit;

ret = venc_set_properties(inst);


From here we set these values to hardware.