Commit 35e2e8b5 authored by Dafna Hirschfeld's avatar Dafna Hirschfeld Committed by Mauro Carvalho Chehab

media: vicodec: set pixelformat to V4L2_PIX_FMT_FWHT_STATELESS for stateless decoder

for stateless decoder, set the output pixelformat
to V4L2_PIX_FMT_FWHT_STATELESS and the pix info to
pixfmt_stateless_fwht
Signed-off-by: default avatarDafna Hirschfeld <dafna3@gmail.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 997deb81
...@@ -727,7 +727,8 @@ static int enum_fmt(struct v4l2_fmtdesc *f, struct vicodec_ctx *ctx, ...@@ -727,7 +727,8 @@ static int enum_fmt(struct v4l2_fmtdesc *f, struct vicodec_ctx *ctx,
} else { } else {
if (f->index) if (f->index)
return -EINVAL; return -EINVAL;
f->pixelformat = V4L2_PIX_FMT_FWHT; f->pixelformat = ctx->is_stateless ?
V4L2_PIX_FMT_FWHT_STATELESS : V4L2_PIX_FMT_FWHT;
} }
return 0; return 0;
} }
...@@ -829,13 +830,15 @@ static int vidioc_try_fmt(struct vicodec_ctx *ctx, struct v4l2_format *f) ...@@ -829,13 +830,15 @@ static int vidioc_try_fmt(struct vicodec_ctx *ctx, struct v4l2_format *f)
struct v4l2_pix_format_mplane *pix_mp; struct v4l2_pix_format_mplane *pix_mp;
struct v4l2_pix_format *pix; struct v4l2_pix_format *pix;
struct v4l2_plane_pix_format *plane; struct v4l2_plane_pix_format *plane;
const struct v4l2_fwht_pixfmt_info *info = &pixfmt_fwht; const struct v4l2_fwht_pixfmt_info *info = ctx->is_stateless ?
&pixfmt_stateless_fwht : &pixfmt_fwht;
switch (f->type) { switch (f->type) {
case V4L2_BUF_TYPE_VIDEO_CAPTURE: case V4L2_BUF_TYPE_VIDEO_CAPTURE:
case V4L2_BUF_TYPE_VIDEO_OUTPUT: case V4L2_BUF_TYPE_VIDEO_OUTPUT:
pix = &f->fmt.pix; pix = &f->fmt.pix;
if (pix->pixelformat != V4L2_PIX_FMT_FWHT) if (pix->pixelformat != V4L2_PIX_FMT_FWHT &&
pix->pixelformat != V4L2_PIX_FMT_FWHT_STATELESS)
info = find_fmt(pix->pixelformat); info = find_fmt(pix->pixelformat);
pix->width = clamp(pix->width, MIN_WIDTH, MAX_WIDTH); pix->width = clamp(pix->width, MIN_WIDTH, MAX_WIDTH);
...@@ -856,7 +859,8 @@ static int vidioc_try_fmt(struct vicodec_ctx *ctx, struct v4l2_format *f) ...@@ -856,7 +859,8 @@ static int vidioc_try_fmt(struct vicodec_ctx *ctx, struct v4l2_format *f)
case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
pix_mp = &f->fmt.pix_mp; pix_mp = &f->fmt.pix_mp;
plane = pix_mp->plane_fmt; plane = pix_mp->plane_fmt;
if (pix_mp->pixelformat != V4L2_PIX_FMT_FWHT) if (pix_mp->pixelformat != V4L2_PIX_FMT_FWHT &&
pix_mp->pixelformat != V4L2_PIX_FMT_FWHT_STATELESS)
info = find_fmt(pix_mp->pixelformat); info = find_fmt(pix_mp->pixelformat);
pix_mp->num_planes = 1; pix_mp->num_planes = 1;
...@@ -933,8 +937,12 @@ static int vidioc_try_fmt_vid_out(struct file *file, void *priv, ...@@ -933,8 +937,12 @@ static int vidioc_try_fmt_vid_out(struct file *file, void *priv,
if (multiplanar) if (multiplanar)
return -EINVAL; return -EINVAL;
pix = &f->fmt.pix; pix = &f->fmt.pix;
pix->pixelformat = !ctx->is_enc ? V4L2_PIX_FMT_FWHT : if (ctx->is_enc)
find_fmt(pix->pixelformat)->id; pix->pixelformat = find_fmt(pix->pixelformat)->id;
else if (ctx->is_stateless)
pix->pixelformat = V4L2_PIX_FMT_FWHT_STATELESS;
else
pix->pixelformat = V4L2_PIX_FMT_FWHT;
if (!pix->colorspace) if (!pix->colorspace)
pix->colorspace = V4L2_COLORSPACE_REC709; pix->colorspace = V4L2_COLORSPACE_REC709;
break; break;
...@@ -942,8 +950,12 @@ static int vidioc_try_fmt_vid_out(struct file *file, void *priv, ...@@ -942,8 +950,12 @@ static int vidioc_try_fmt_vid_out(struct file *file, void *priv,
if (!multiplanar) if (!multiplanar)
return -EINVAL; return -EINVAL;
pix_mp = &f->fmt.pix_mp; pix_mp = &f->fmt.pix_mp;
pix_mp->pixelformat = !ctx->is_enc ? V4L2_PIX_FMT_FWHT : if (ctx->is_enc)
find_fmt(pix_mp->pixelformat)->id; pix_mp->pixelformat = find_fmt(pix_mp->pixelformat)->id;
else if (ctx->is_stateless)
pix_mp->pixelformat = V4L2_PIX_FMT_FWHT_STATELESS;
else
pix_mp->pixelformat = V4L2_PIX_FMT_FWHT;
if (!pix_mp->colorspace) if (!pix_mp->colorspace)
pix_mp->colorspace = V4L2_COLORSPACE_REC709; pix_mp->colorspace = V4L2_COLORSPACE_REC709;
break; break;
...@@ -986,6 +998,8 @@ static int vidioc_s_fmt(struct vicodec_ctx *ctx, struct v4l2_format *f) ...@@ -986,6 +998,8 @@ static int vidioc_s_fmt(struct vicodec_ctx *ctx, struct v4l2_format *f)
if (pix->pixelformat == V4L2_PIX_FMT_FWHT) if (pix->pixelformat == V4L2_PIX_FMT_FWHT)
q_data->info = &pixfmt_fwht; q_data->info = &pixfmt_fwht;
else if (pix->pixelformat == V4L2_PIX_FMT_FWHT_STATELESS)
q_data->info = &pixfmt_stateless_fwht;
else else
q_data->info = find_fmt(pix->pixelformat); q_data->info = find_fmt(pix->pixelformat);
q_data->coded_width = pix->width; q_data->coded_width = pix->width;
...@@ -1007,6 +1021,8 @@ static int vidioc_s_fmt(struct vicodec_ctx *ctx, struct v4l2_format *f) ...@@ -1007,6 +1021,8 @@ static int vidioc_s_fmt(struct vicodec_ctx *ctx, struct v4l2_format *f)
if (pix_mp->pixelformat == V4L2_PIX_FMT_FWHT) if (pix_mp->pixelformat == V4L2_PIX_FMT_FWHT)
q_data->info = &pixfmt_fwht; q_data->info = &pixfmt_fwht;
else if (pix_mp->pixelformat == V4L2_PIX_FMT_FWHT_STATELESS)
q_data->info = &pixfmt_stateless_fwht;
else else
q_data->info = find_fmt(pix_mp->pixelformat); q_data->info = find_fmt(pix_mp->pixelformat);
q_data->coded_width = pix_mp->width; q_data->coded_width = pix_mp->width;
...@@ -1231,6 +1247,8 @@ static int vicodec_enum_framesizes(struct file *file, void *fh, ...@@ -1231,6 +1247,8 @@ static int vicodec_enum_framesizes(struct file *file, void *fh,
struct v4l2_frmsizeenum *fsize) struct v4l2_frmsizeenum *fsize)
{ {
switch (fsize->pixel_format) { switch (fsize->pixel_format) {
case V4L2_PIX_FMT_FWHT_STATELESS:
break;
case V4L2_PIX_FMT_FWHT: case V4L2_PIX_FMT_FWHT:
break; break;
default: default:
...@@ -1518,7 +1536,8 @@ static int vicodec_start_streaming(struct vb2_queue *q, ...@@ -1518,7 +1536,8 @@ static int vicodec_start_streaming(struct vb2_queue *q,
(!V4L2_TYPE_IS_OUTPUT(q->type) && ctx->is_enc)) (!V4L2_TYPE_IS_OUTPUT(q->type) && ctx->is_enc))
return 0; return 0;
if (info->id == V4L2_PIX_FMT_FWHT) { if (info->id == V4L2_PIX_FMT_FWHT ||
info->id == V4L2_PIX_FMT_FWHT_STATELESS) {
vicodec_return_bufs(q, VB2_BUF_STATE_QUEUED); vicodec_return_bufs(q, VB2_BUF_STATE_QUEUED);
return -EINVAL; return -EINVAL;
} }
...@@ -1794,15 +1813,19 @@ static int vicodec_open(struct file *file) ...@@ -1794,15 +1813,19 @@ static int vicodec_open(struct file *file)
ctx->fh.ctrl_handler = hdl; ctx->fh.ctrl_handler = hdl;
v4l2_ctrl_handler_setup(hdl); v4l2_ctrl_handler_setup(hdl);
ctx->q_data[V4L2_M2M_SRC].info = if (ctx->is_enc)
ctx->is_enc ? v4l2_fwht_get_pixfmt(0) : &pixfmt_fwht; ctx->q_data[V4L2_M2M_SRC].info = v4l2_fwht_get_pixfmt(0);
else if (ctx->is_stateless)
ctx->q_data[V4L2_M2M_SRC].info = &pixfmt_stateless_fwht;
else
ctx->q_data[V4L2_M2M_SRC].info = &pixfmt_fwht;
ctx->q_data[V4L2_M2M_SRC].coded_width = 1280; ctx->q_data[V4L2_M2M_SRC].coded_width = 1280;
ctx->q_data[V4L2_M2M_SRC].coded_height = 720; ctx->q_data[V4L2_M2M_SRC].coded_height = 720;
ctx->q_data[V4L2_M2M_SRC].visible_width = 1280; ctx->q_data[V4L2_M2M_SRC].visible_width = 1280;
ctx->q_data[V4L2_M2M_SRC].visible_height = 720; ctx->q_data[V4L2_M2M_SRC].visible_height = 720;
size = 1280 * 720 * ctx->q_data[V4L2_M2M_SRC].info->sizeimage_mult / size = 1280 * 720 * ctx->q_data[V4L2_M2M_SRC].info->sizeimage_mult /
ctx->q_data[V4L2_M2M_SRC].info->sizeimage_div; ctx->q_data[V4L2_M2M_SRC].info->sizeimage_div;
if (ctx->is_enc) if (ctx->is_enc || ctx->is_stateless)
ctx->q_data[V4L2_M2M_SRC].sizeimage = size; ctx->q_data[V4L2_M2M_SRC].sizeimage = size;
else else
ctx->q_data[V4L2_M2M_SRC].sizeimage = ctx->q_data[V4L2_M2M_SRC].sizeimage =
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment