]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
media: venus: vdec: queue dpb buffers to firmware for video seek
authorRenjiang Han <quic_renjiang@quicinc.com>
Thu, 27 Feb 2025 02:43:54 +0000 (08:13 +0530)
committerHans Verkuil <hverkuil@xs4all.nl>
Fri, 11 Apr 2025 11:29:06 +0000 (13:29 +0200)
For the seek case, the input port will be called stream_off and then
stream_on in the driver. Firmware will flush all buffers during stream_off
input port. Therefore, driver needs to queue DPB buffers to firmware
during stream_on input port to ensure that decoder can decode normally
when it receives enough input and output buffers. Otherwise, decoder
will not be able to decode due to lack of DPB buffer even if there are
enough input and output buffers.

Signed-off-by: Renjiang Han <quic_renjiang@quicinc.com>
Reviewed-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
[bod: added media prefix]
Signed-off-by: Bryan O'Donoghue <bod@kernel.org>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
drivers/media/platform/qcom/venus/vdec.c

index 39d0556d7237d7906a9ec5dc73b2f8536faf34bc..99ce5fd41577284098dca54c7772da0691cf29a5 100644 (file)
@@ -1110,10 +1110,20 @@ static int vdec_start_output(struct venus_inst *inst)
 
        if (inst->codec_state == VENUS_DEC_STATE_SEEK) {
                ret = venus_helper_process_initial_out_bufs(inst);
-               if (inst->next_buf_last)
+               if (ret)
+                       return ret;
+
+               if (inst->next_buf_last) {
                        inst->codec_state = VENUS_DEC_STATE_DRC;
-               else
+               } else {
                        inst->codec_state = VENUS_DEC_STATE_DECODING;
+
+                       if (inst->streamon_cap) {
+                               ret = venus_helper_queue_dpb_bufs(inst);
+                               if (ret)
+                                       return ret;
+                       }
+               }
                goto done;
        }