On 10/18/2018 06:08 PM, Ezequiel Garcia wrote: > The decoder interface (not yet merged) specifies that > width and height values set on the OUTPUT queue, must > be propagated to the CAPTURE queue. > > This is not enough to comply with the specification, > which would require to properly support stream resolution > changes detection and notification. > > However, it's a relatively small change, which fixes behavior > required by some applications such as gstreamer. > > With this change, it's possible to run a simple T(T⁻¹) pipeline: > > gst-launch-1.0 videotestsrc ! v4l2fwhtenc ! v4l2fwhtdec ! fakevideosink > > Signed-off-by: Ezequiel Garcia <ezequiel@xxxxxxxxxxxxx> > --- > drivers/media/platform/vicodec/vicodec-core.c | 15 +++++++++++++++ > 1 file changed, 15 insertions(+) > > diff --git a/drivers/media/platform/vicodec/vicodec-core.c b/drivers/media/platform/vicodec/vicodec-core.c > index 1eb9132bfc85..a2c487b4b80d 100644 > --- a/drivers/media/platform/vicodec/vicodec-core.c > +++ b/drivers/media/platform/vicodec/vicodec-core.c > @@ -673,6 +673,13 @@ static int vidioc_s_fmt(struct vicodec_ctx *ctx, struct v4l2_format *f) > q_data->width = pix->width; > q_data->height = pix->height; > q_data->sizeimage = pix->sizeimage; > + > + /* Propagate changes to CAPTURE queue */ > + if (!ctx->is_enc && V4L2_TYPE_IS_OUTPUT(f->type)) { Do we need !ctx->is_enc? Isn't this the same for both decoder and encoder? > + ctx->q_data[V4L2_M2M_DST].width = pix->width; > + ctx->q_data[V4L2_M2M_DST].height = pix->height; > + ctx->q_data[V4L2_M2M_DST].sizeimage = pix->sizeimage; This is wrong: you are copying the sizeimage for the compressed format as the sizeimage for the raw format, which is quite different. I think you need to make a little helper function that can update the width/height of a particular queue and that can calculate the sizeimage correctly. Regards, Hans > + } > break; > case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: > case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: > @@ -693,6 +700,14 @@ static int vidioc_s_fmt(struct vicodec_ctx *ctx, struct v4l2_format *f) > q_data->width = pix_mp->width; > q_data->height = pix_mp->height; > q_data->sizeimage = pix_mp->plane_fmt[0].sizeimage; > + > + /* Propagate changes to CAPTURE queue */ > + if (!ctx->is_enc && V4L2_TYPE_IS_OUTPUT(f->type)) { > + ctx->q_data[V4L2_M2M_DST].width = pix_mp->width; > + ctx->q_data[V4L2_M2M_DST].height = pix_mp->height; > + ctx->q_data[V4L2_M2M_DST].sizeimage = > + pix_mp->plane_fmt[0].sizeimage; > + } > break; > default: > return -EINVAL; >