[media] coda: split format enumeration for encoder end decoder device
[firefly-linux-kernel-4.4.55.git] / drivers / media / platform / coda.c
index 546cc7bd6a71d231163825c2e7cdef359f63a17a..9493cfdb0ae690faeded66ec55ddfe46ea4784e7 100644 (file)
@@ -542,8 +542,8 @@ static int coda_querycap(struct file *file, void *priv,
        return 0;
 }
 
-static int enum_fmt(void *priv, struct v4l2_fmtdesc *f,
-                       enum v4l2_buf_type type, int src_fourcc)
+static int coda_enum_fmt(struct file *file, void *priv,
+                        struct v4l2_fmtdesc *f)
 {
        struct coda_ctx *ctx = fh_to_ctx(priv);
        struct coda_codec *codecs = ctx->dev->devtype->codecs;
@@ -552,11 +552,19 @@ static int enum_fmt(void *priv, struct v4l2_fmtdesc *f,
        int num_codecs = ctx->dev->devtype->num_codecs;
        int num_formats = ARRAY_SIZE(coda_formats);
        int i, k, num = 0;
+       bool yuv;
+
+       if (ctx->inst_type == CODA_INST_ENCODER)
+               yuv = (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT);
+       else
+               yuv = (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE);
 
        for (i = 0; i < num_formats; i++) {
-               /* Both uncompressed formats are always supported */
-               if (coda_format_is_yuv(formats[i].fourcc) &&
-                   !coda_format_is_yuv(src_fourcc)) {
+               /* Skip either raw or compressed formats */
+               if (yuv != coda_format_is_yuv(formats[i].fourcc))
+                       continue;
+               /* All uncompressed formats are always supported */
+               if (yuv) {
                        if (num == f->index)
                                break;
                        ++num;
@@ -564,12 +572,10 @@ static int enum_fmt(void *priv, struct v4l2_fmtdesc *f,
                }
                /* Compressed formats may be supported, check the codec list */
                for (k = 0; k < num_codecs; k++) {
-                       /* if src_fourcc is set, only consider matching codecs */
-                       if (type == V4L2_BUF_TYPE_VIDEO_CAPTURE &&
-                           formats[i].fourcc == codecs[k].dst_fourcc &&
-                           (!src_fourcc || src_fourcc == codecs[k].src_fourcc))
+                       if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE &&
+                           formats[i].fourcc == codecs[k].dst_fourcc)
                                break;
-                       if (type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
+                       if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
                            formats[i].fourcc == codecs[k].src_fourcc)
                                break;
                }
@@ -584,7 +590,7 @@ static int enum_fmt(void *priv, struct v4l2_fmtdesc *f,
                fmt = &formats[i];
                strlcpy(f->description, fmt->name, sizeof(f->description));
                f->pixelformat = fmt->fourcc;
-               if (!coda_format_is_yuv(fmt->fourcc))
+               if (!yuv)
                        f->flags |= V4L2_FMT_FLAG_COMPRESSED;
                return 0;
        }
@@ -593,31 +599,6 @@ static int enum_fmt(void *priv, struct v4l2_fmtdesc *f,
        return -EINVAL;
 }
 
-static int coda_enum_fmt_vid_cap(struct file *file, void *priv,
-                                struct v4l2_fmtdesc *f)
-{
-       struct coda_ctx *ctx = fh_to_ctx(priv);
-       struct vb2_queue *src_vq;
-       struct coda_q_data *q_data_src;
-
-       /* If the source format is already fixed, only list matching formats */
-       src_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
-       if (vb2_is_streaming(src_vq)) {
-               q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
-
-               return enum_fmt(priv, f, V4L2_BUF_TYPE_VIDEO_CAPTURE,
-                               q_data_src->fourcc);
-       }
-
-       return enum_fmt(priv, f, V4L2_BUF_TYPE_VIDEO_CAPTURE, 0);
-}
-
-static int coda_enum_fmt_vid_out(struct file *file, void *priv,
-                                struct v4l2_fmtdesc *f)
-{
-       return enum_fmt(priv, f, V4L2_BUF_TYPE_VIDEO_OUTPUT, 0);
-}
-
 static int coda_g_fmt(struct file *file, void *priv,
                      struct v4l2_format *f)
 {
@@ -970,12 +951,12 @@ static int coda_subscribe_event(struct v4l2_fh *fh,
 static const struct v4l2_ioctl_ops coda_ioctl_ops = {
        .vidioc_querycap        = coda_querycap,
 
-       .vidioc_enum_fmt_vid_cap = coda_enum_fmt_vid_cap,
+       .vidioc_enum_fmt_vid_cap = coda_enum_fmt,
        .vidioc_g_fmt_vid_cap   = coda_g_fmt,
        .vidioc_try_fmt_vid_cap = coda_try_fmt_vid_cap,
        .vidioc_s_fmt_vid_cap   = coda_s_fmt_vid_cap,
 
-       .vidioc_enum_fmt_vid_out = coda_enum_fmt_vid_out,
+       .vidioc_enum_fmt_vid_out = coda_enum_fmt,
        .vidioc_g_fmt_vid_out   = coda_g_fmt,
        .vidioc_try_fmt_vid_out = coda_try_fmt_vid_out,
        .vidioc_s_fmt_vid_out   = coda_s_fmt_vid_out,