lkml.org 
[lkml]   [2021]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2, 04/12] media: mtk-vcodec: Read max resolution from dec_capability
    Date
    From: Yunfei Dong <yunfei.dong@mediatek.corp-partner.google.com>

    Supported max resolution for different platforms are not the same: 2K
    or 4K, getting it according to dec_capability.

    Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
    ---
    .../platform/mtk-vcodec/mtk_vcodec_dec.c | 31 +++++++++++--------
    .../platform/mtk-vcodec/mtk_vcodec_drv.h | 4 +++
    2 files changed, 22 insertions(+), 13 deletions(-)

    diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec.c
    index 87891ebd7246..ad7cb9d4f280 100644
    --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec.c
    +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec.c
    @@ -152,13 +152,15 @@ void mtk_vcodec_dec_set_default_params(struct mtk_vcodec_ctx *ctx)
    q_data->coded_height = DFT_CFG_HEIGHT;
    q_data->fmt = ctx->dev->vdec_pdata->default_cap_fmt;
    q_data->field = V4L2_FIELD_NONE;
    + ctx->max_width = MTK_VDEC_MAX_W;
    + ctx->max_height = MTK_VDEC_MAX_H;

    v4l_bound_align_image(&q_data->coded_width,
    MTK_VDEC_MIN_W,
    - MTK_VDEC_MAX_W, 4,
    + ctx->max_width, 4,
    &q_data->coded_height,
    MTK_VDEC_MIN_H,
    - MTK_VDEC_MAX_H, 5, 6);
    + ctx->max_height, 5, 6);

    q_data->sizeimage[0] = q_data->coded_width * q_data->coded_height;
    q_data->bytesperline[0] = q_data->coded_width;
    @@ -217,17 +219,17 @@ static int vidioc_vdec_subscribe_evt(struct v4l2_fh *fh,
    }
    }

    -static int vidioc_try_fmt(struct v4l2_format *f,
    - const struct mtk_video_fmt *fmt)
    +static int vidioc_try_fmt(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;

    pix_fmt_mp->field = V4L2_FIELD_NONE;

    pix_fmt_mp->width =
    - clamp(pix_fmt_mp->width, MTK_VDEC_MIN_W, MTK_VDEC_MAX_W);
    + clamp(pix_fmt_mp->width, MTK_VDEC_MIN_W, ctx->max_width);
    pix_fmt_mp->height =
    - clamp(pix_fmt_mp->height, MTK_VDEC_MIN_H, MTK_VDEC_MAX_H);
    + clamp(pix_fmt_mp->height, MTK_VDEC_MIN_H, ctx->max_height);

    if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
    pix_fmt_mp->num_planes = 1;
    @@ -245,16 +247,16 @@ static int vidioc_try_fmt(struct v4l2_format *f,
    tmp_h = pix_fmt_mp->height;
    v4l_bound_align_image(&pix_fmt_mp->width,
    MTK_VDEC_MIN_W,
    - MTK_VDEC_MAX_W, 6,
    + ctx->max_width, 6,
    &pix_fmt_mp->height,
    MTK_VDEC_MIN_H,
    - MTK_VDEC_MAX_H, 6, 9);
    + ctx->max_height, 6, 9);

    if (pix_fmt_mp->width < tmp_w &&
    - (pix_fmt_mp->width + 64) <= MTK_VDEC_MAX_W)
    + (pix_fmt_mp->width + 64) <= ctx->max_width)
    pix_fmt_mp->width += 64;
    if (pix_fmt_mp->height < tmp_h &&
    - (pix_fmt_mp->height + 64) <= MTK_VDEC_MAX_H)
    + (pix_fmt_mp->height + 64) <= ctx->max_height)
    pix_fmt_mp->height += 64;

    mtk_v4l2_debug(0,
    @@ -294,7 +296,7 @@ static int vidioc_try_fmt_vid_cap_mplane(struct file *file, void *priv,
    fmt = mtk_vdec_find_format(f, dec_pdata);
    }

    - return vidioc_try_fmt(f, fmt);
    + return vidioc_try_fmt(ctx, f, fmt);
    }

    static int vidioc_try_fmt_vid_out_mplane(struct file *file, void *priv,
    @@ -317,7 +319,7 @@ static int vidioc_try_fmt_vid_out_mplane(struct file *file, void *priv,
    return -EINVAL;
    }

    - return vidioc_try_fmt(f, fmt);
    + return vidioc_try_fmt(ctx, f, fmt);
    }

    static int vidioc_vdec_g_selection(struct file *file, void *priv,
    @@ -445,7 +447,7 @@ static int vidioc_vdec_s_fmt(struct file *file, void *priv,
    return -EINVAL;

    q_data->fmt = fmt;
    - vidioc_try_fmt(f, q_data->fmt);
    + vidioc_try_fmt(ctx, f, q_data->fmt);
    if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
    q_data->sizeimage[0] = pix_mp->plane_fmt[0].sizeimage;
    q_data->coded_width = pix_mp->width;
    @@ -547,6 +549,9 @@ static int vidioc_enum_framesizes(struct file *file, void *priv,
    fsize->stepwise.min_height,
    fsize->stepwise.max_height,
    fsize->stepwise.step_height);
    +
    + ctx->max_width = fsize->stepwise.max_width;
    + ctx->max_height = fsize->stepwise.max_height;
    return 0;
    }

    diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h
    index 95e07cf2cd3e..0a128ad2d66a 100644
    --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h
    +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h
    @@ -288,6 +288,8 @@ struct vdec_pic_info {
    * mtk_video_dec_buf.
    * @hw_id: hardware index used to identify different hardware.
    *
    + * @max_width: hardware supported max width
    + * @max_height: hardware supported max height
    * @msg_queue: msg queue used to store lat buffer information.
    */
    struct mtk_vcodec_ctx {
    @@ -334,6 +336,8 @@ struct mtk_vcodec_ctx {
    struct mutex lock;
    int hw_id;

    + unsigned int max_width;
    + unsigned int max_height;
    struct vdec_msg_queue msg_queue;
    };

    --
    2.25.1
    \
     
     \ /
      Last update: 2021-12-28 10:42    [W:3.859 / U:0.412 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site