Re: [PATCH] media: platform: video-mux: propagate format from sink to source

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

 



Hi Chris,

On Tue, 2018-04-03 at 14:50 -0500, Chris Lesiak wrote:
> Propagate the v4l2_mbus_framefmt to the source pad when either a sink
> pad is activated or when the format of the active sink pad changes.

Thank you, this fixes the V4L2_SUBDEV_FORMAT_TRY use case as well as
propagation of the active format when the user calls VIDIOC_SUBDEV_S_FMT
on the sink pad and then only VIDIOC_SUBDEV_G_FMT on the source pad.

> Signed-off-by: Chris Lesiak <chris.lesiak@xxxxxxxxx>
> ---
>  drivers/media/platform/video-mux.c | 16 +++++++++++++++-
>  1 file changed, 15 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/media/platform/video-mux.c b/drivers/media/platform/video-mux.c
> index ee89ad76bee2..1fb887293337 100644
> --- a/drivers/media/platform/video-mux.c
> +++ b/drivers/media/platform/video-mux.c
> @@ -45,6 +45,7 @@ static int video_mux_link_setup(struct media_entity *entity,
>  {
>  	struct v4l2_subdev *sd = media_entity_to_v4l2_subdev(entity);
>  	struct video_mux *vmux = v4l2_subdev_to_video_mux(sd);
> +	u16 source_pad = entity->num_pads - 1;
>  	int ret = 0;
>  
>  	/*
> @@ -74,6 +75,9 @@ static int video_mux_link_setup(struct media_entity *entity,
>  		if (ret < 0)
>  			goto out;
>  		vmux->active = local->index;
> +
> +		/* Propagate the active format to the source */
> +		vmux->format_mbus[source_pad] = vmux->format_mbus[vmux->active];
>  	} else {
>  		if (vmux->active != local->index)
>  			goto out;
> @@ -162,14 +166,20 @@ static int video_mux_set_format(struct v4l2_subdev *sd,
>  			    struct v4l2_subdev_format *sdformat)
>  {
>  	struct video_mux *vmux = v4l2_subdev_to_video_mux(sd);
> -	struct v4l2_mbus_framefmt *mbusformat;
> +	struct v4l2_mbus_framefmt *mbusformat, *source_mbusformat;
>  	struct media_pad *pad = &vmux->pads[sdformat->pad];
> +	u16 source_pad = sd->entity.num_pads - 1;
>  
>  	mbusformat = __video_mux_get_pad_format(sd, cfg, sdformat->pad,
>  					    sdformat->which);
>  	if (!mbusformat)
>  		return -EINVAL;
>  
> +	source_mbusformat = __video_mux_get_pad_format(sd, cfg, source_pad,
> +						       sdformat->which);
> +	if (!source_mbusformat)
> +		return -EINVAL;
> +
>  	mutex_lock(&vmux->lock);

This is superfluous if pad->index != vmux->active and the same as
mbusformat for the source pad, but I think to achieve easily readable
code, this is ok.

>  	/* Source pad mirrors active sink pad, no limitations on sink pads */
> @@ -178,6 +188,10 @@ static int video_mux_set_format(struct v4l2_subdev *sd,
>  
>  	*mbusformat = sdformat->format;
>  
> +	/* Propagate the format from an active sink to source */
> +	if ((pad->flags & MEDIA_PAD_FL_SINK) && (pad->index == vmux->active))

The flags check could be removed. It is not necessary since vmux->active 
is never set to the source pad index.

> +		*source_mbusformat = sdformat->format;
> +
>  	mutex_unlock(&vmux->lock);
>  
>  	return 0;

Reviewed-by: Philipp Zabel <p.zabel@xxxxxxxxxxxxxx>

regards
Philipp



[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