media: mediatek: vcodec: Different codec using different capture format
authorYunfei Dong <yunfei.dong@mediatek.com>
Wed, 18 May 2022 12:30:02 +0000 (13:30 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Mon, 20 Jun 2022 09:30:32 +0000 (10:30 +0100)
Vp8 need to use MM21, but vp9 and h264 need to use HyFbc mode
for mt8195. Vp8/vp9/h264 use the same MM21 format for mt8192.

Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/platform/mediatek/vcodec/mtk_vcodec_dec.c

index 52e5d36..2546492 100644 (file)
@@ -35,6 +35,44 @@ mtk_vdec_find_format(struct v4l2_format *f,
        return NULL;
 }
 
+static bool mtk_vdec_get_cap_fmt(struct mtk_vcodec_ctx *ctx, int format_index)
+{
+       const struct mtk_vcodec_dec_pdata *dec_pdata = ctx->dev->vdec_pdata;
+       const struct mtk_video_fmt *fmt;
+       struct mtk_q_data *q_data;
+       int num_frame_count = 0, i;
+       bool ret = true;
+
+       for (i = 0; i < *dec_pdata->num_formats; i++) {
+               if (dec_pdata->vdec_formats[i].type != MTK_FMT_FRAME)
+                       continue;
+
+               num_frame_count++;
+       }
+
+       if (num_frame_count == 1)
+               return true;
+
+       fmt = &dec_pdata->vdec_formats[format_index];
+       q_data = &ctx->q_data[MTK_Q_DATA_SRC];
+       switch (q_data->fmt->fourcc) {
+       case V4L2_PIX_FMT_VP8_FRAME:
+               if (fmt->fourcc == V4L2_PIX_FMT_MM21)
+                       ret = true;
+               break;
+       case V4L2_PIX_FMT_H264_SLICE:
+       case V4L2_PIX_FMT_VP9_FRAME:
+               if (fmt->fourcc == V4L2_PIX_FMT_MM21)
+                       ret = false;
+               break;
+       default:
+               ret = true;
+               break;
+       };
+
+       return ret;
+}
+
 static struct mtk_q_data *mtk_vdec_get_q_data(struct mtk_vcodec_ctx *ctx,
                                              enum v4l2_buf_type type)
 {
@@ -566,6 +604,9 @@ static int vidioc_enum_fmt(struct v4l2_fmtdesc *f, void *priv,
                    dec_pdata->vdec_formats[i].type != MTK_FMT_FRAME)
                        continue;
 
+               if (!output_queue && !mtk_vdec_get_cap_fmt(ctx, i))
+                       continue;
+
                if (j == f->index)
                        break;
                ++j;