|
@@ -95,6 +95,8 @@ void coda_write_base(struct coda_ctx *ctx, struct coda_q_data *q_data,
|
|
u32 base_cb, base_cr;
|
|
u32 base_cb, base_cr;
|
|
|
|
|
|
switch (q_data->fourcc) {
|
|
switch (q_data->fourcc) {
|
|
|
|
+ case V4L2_PIX_FMT_YUYV:
|
|
|
|
+ /* Fallthrough: IN -H264-> CODA -NV12 MB-> VDOA -YUYV-> OUT */
|
|
case V4L2_PIX_FMT_NV12:
|
|
case V4L2_PIX_FMT_NV12:
|
|
case V4L2_PIX_FMT_YUV420:
|
|
case V4L2_PIX_FMT_YUV420:
|
|
default:
|
|
default:
|
|
@@ -201,6 +203,11 @@ static const struct coda_video_device coda_bit_decoder = {
|
|
V4L2_PIX_FMT_NV12,
|
|
V4L2_PIX_FMT_NV12,
|
|
V4L2_PIX_FMT_YUV420,
|
|
V4L2_PIX_FMT_YUV420,
|
|
V4L2_PIX_FMT_YVU420,
|
|
V4L2_PIX_FMT_YVU420,
|
|
|
|
+ /*
|
|
|
|
+ * If V4L2_PIX_FMT_YUYV should be default,
|
|
|
|
+ * set_default_params() must be adjusted.
|
|
|
|
+ */
|
|
|
|
+ V4L2_PIX_FMT_YUYV,
|
|
},
|
|
},
|
|
};
|
|
};
|
|
|
|
|
|
@@ -246,6 +253,7 @@ static u32 coda_format_normalize_yuv(u32 fourcc)
|
|
case V4L2_PIX_FMT_YUV420:
|
|
case V4L2_PIX_FMT_YUV420:
|
|
case V4L2_PIX_FMT_YVU420:
|
|
case V4L2_PIX_FMT_YVU420:
|
|
case V4L2_PIX_FMT_YUV422P:
|
|
case V4L2_PIX_FMT_YUV422P:
|
|
|
|
+ case V4L2_PIX_FMT_YUYV:
|
|
return V4L2_PIX_FMT_YUV420;
|
|
return V4L2_PIX_FMT_YUV420;
|
|
default:
|
|
default:
|
|
return fourcc;
|
|
return fourcc;
|
|
@@ -434,6 +442,11 @@ static int coda_try_pixelformat(struct coda_ctx *ctx, struct v4l2_format *f)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
for (i = 0; i < CODA_MAX_FORMATS; i++) {
|
|
for (i = 0; i < CODA_MAX_FORMATS; i++) {
|
|
|
|
+ /* Skip YUYV if the vdoa is not available */
|
|
|
|
+ if (!ctx->vdoa && f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE &&
|
|
|
|
+ formats[i] == V4L2_PIX_FMT_YUYV)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
if (formats[i] == f->fmt.pix.pixelformat) {
|
|
if (formats[i] == f->fmt.pix.pixelformat) {
|
|
f->fmt.pix.pixelformat = formats[i];
|
|
f->fmt.pix.pixelformat = formats[i];
|
|
return 0;
|
|
return 0;
|
|
@@ -520,6 +533,11 @@ static int coda_try_fmt(struct coda_ctx *ctx, const struct coda_codec *codec,
|
|
f->fmt.pix.sizeimage = f->fmt.pix.bytesperline *
|
|
f->fmt.pix.sizeimage = f->fmt.pix.bytesperline *
|
|
f->fmt.pix.height * 3 / 2;
|
|
f->fmt.pix.height * 3 / 2;
|
|
break;
|
|
break;
|
|
|
|
+ case V4L2_PIX_FMT_YUYV:
|
|
|
|
+ f->fmt.pix.bytesperline = round_up(f->fmt.pix.width, 16) * 2;
|
|
|
|
+ f->fmt.pix.sizeimage = f->fmt.pix.bytesperline *
|
|
|
|
+ f->fmt.pix.height;
|
|
|
|
+ break;
|
|
case V4L2_PIX_FMT_YUV422P:
|
|
case V4L2_PIX_FMT_YUV422P:
|
|
f->fmt.pix.bytesperline = round_up(f->fmt.pix.width, 16);
|
|
f->fmt.pix.bytesperline = round_up(f->fmt.pix.width, 16);
|
|
f->fmt.pix.sizeimage = f->fmt.pix.bytesperline *
|
|
f->fmt.pix.sizeimage = f->fmt.pix.bytesperline *
|
|
@@ -593,6 +611,15 @@ static int coda_try_fmt_vid_cap(struct file *file, void *priv,
|
|
ret = coda_try_fmt_vdoa(ctx, f, &use_vdoa);
|
|
ret = coda_try_fmt_vdoa(ctx, f, &use_vdoa);
|
|
if (ret < 0)
|
|
if (ret < 0)
|
|
return ret;
|
|
return ret;
|
|
|
|
+
|
|
|
|
+ if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_YUYV) {
|
|
|
|
+ if (!use_vdoa)
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ f->fmt.pix.bytesperline = round_up(f->fmt.pix.width, 16) * 2;
|
|
|
|
+ f->fmt.pix.sizeimage = f->fmt.pix.bytesperline *
|
|
|
|
+ f->fmt.pix.height;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
@@ -662,6 +689,9 @@ static int coda_s_fmt(struct coda_ctx *ctx, struct v4l2_format *f,
|
|
}
|
|
}
|
|
|
|
|
|
switch (f->fmt.pix.pixelformat) {
|
|
switch (f->fmt.pix.pixelformat) {
|
|
|
|
+ case V4L2_PIX_FMT_YUYV:
|
|
|
|
+ ctx->tiled_map_type = GDI_TILED_FRAME_MB_RASTER_MAP;
|
|
|
|
+ break;
|
|
case V4L2_PIX_FMT_NV12:
|
|
case V4L2_PIX_FMT_NV12:
|
|
ctx->tiled_map_type = GDI_TILED_FRAME_MB_RASTER_MAP;
|
|
ctx->tiled_map_type = GDI_TILED_FRAME_MB_RASTER_MAP;
|
|
if (!disable_tiling)
|
|
if (!disable_tiling)
|