On 07/17/2014 06:05 PM, Philipp Zabel wrote:
> Let the decoder capture side and encoder output side only list
> uncompressed formats, and the decoder output and encoder capture
> side only list compressed formats.
> 
> Signed-off-by: Philipp Zabel <p.za...@pengutronix.de>

Acked-by: Hans Verkuil <hans.verk...@cisco.com>

Regards,

        Hans

> ---
>  drivers/media/platform/coda.c | 57 
> +++++++++++++++----------------------------
>  1 file changed, 19 insertions(+), 38 deletions(-)
> 
> diff --git a/drivers/media/platform/coda.c b/drivers/media/platform/coda.c
> index 4a159031..e63226b 100644
> --- a/drivers/media/platform/coda.c
> +++ b/drivers/media/platform/coda.c
> @@ -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)
>  {
> @@ -972,12 +953,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,
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to