On 07/10/2022 14: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);
Hi.
This still doesn't apply to media tip of tree fixes
I get 3/4 patches in then the last one doesn't apply
To ssh://git.linaro.org/people/bryan.odonoghue/kernel.git
* [new branch] HEAD ->
media-tree-fixes-22-10-07+qcom-camss-vc-partial