]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
media: iris: Prevent output buffer queuing before stream-on completes
authorVishnu Reddy <busanna.reddy@oss.qualcomm.com>
Mon, 29 Dec 2025 06:31:25 +0000 (12:01 +0530)
committerHans Verkuil <hverkuil+cisco@kernel.org>
Tue, 20 Jan 2026 13:00:12 +0000 (14:00 +0100)
During normal playback, stream-on for input is followed by output, and
only after input stream-on does actual streaming begin. However, when
gst-play performs a seek, both input and output streams are stopped,
and on restart, output stream-on occurs first. At this point, firmware
has not yet started streaming. Queuing output buffers before the firmware
begins streaming causes it to process buffers in an invalid state, leading
to an error response. These buffers are returned to the driver as errors,
forcing the driver into an error state and stopping playback.

Fix this by deferring output buffer queuing until stream-on completes.
Input buffers can still be queued before stream-on as required.

Fixes: 92e007ca5ab6 ("media: iris: Add V4L2 streaming support for encoder video device")
Signed-off-by: Vishnu Reddy <busanna.reddy@oss.qualcomm.com>
Signed-off-by: Dikshita Agarwal <dikshita.agarwal@oss.qualcomm.com>
Reviewed-by: Vikash Garodia <vikash.garodia@oss.qualcomm.com>
Cc: stable@vger.kernel.org
Signed-off-by: Bryan O'Donoghue <bod@kernel.org>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
drivers/media/platform/qcom/iris/iris_vb2.c

index 139b821f7952feb33b21a7045aef9e8a4782aa3c..bf0b8400996ece5c9d449b99609a302da726bf9a 100644 (file)
@@ -193,10 +193,14 @@ int iris_vb2_start_streaming(struct vb2_queue *q, unsigned int count)
        buf_type = iris_v4l2_type_to_driver(q->type);
 
        if (inst->domain == DECODER) {
-               if (inst->state == IRIS_INST_STREAMING)
+               if (buf_type == BUF_INPUT)
+                       ret = iris_queue_deferred_buffers(inst, BUF_INPUT);
+
+               if (!ret && inst->state == IRIS_INST_STREAMING) {
                        ret = iris_queue_internal_deferred_buffers(inst, BUF_DPB);
-               if (!ret)
-                       ret = iris_queue_deferred_buffers(inst, buf_type);
+                       if (!ret)
+                               ret = iris_queue_deferred_buffers(inst, BUF_OUTPUT);
+               }
        } else {
                if (inst->state == IRIS_INST_STREAMING) {
                        ret = iris_queue_deferred_buffers(inst, BUF_INPUT);