Message ID | 20190426195114.5002-8-andrealmeid@collabora.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | media: vimc: Add support for multiplanar formats | expand |
On 4/26/19 9:51 PM, André Almeida wrote: > Add multiplanar formats to be exposed to the userspace as > supported formats. Since we don't want to support multiplanar > formats when the driver is in singleplanar mode, we only access > the multiplanar formats array if the multiplanar mode is enabled. > > Signed-off-by: André Almeida <andrealmeid@collabora.com> > Acked-by: Helen Koike <helen.koike@collabora.com> > --- > Changes in v5: none > > Changes in v4: none > > Changes in v3: none > > Changes in v2: > - Change line break style > - Add TODO comment > > drivers/media/platform/vimc/vimc-capture.c | 34 ++++++++++++++++++++-- > 1 file changed, 32 insertions(+), 2 deletions(-) > > diff --git a/drivers/media/platform/vimc/vimc-capture.c b/drivers/media/platform/vimc/vimc-capture.c > index 652d3d08bc50..a7dafc601033 100644 > --- a/drivers/media/platform/vimc/vimc-capture.c > +++ b/drivers/media/platform/vimc/vimc-capture.c > @@ -32,6 +32,10 @@ > #define IS_MULTIPLANAR(vcap) \ > (vcap->vdev.device_caps & V4L2_CAP_VIDEO_CAPTURE_MPLANE) > > +/** Just use /* instead of /** This is a regular comment, not something that has to end up in documentation. > + * TODO: capture device should only enum formats that all subdevices on > + * topology accepts > + */ > static const u32 vimc_cap_supported_pixfmt[] = { > V4L2_PIX_FMT_BGR24, > V4L2_PIX_FMT_RGB24, > @@ -58,6 +62,19 @@ static const u32 vimc_cap_supported_pixfmt[] = { > V4L2_PIX_FMT_SRGGB12, > }; > > +static const u32 vimc_cap_supported_pixfmt_mp[] = { > + V4L2_PIX_FMT_YUV420M, > + V4L2_PIX_FMT_YVU420M, > + V4L2_PIX_FMT_YUV422M, > + V4L2_PIX_FMT_YVU422M, > + V4L2_PIX_FMT_YUV444M, > + V4L2_PIX_FMT_YVU444M, > + V4L2_PIX_FMT_NV12M, > + V4L2_PIX_FMT_NV21M, > + V4L2_PIX_FMT_NV16M, > + V4L2_PIX_FMT_NV61M, > +}; > + > struct vimc_cap_device { > struct vimc_ent_device ved; > struct video_device vdev; > @@ -156,13 +173,26 @@ static int vimc_cap_try_fmt_vid_cap_mp(struct file *file, void *priv, > format->width, format->height); > } > > +/** Ditto. Because of this I get these smatch warnings: /home/hans/work/build/media-git/drivers/media/platform/vimc/vimc-capture.c:43: warning: cannot understand function prototype: 'const u32 vimc_cap_supported_pixfmt[] = ' /home/hans/work/build/media-git/drivers/media/platform/vimc/vimc-capture.c:199: warning: Function parameter or member 'file' not described in 'vimc_cap_enum_fmt_vid_cap' /home/hans/work/build/media-git/drivers/media/platform/vimc/vimc-capture.c:199: warning: Function parameter or member 'priv' not described in 'vimc_cap_enum_fmt_vid_cap' /home/hans/work/build/media-git/drivers/media/platform/vimc/vimc-capture.c:199: warning: Function parameter or member 'f' not described in 'vimc_cap_enum_fmt_vid_cap' Regards, Hans > + * When multiplanar is true, consider that the vimc_cap_enum_fmt_vid_cap_mp > + * is concantenate in the vimc_cap_enum_fmt_vid_cap array. Otherwise, just > + * consider the single-planar array > + */ > static int vimc_cap_enum_fmt_vid_cap(struct file *file, void *priv, > struct v4l2_fmtdesc *f) > { > - if (f->index >= ARRAY_SIZE(vimc_cap_supported_pixfmt)) > + struct vimc_cap_device *vcap = video_drvdata(file); > + const unsigned int sp_size = ARRAY_SIZE(vimc_cap_supported_pixfmt); > + const unsigned int mp_size = ARRAY_SIZE(vimc_cap_supported_pixfmt_mp); > + > + if (f->index >= sp_size + (IS_MULTIPLANAR(vcap) ? mp_size : 0)) > return -EINVAL; > > - f->pixelformat = vimc_cap_supported_pixfmt[f->index]; > + if (f->index >= sp_size) > + f->pixelformat = > + vimc_cap_supported_pixfmt_mp[f->index - sp_size]; > + else > + f->pixelformat = vimc_cap_supported_pixfmt[f->index]; > > return 0; > } >
diff --git a/drivers/media/platform/vimc/vimc-capture.c b/drivers/media/platform/vimc/vimc-capture.c index 652d3d08bc50..a7dafc601033 100644 --- a/drivers/media/platform/vimc/vimc-capture.c +++ b/drivers/media/platform/vimc/vimc-capture.c @@ -32,6 +32,10 @@ #define IS_MULTIPLANAR(vcap) \ (vcap->vdev.device_caps & V4L2_CAP_VIDEO_CAPTURE_MPLANE) +/** + * TODO: capture device should only enum formats that all subdevices on + * topology accepts + */ static const u32 vimc_cap_supported_pixfmt[] = { V4L2_PIX_FMT_BGR24, V4L2_PIX_FMT_RGB24, @@ -58,6 +62,19 @@ static const u32 vimc_cap_supported_pixfmt[] = { V4L2_PIX_FMT_SRGGB12, }; +static const u32 vimc_cap_supported_pixfmt_mp[] = { + V4L2_PIX_FMT_YUV420M, + V4L2_PIX_FMT_YVU420M, + V4L2_PIX_FMT_YUV422M, + V4L2_PIX_FMT_YVU422M, + V4L2_PIX_FMT_YUV444M, + V4L2_PIX_FMT_YVU444M, + V4L2_PIX_FMT_NV12M, + V4L2_PIX_FMT_NV21M, + V4L2_PIX_FMT_NV16M, + V4L2_PIX_FMT_NV61M, +}; + struct vimc_cap_device { struct vimc_ent_device ved; struct video_device vdev; @@ -156,13 +173,26 @@ static int vimc_cap_try_fmt_vid_cap_mp(struct file *file, void *priv, format->width, format->height); } +/** + * When multiplanar is true, consider that the vimc_cap_enum_fmt_vid_cap_mp + * is concantenate in the vimc_cap_enum_fmt_vid_cap array. Otherwise, just + * consider the single-planar array + */ static int vimc_cap_enum_fmt_vid_cap(struct file *file, void *priv, struct v4l2_fmtdesc *f) { - if (f->index >= ARRAY_SIZE(vimc_cap_supported_pixfmt)) + struct vimc_cap_device *vcap = video_drvdata(file); + const unsigned int sp_size = ARRAY_SIZE(vimc_cap_supported_pixfmt); + const unsigned int mp_size = ARRAY_SIZE(vimc_cap_supported_pixfmt_mp); + + if (f->index >= sp_size + (IS_MULTIPLANAR(vcap) ? mp_size : 0)) return -EINVAL; - f->pixelformat = vimc_cap_supported_pixfmt[f->index]; + if (f->index >= sp_size) + f->pixelformat = + vimc_cap_supported_pixfmt_mp[f->index - sp_size]; + else + f->pixelformat = vimc_cap_supported_pixfmt[f->index]; return 0; }