Message ID | 20211117130635.11633-6-dafna.hirschfeld@collabora.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | media: mtk-vcodec: few fixes | expand |
On Wed, Nov 17, 2021 at 10:07 PM Dafna Hirschfeld <dafna.hirschfeld@collabora.com> wrote: > > The function vidioc_try_fmt has a big 'if-else' for > the capture and output cases. There is hardly any code > outside of that condition. It is therefore better to split > that functions into two different functions, one for each case. > > Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com> Makes much more sense that way, thanks! Reviewed-by: Alexandre Courbot <acourbot@chromium.org> > --- > .../platform/mtk-vcodec/mtk_vcodec_enc.c | 149 +++++++++--------- > 1 file changed, 72 insertions(+), 77 deletions(-) > > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c > index fb3cf804c96a..be28f2401839 100644 > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c > @@ -263,87 +263,82 @@ static struct mtk_q_data *mtk_venc_get_q_data(struct mtk_vcodec_ctx *ctx, > return &ctx->q_data[MTK_Q_DATA_DST]; > } > > +static void vidioc_try_fmt_cap(struct v4l2_format *f) > +{ > + f->fmt.pix_mp.field = V4L2_FIELD_NONE; > + f->fmt.pix_mp.num_planes = 1; > + f->fmt.pix_mp.plane_fmt[0].bytesperline = 0; > + f->fmt.pix_mp.flags = 0; > +} > + > /* V4L2 specification suggests the driver corrects the format struct if any of > * the dimensions is unsupported > */ > -static int vidioc_try_fmt(struct mtk_vcodec_ctx *ctx, struct v4l2_format *f, > - const struct mtk_video_fmt *fmt) > +static int vidioc_try_fmt_out(struct mtk_vcodec_ctx *ctx, struct v4l2_format *f, > + const struct mtk_video_fmt *fmt) > { > struct v4l2_pix_format_mplane *pix_fmt_mp = &f->fmt.pix_mp; > + int tmp_w, tmp_h; > + unsigned int max_width, max_height; > > pix_fmt_mp->field = V4L2_FIELD_NONE; > > - if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) { > - pix_fmt_mp->num_planes = 1; > - pix_fmt_mp->plane_fmt[0].bytesperline = 0; > - } else if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) { > - int tmp_w, tmp_h; > - unsigned int max_width, max_height; > - > - if (ctx->dev->enc_capability & MTK_VENC_4K_CAPABILITY_ENABLE) { > - max_width = MTK_VENC_4K_MAX_W; > - max_height = MTK_VENC_4K_MAX_H; > - } else { > - max_width = MTK_VENC_HD_MAX_W; > - max_height = MTK_VENC_HD_MAX_H; > - } > + if (ctx->dev->enc_capability & MTK_VENC_4K_CAPABILITY_ENABLE) { > + max_width = MTK_VENC_4K_MAX_W; > + max_height = MTK_VENC_4K_MAX_H; > + } else { > + max_width = MTK_VENC_HD_MAX_W; > + max_height = MTK_VENC_HD_MAX_H; > + } > > - pix_fmt_mp->height = clamp(pix_fmt_mp->height, > - MTK_VENC_MIN_H, > - max_height); > - pix_fmt_mp->width = clamp(pix_fmt_mp->width, > - MTK_VENC_MIN_W, > - max_width); > + pix_fmt_mp->height = clamp(pix_fmt_mp->height, MTK_VENC_MIN_H, max_height); > + pix_fmt_mp->width = clamp(pix_fmt_mp->width, MTK_VENC_MIN_W, max_width); > > - /* find next closer width align 16, heign align 32, size align > - * 64 rectangle > - */ > - tmp_w = pix_fmt_mp->width; > - tmp_h = pix_fmt_mp->height; > - v4l_bound_align_image(&pix_fmt_mp->width, > - MTK_VENC_MIN_W, > - max_width, 4, > - &pix_fmt_mp->height, > - MTK_VENC_MIN_H, > - max_height, 5, 6); > - > - if (pix_fmt_mp->width < tmp_w && > - (pix_fmt_mp->width + 16) <= max_width) > - pix_fmt_mp->width += 16; > - if (pix_fmt_mp->height < tmp_h && > - (pix_fmt_mp->height + 32) <= max_height) > - pix_fmt_mp->height += 32; > - > - mtk_v4l2_debug(0, > - "before resize width=%d, height=%d, after resize width=%d, height=%d, sizeimage=%d %d", > - tmp_w, tmp_h, pix_fmt_mp->width, > - pix_fmt_mp->height, > - pix_fmt_mp->plane_fmt[0].sizeimage, > - pix_fmt_mp->plane_fmt[1].sizeimage); > - > - pix_fmt_mp->num_planes = fmt->num_planes; > - pix_fmt_mp->plane_fmt[0].sizeimage = > - pix_fmt_mp->width * pix_fmt_mp->height + > - ((ALIGN(pix_fmt_mp->width, 16) * 2) * 16); > - pix_fmt_mp->plane_fmt[0].bytesperline = pix_fmt_mp->width; > - > - if (pix_fmt_mp->num_planes == 2) { > - pix_fmt_mp->plane_fmt[1].sizeimage = > - (pix_fmt_mp->width * pix_fmt_mp->height) / 2 + > - (ALIGN(pix_fmt_mp->width, 16) * 16); > - pix_fmt_mp->plane_fmt[2].sizeimage = 0; > - pix_fmt_mp->plane_fmt[1].bytesperline = > - pix_fmt_mp->width; > - pix_fmt_mp->plane_fmt[2].bytesperline = 0; > - } else if (pix_fmt_mp->num_planes == 3) { > - pix_fmt_mp->plane_fmt[1].sizeimage = > - pix_fmt_mp->plane_fmt[2].sizeimage = > - (pix_fmt_mp->width * pix_fmt_mp->height) / 4 + > - ((ALIGN(pix_fmt_mp->width, 16) / 2) * 16); > - pix_fmt_mp->plane_fmt[1].bytesperline = > - pix_fmt_mp->plane_fmt[2].bytesperline = > - pix_fmt_mp->width / 2; > - } > + /* find next closer width align 16, heign align 32, size align > + * 64 rectangle > + */ > + tmp_w = pix_fmt_mp->width; > + tmp_h = pix_fmt_mp->height; > + v4l_bound_align_image(&pix_fmt_mp->width, > + MTK_VENC_MIN_W, > + max_width, 4, > + &pix_fmt_mp->height, > + MTK_VENC_MIN_H, > + max_height, 5, 6); > + > + if (pix_fmt_mp->width < tmp_w && (pix_fmt_mp->width + 16) <= max_width) > + pix_fmt_mp->width += 16; > + if (pix_fmt_mp->height < tmp_h && (pix_fmt_mp->height + 32) <= max_height) > + pix_fmt_mp->height += 32; > + > + mtk_v4l2_debug(0, "before resize w=%d, h=%d, after resize w=%d, h=%d, sizeimage=%d %d", > + tmp_w, tmp_h, pix_fmt_mp->width, > + pix_fmt_mp->height, > + pix_fmt_mp->plane_fmt[0].sizeimage, > + pix_fmt_mp->plane_fmt[1].sizeimage); > + > + pix_fmt_mp->num_planes = fmt->num_planes; > + pix_fmt_mp->plane_fmt[0].sizeimage = > + pix_fmt_mp->width * pix_fmt_mp->height + > + ((ALIGN(pix_fmt_mp->width, 16) * 2) * 16); > + pix_fmt_mp->plane_fmt[0].bytesperline = pix_fmt_mp->width; > + > + if (pix_fmt_mp->num_planes == 2) { > + pix_fmt_mp->plane_fmt[1].sizeimage = > + (pix_fmt_mp->width * pix_fmt_mp->height) / 2 + > + (ALIGN(pix_fmt_mp->width, 16) * 16); > + pix_fmt_mp->plane_fmt[2].sizeimage = 0; > + pix_fmt_mp->plane_fmt[1].bytesperline = > + pix_fmt_mp->width; > + pix_fmt_mp->plane_fmt[2].bytesperline = 0; > + } else if (pix_fmt_mp->num_planes == 3) { > + pix_fmt_mp->plane_fmt[1].sizeimage = > + pix_fmt_mp->plane_fmt[2].sizeimage = > + (pix_fmt_mp->width * pix_fmt_mp->height) / 4 + > + ((ALIGN(pix_fmt_mp->width, 16) / 2) * 16); > + pix_fmt_mp->plane_fmt[1].bytesperline = > + pix_fmt_mp->plane_fmt[2].bytesperline = > + pix_fmt_mp->width / 2; > } > > pix_fmt_mp->flags = 0; > @@ -432,9 +427,7 @@ static int vidioc_venc_s_fmt_cap(struct file *file, void *priv, > } > > q_data->fmt = fmt; > - ret = vidioc_try_fmt(ctx, f, q_data->fmt); > - if (ret) > - return ret; > + vidioc_try_fmt_cap(f); > > q_data->coded_width = f->fmt.pix_mp.width; > q_data->coded_height = f->fmt.pix_mp.height; > @@ -494,7 +487,7 @@ static int vidioc_venc_s_fmt_out(struct file *file, void *priv, > f->fmt.pix.pixelformat = fmt->fourcc; > } > > - ret = vidioc_try_fmt(ctx, f, fmt); > + ret = vidioc_try_fmt_out(ctx, f, fmt); > if (ret) > return ret; > > @@ -572,7 +565,9 @@ static int vidioc_try_fmt_vid_cap_mplane(struct file *file, void *priv, > f->fmt.pix_mp.quantization = ctx->quantization; > f->fmt.pix_mp.xfer_func = ctx->xfer_func; > > - return vidioc_try_fmt(ctx, f, fmt); > + vidioc_try_fmt_cap(f); > + > + return 0; > } > > static int vidioc_try_fmt_vid_out_mplane(struct file *file, void *priv, > @@ -594,7 +589,7 @@ static int vidioc_try_fmt_vid_out_mplane(struct file *file, void *priv, > f->fmt.pix_mp.xfer_func = V4L2_XFER_FUNC_DEFAULT; > } > > - return vidioc_try_fmt(ctx, f, fmt); > + return vidioc_try_fmt_out(ctx, f, fmt); > } > > static int vidioc_venc_g_selection(struct file *file, void *priv, > -- > 2.17.1 >
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c index fb3cf804c96a..be28f2401839 100644 --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c @@ -263,87 +263,82 @@ static struct mtk_q_data *mtk_venc_get_q_data(struct mtk_vcodec_ctx *ctx, return &ctx->q_data[MTK_Q_DATA_DST]; } +static void vidioc_try_fmt_cap(struct v4l2_format *f) +{ + f->fmt.pix_mp.field = V4L2_FIELD_NONE; + f->fmt.pix_mp.num_planes = 1; + f->fmt.pix_mp.plane_fmt[0].bytesperline = 0; + f->fmt.pix_mp.flags = 0; +} + /* V4L2 specification suggests the driver corrects the format struct if any of * the dimensions is unsupported */ -static int vidioc_try_fmt(struct mtk_vcodec_ctx *ctx, struct v4l2_format *f, - const struct mtk_video_fmt *fmt) +static int vidioc_try_fmt_out(struct mtk_vcodec_ctx *ctx, struct v4l2_format *f, + const struct mtk_video_fmt *fmt) { struct v4l2_pix_format_mplane *pix_fmt_mp = &f->fmt.pix_mp; + int tmp_w, tmp_h; + unsigned int max_width, max_height; pix_fmt_mp->field = V4L2_FIELD_NONE; - if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) { - pix_fmt_mp->num_planes = 1; - pix_fmt_mp->plane_fmt[0].bytesperline = 0; - } else if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) { - int tmp_w, tmp_h; - unsigned int max_width, max_height; - - if (ctx->dev->enc_capability & MTK_VENC_4K_CAPABILITY_ENABLE) { - max_width = MTK_VENC_4K_MAX_W; - max_height = MTK_VENC_4K_MAX_H; - } else { - max_width = MTK_VENC_HD_MAX_W; - max_height = MTK_VENC_HD_MAX_H; - } + if (ctx->dev->enc_capability & MTK_VENC_4K_CAPABILITY_ENABLE) { + max_width = MTK_VENC_4K_MAX_W; + max_height = MTK_VENC_4K_MAX_H; + } else { + max_width = MTK_VENC_HD_MAX_W; + max_height = MTK_VENC_HD_MAX_H; + } - pix_fmt_mp->height = clamp(pix_fmt_mp->height, - MTK_VENC_MIN_H, - max_height); - pix_fmt_mp->width = clamp(pix_fmt_mp->width, - MTK_VENC_MIN_W, - max_width); + pix_fmt_mp->height = clamp(pix_fmt_mp->height, MTK_VENC_MIN_H, max_height); + pix_fmt_mp->width = clamp(pix_fmt_mp->width, MTK_VENC_MIN_W, max_width); - /* find next closer width align 16, heign align 32, size align - * 64 rectangle - */ - tmp_w = pix_fmt_mp->width; - tmp_h = pix_fmt_mp->height; - v4l_bound_align_image(&pix_fmt_mp->width, - MTK_VENC_MIN_W, - max_width, 4, - &pix_fmt_mp->height, - MTK_VENC_MIN_H, - max_height, 5, 6); - - if (pix_fmt_mp->width < tmp_w && - (pix_fmt_mp->width + 16) <= max_width) - pix_fmt_mp->width += 16; - if (pix_fmt_mp->height < tmp_h && - (pix_fmt_mp->height + 32) <= max_height) - pix_fmt_mp->height += 32; - - mtk_v4l2_debug(0, - "before resize width=%d, height=%d, after resize width=%d, height=%d, sizeimage=%d %d", - tmp_w, tmp_h, pix_fmt_mp->width, - pix_fmt_mp->height, - pix_fmt_mp->plane_fmt[0].sizeimage, - pix_fmt_mp->plane_fmt[1].sizeimage); - - pix_fmt_mp->num_planes = fmt->num_planes; - pix_fmt_mp->plane_fmt[0].sizeimage = - pix_fmt_mp->width * pix_fmt_mp->height + - ((ALIGN(pix_fmt_mp->width, 16) * 2) * 16); - pix_fmt_mp->plane_fmt[0].bytesperline = pix_fmt_mp->width; - - if (pix_fmt_mp->num_planes == 2) { - pix_fmt_mp->plane_fmt[1].sizeimage = - (pix_fmt_mp->width * pix_fmt_mp->height) / 2 + - (ALIGN(pix_fmt_mp->width, 16) * 16); - pix_fmt_mp->plane_fmt[2].sizeimage = 0; - pix_fmt_mp->plane_fmt[1].bytesperline = - pix_fmt_mp->width; - pix_fmt_mp->plane_fmt[2].bytesperline = 0; - } else if (pix_fmt_mp->num_planes == 3) { - pix_fmt_mp->plane_fmt[1].sizeimage = - pix_fmt_mp->plane_fmt[2].sizeimage = - (pix_fmt_mp->width * pix_fmt_mp->height) / 4 + - ((ALIGN(pix_fmt_mp->width, 16) / 2) * 16); - pix_fmt_mp->plane_fmt[1].bytesperline = - pix_fmt_mp->plane_fmt[2].bytesperline = - pix_fmt_mp->width / 2; - } + /* find next closer width align 16, heign align 32, size align + * 64 rectangle + */ + tmp_w = pix_fmt_mp->width; + tmp_h = pix_fmt_mp->height; + v4l_bound_align_image(&pix_fmt_mp->width, + MTK_VENC_MIN_W, + max_width, 4, + &pix_fmt_mp->height, + MTK_VENC_MIN_H, + max_height, 5, 6); + + if (pix_fmt_mp->width < tmp_w && (pix_fmt_mp->width + 16) <= max_width) + pix_fmt_mp->width += 16; + if (pix_fmt_mp->height < tmp_h && (pix_fmt_mp->height + 32) <= max_height) + pix_fmt_mp->height += 32; + + mtk_v4l2_debug(0, "before resize w=%d, h=%d, after resize w=%d, h=%d, sizeimage=%d %d", + tmp_w, tmp_h, pix_fmt_mp->width, + pix_fmt_mp->height, + pix_fmt_mp->plane_fmt[0].sizeimage, + pix_fmt_mp->plane_fmt[1].sizeimage); + + pix_fmt_mp->num_planes = fmt->num_planes; + pix_fmt_mp->plane_fmt[0].sizeimage = + pix_fmt_mp->width * pix_fmt_mp->height + + ((ALIGN(pix_fmt_mp->width, 16) * 2) * 16); + pix_fmt_mp->plane_fmt[0].bytesperline = pix_fmt_mp->width; + + if (pix_fmt_mp->num_planes == 2) { + pix_fmt_mp->plane_fmt[1].sizeimage = + (pix_fmt_mp->width * pix_fmt_mp->height) / 2 + + (ALIGN(pix_fmt_mp->width, 16) * 16); + pix_fmt_mp->plane_fmt[2].sizeimage = 0; + pix_fmt_mp->plane_fmt[1].bytesperline = + pix_fmt_mp->width; + pix_fmt_mp->plane_fmt[2].bytesperline = 0; + } else if (pix_fmt_mp->num_planes == 3) { + pix_fmt_mp->plane_fmt[1].sizeimage = + pix_fmt_mp->plane_fmt[2].sizeimage = + (pix_fmt_mp->width * pix_fmt_mp->height) / 4 + + ((ALIGN(pix_fmt_mp->width, 16) / 2) * 16); + pix_fmt_mp->plane_fmt[1].bytesperline = + pix_fmt_mp->plane_fmt[2].bytesperline = + pix_fmt_mp->width / 2; } pix_fmt_mp->flags = 0; @@ -432,9 +427,7 @@ static int vidioc_venc_s_fmt_cap(struct file *file, void *priv, } q_data->fmt = fmt; - ret = vidioc_try_fmt(ctx, f, q_data->fmt); - if (ret) - return ret; + vidioc_try_fmt_cap(f); q_data->coded_width = f->fmt.pix_mp.width; q_data->coded_height = f->fmt.pix_mp.height; @@ -494,7 +487,7 @@ static int vidioc_venc_s_fmt_out(struct file *file, void *priv, f->fmt.pix.pixelformat = fmt->fourcc; } - ret = vidioc_try_fmt(ctx, f, fmt); + ret = vidioc_try_fmt_out(ctx, f, fmt); if (ret) return ret; @@ -572,7 +565,9 @@ static int vidioc_try_fmt_vid_cap_mplane(struct file *file, void *priv, f->fmt.pix_mp.quantization = ctx->quantization; f->fmt.pix_mp.xfer_func = ctx->xfer_func; - return vidioc_try_fmt(ctx, f, fmt); + vidioc_try_fmt_cap(f); + + return 0; } static int vidioc_try_fmt_vid_out_mplane(struct file *file, void *priv, @@ -594,7 +589,7 @@ static int vidioc_try_fmt_vid_out_mplane(struct file *file, void *priv, f->fmt.pix_mp.xfer_func = V4L2_XFER_FUNC_DEFAULT; } - return vidioc_try_fmt(ctx, f, fmt); + return vidioc_try_fmt_out(ctx, f, fmt); } static int vidioc_venc_g_selection(struct file *file, void *priv,
The function vidioc_try_fmt has a big 'if-else' for the capture and output cases. There is hardly any code outside of that condition. It is therefore better to split that functions into two different functions, one for each case. Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com> --- .../platform/mtk-vcodec/mtk_vcodec_enc.c | 149 +++++++++--------- 1 file changed, 72 insertions(+), 77 deletions(-)