Re: [PATCH 1/2] vicodec: Have decoder propagate changes to the CAPTURE queue

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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;
> 




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux