]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/media/platform/mtk-vcodec/mtk_vcodec_dec.c
Merge tag 'v5.2-rc4' into media/master
[linux.git] / drivers / media / platform / mtk-vcodec / mtk_vcodec_dec.c
index 7ae588e62ed8a509b7414075748c0184d458a36b..90d1a67db7e5f554f8e941e163b87969de850f2d 100644 (file)
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0-only
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Copyright (c) 2016 MediaTek Inc.
  * Author: PC Chen <pc.chen@mediatek.com>
@@ -24,7 +24,7 @@
 #define DFT_CFG_WIDTH  MTK_VDEC_MIN_W
 #define DFT_CFG_HEIGHT MTK_VDEC_MIN_H
 
-static struct mtk_video_fmt mtk_video_formats[] = {
+static const struct mtk_video_fmt mtk_video_formats[] = {
        {
                .fourcc = V4L2_PIX_FMT_H264,
                .type = MTK_FMT_DEC,
@@ -68,9 +68,9 @@ static const struct mtk_codec_framesizes mtk_vdec_framesizes[] = {
 #define NUM_SUPPORTED_FRAMESIZE ARRAY_SIZE(mtk_vdec_framesizes)
 #define NUM_FORMATS ARRAY_SIZE(mtk_video_formats)
 
-static struct mtk_video_fmt *mtk_vdec_find_format(struct v4l2_format *f)
+static const struct mtk_video_fmt *mtk_vdec_find_format(struct v4l2_format *f)
 {
-       struct mtk_video_fmt *fmt;
+       const struct mtk_video_fmt *fmt;
        unsigned int k;
 
        for (k = 0; k < NUM_FORMATS; k++) {
@@ -122,8 +122,9 @@ static struct vb2_buffer *get_display_buffer(struct mtk_vcodec_ctx *ctx)
        if (dstbuf->used) {
                vb2_set_plane_payload(&dstbuf->vb.vb2_buf, 0,
                                        ctx->picinfo.fb_sz[0]);
-               vb2_set_plane_payload(&dstbuf->vb.vb2_buf, 1,
-                                       ctx->picinfo.fb_sz[1]);
+               if (ctx->q_data[MTK_Q_DATA_DST].fmt->num_planes == 2)
+                       vb2_set_plane_payload(&dstbuf->vb.vb2_buf, 1,
+                                             ctx->picinfo.fb_sz[1]);
 
                mtk_v4l2_debug(2,
                                "[%d]status=%x queue id=%d to done_list %d",
@@ -271,7 +272,7 @@ static void mtk_vdec_flush_decoder(struct mtk_vcodec_ctx *ctx)
 static void mtk_vdec_update_fmt(struct mtk_vcodec_ctx *ctx,
                                unsigned int pixelformat)
 {
-       struct mtk_video_fmt *fmt;
+       const struct mtk_video_fmt *fmt;
        struct mtk_q_data *dst_q_data;
        unsigned int k;
 
@@ -394,7 +395,8 @@ static void mtk_vdec_worker(struct work_struct *work)
                vdec_if_decode(ctx, NULL, NULL, &res_chg);
                clean_display_buffer(ctx);
                vb2_set_plane_payload(&dst_buf_info->vb.vb2_buf, 0, 0);
-               vb2_set_plane_payload(&dst_buf_info->vb.vb2_buf, 1, 0);
+               if (ctx->q_data[MTK_Q_DATA_DST].fmt->num_planes == 2)
+                       vb2_set_plane_payload(&dst_buf_info->vb.vb2_buf, 1, 0);
                dst_buf->flags |= V4L2_BUF_FLAG_LAST;
                v4l2_m2m_buf_done(&dst_buf_info->vb, VB2_BUF_STATE_DONE);
                clean_free_buffer(ctx);
@@ -644,7 +646,8 @@ static int vidioc_vdec_subscribe_evt(struct v4l2_fh *fh,
        }
 }
 
-static int vidioc_try_fmt(struct v4l2_format *f, struct mtk_video_fmt *fmt)
+static int vidioc_try_fmt(struct v4l2_format *f,
+                         const struct mtk_video_fmt *fmt)
 {
        struct v4l2_pix_format_mplane *pix_fmt_mp = &f->fmt.pix_mp;
        int i;
@@ -717,7 +720,7 @@ static int vidioc_try_fmt(struct v4l2_format *f, struct mtk_video_fmt *fmt)
 static int vidioc_try_fmt_vid_cap_mplane(struct file *file, void *priv,
                                struct v4l2_format *f)
 {
-       struct mtk_video_fmt *fmt;
+       const struct mtk_video_fmt *fmt;
 
        fmt = mtk_vdec_find_format(f);
        if (!fmt) {
@@ -732,7 +735,7 @@ static int vidioc_try_fmt_vid_out_mplane(struct file *file, void *priv,
                                struct v4l2_format *f)
 {
        struct v4l2_pix_format_mplane *pix_fmt_mp = &f->fmt.pix_mp;
-       struct mtk_video_fmt *fmt;
+       const struct mtk_video_fmt *fmt;
 
        fmt = mtk_vdec_find_format(f);
        if (!fmt) {
@@ -826,7 +829,7 @@ static int vidioc_vdec_s_fmt(struct file *file, void *priv,
        struct v4l2_pix_format_mplane *pix_mp;
        struct mtk_q_data *q_data;
        int ret = 0;
-       struct mtk_video_fmt *fmt;
+       const struct mtk_video_fmt *fmt;
 
        mtk_v4l2_debug(3, "[%d]", ctx->id);
 
@@ -925,7 +928,7 @@ static int vidioc_enum_framesizes(struct file *file, void *priv,
 
 static int vidioc_enum_fmt(struct v4l2_fmtdesc *f, bool output_queue)
 {
-       struct mtk_video_fmt *fmt;
+       const struct mtk_video_fmt *fmt;
        int i, j = 0;
 
        for (i = 0; i < NUM_FORMATS; i++) {
@@ -949,14 +952,14 @@ static int vidioc_enum_fmt(struct v4l2_fmtdesc *f, bool output_queue)
        return 0;
 }
 
-static int vidioc_vdec_enum_fmt_vid_cap_mplane(struct file *file, void *pirv,
-                                              struct v4l2_fmtdesc *f)
+static int vidioc_vdec_enum_fmt_vid_cap(struct file *file, void *priv,
+                                       struct v4l2_fmtdesc *f)
 {
        return vidioc_enum_fmt(f, false);
 }
 
-static int vidioc_vdec_enum_fmt_vid_out_mplane(struct file *file, void *priv,
-                                              struct v4l2_fmtdesc *f)
+static int vidioc_vdec_enum_fmt_vid_out(struct file *file, void *priv,
+                                       struct v4l2_fmtdesc *f)
 {
        return vidioc_enum_fmt(f, true);
 }
@@ -1324,7 +1327,8 @@ static void vb2ops_vdec_stop_streaming(struct vb2_queue *q)
 
        while ((dst_buf = v4l2_m2m_dst_buf_remove(ctx->m2m_ctx))) {
                vb2_set_plane_payload(&dst_buf->vb2_buf, 0, 0);
-               vb2_set_plane_payload(&dst_buf->vb2_buf, 1, 0);
+               if (ctx->q_data[MTK_Q_DATA_DST].fmt->num_planes == 2)
+                       vb2_set_plane_payload(&dst_buf->vb2_buf, 1, 0);
                v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_ERROR);
        }
 
@@ -1453,8 +1457,8 @@ const struct v4l2_ioctl_ops mtk_vdec_ioctl_ops = {
 
        .vidioc_create_bufs             = v4l2_m2m_ioctl_create_bufs,
 
-       .vidioc_enum_fmt_vid_cap_mplane = vidioc_vdec_enum_fmt_vid_cap_mplane,
-       .vidioc_enum_fmt_vid_out_mplane = vidioc_vdec_enum_fmt_vid_out_mplane,
+       .vidioc_enum_fmt_vid_cap        = vidioc_vdec_enum_fmt_vid_cap,
+       .vidioc_enum_fmt_vid_out        = vidioc_vdec_enum_fmt_vid_out,
        .vidioc_enum_framesizes = vidioc_enum_framesizes,
 
        .vidioc_querycap                = vidioc_vdec_querycap,