On Fri, 7 Oct 2022 at 15:20, <quic_mmitkov@xxxxxxxxxxx> wrote: > > From: Milen Mitkov <quic_mmitkov@xxxxxxxxxxx> > > Use the multistream series function video_device_pipeline_alloc_start > to allows multiple clients of the same pipeline. > > If any of the entities in the pipeline doesn't return success at stop > (e.g. if a VFE line remains running), the full pipeline won't be stopped. > This allows for stopping and starting streams at any point without > disrupting the other running streams. > > Signed-off-by: Milen Mitkov <quic_mmitkov@xxxxxxxxxxx> > --- > .../media/platform/qcom/camss/camss-video.c | 21 ++++++++++++++++--- > 1 file changed, 18 insertions(+), 3 deletions(-) > > diff --git a/drivers/media/platform/qcom/camss/camss-video.c b/drivers/media/platform/qcom/camss/camss-video.c > index 81fb3a5bc1d5..b042faf3dcda 100644 > --- a/drivers/media/platform/qcom/camss/camss-video.c > +++ b/drivers/media/platform/qcom/camss/camss-video.c > @@ -353,6 +353,7 @@ static int video_get_subdev_format(struct camss_video *video, > > fmt.pad = pad; > fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE; > + fmt.stream = 0; > > ret = v4l2_subdev_call(subdev, pad, get_fmt, NULL, &fmt); > if (ret) > @@ -493,9 +494,11 @@ static int video_start_streaming(struct vb2_queue *q, unsigned int count) > struct v4l2_subdev *subdev; > int ret; > > - ret = video_device_pipeline_start(vdev, &video->pipe); > - if (ret < 0) > + ret = video_device_pipeline_alloc_start(vdev); > + if (ret < 0) { > + dev_err(video->camss->dev, "Failed to start media pipeline: %d\n", ret); > return ret; > + } > > ret = video_check_format(video); > if (ret < 0) > @@ -536,6 +539,7 @@ static void video_stop_streaming(struct vb2_queue *q) > struct media_entity *entity; > struct media_pad *pad; > struct v4l2_subdev *subdev; > + int ret; > > entity = &vdev->entity; > while (1) { > @@ -550,7 +554,18 @@ static void video_stop_streaming(struct vb2_queue *q) > entity = pad->entity; > subdev = media_entity_to_v4l2_subdev(entity); > > - v4l2_subdev_call(subdev, video, s_stream, 0); > + ret = v4l2_subdev_call(subdev, video, s_stream, 0); > + > + if (ret == -EBUSY) { > + /* Don't stop if other instances of the pipeline are still running */ > + dev_dbg(video->camss->dev, "Video pipeline still used, don't stop streaming.\n"); > + return; > + } > + > + if (ret) { > + dev_err(video->camss->dev, "Video pipeline stop failed: %d\n", ret); > + return; > + } > } > > video_device_pipeline_stop(vdev); > -- > 2.37.3 > Reviewed-by: Robert Foss <robert.foss@xxxxxxxxxx>