@@ -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;
@@ -153,13 +170,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;
}