media: amphion: only insert the first sequence startcode for vc1l format
authorMing Qian <ming.qian@nxp.com>
Fri, 8 Jul 2022 08:56:50 +0000 (09:56 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Fri, 8 Jul 2022 17:18:49 +0000 (18:18 +0100)
For format V4L2_PIX_FMT_VC1_ANNEX_L,
the amphion vpu requires driver to help insert some custom startcode
before sequence and frame.
but only the first sequence startcode is needed,
the extra startcode will cause decoding error.
So after seek, we don't need to insert the sequence startcode.

In other words, for V4L2_PIX_FMT_VC1_ANNEX_L,
the vpu doesn't support dynamic resolution change.

Fixes: 145e936380edb ("media: amphion: implement malone decoder rpc interface")
Signed-off-by: Ming Qian <ming.qian@nxp.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/platform/amphion/vdec.c
drivers/media/platform/amphion/vpu.h
drivers/media/platform/amphion/vpu_malone.c
drivers/media/platform/amphion/vpu_rpc.h

index 0a1c71de92ed9140f61e98ae84d3db2ff718b77d..9e64041cc1c1d95b95f8213bd3bc5ffe54375411 100644 (file)
@@ -105,7 +105,6 @@ static const struct vpu_format vdec_formats[] = {
                .pixfmt = V4L2_PIX_FMT_VC1_ANNEX_L,
                .num_planes = 1,
                .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
-               .flags = V4L2_FMT_FLAG_DYN_RESOLUTION
        },
        {
                .pixfmt = V4L2_PIX_FMT_MPEG2,
@@ -741,6 +740,7 @@ static void vdec_stop_done(struct vpu_inst *inst)
        vdec->eos_received = 0;
        vdec->is_source_changed = false;
        vdec->source_change = 0;
+       inst->total_input_count = 0;
        vpu_inst_unlock(inst);
 }
 
index e56b96a7e5d3f750ff0b239e8d2647441b44b1e2..f914de6ed81e9941ed1649b16760510b065f265c 100644 (file)
@@ -258,6 +258,7 @@ struct vpu_inst {
        struct vpu_format cap_format;
        u32 min_buffer_cap;
        u32 min_buffer_out;
+       u32 total_input_count;
 
        struct v4l2_rect crop;
        u32 colorspace;
index c62b49e850604c7dff6cbedcc7ce9521157582a2..f4a488bf988014c1b888a26e7e435d8000680e87 100644 (file)
@@ -1314,6 +1314,8 @@ static int vpu_malone_insert_scode_vc1_l_seq(struct malone_scode_t *scode)
        int size = 0;
        u8 rcv_seqhdr[MALONE_VC1_RCV_SEQ_HEADER_LEN];
 
+       if (scode->inst->total_input_count)
+               return 0;
        scode->need_data = 0;
 
        ret = vpu_malone_insert_scode_seq(scode, MALONE_CODEC_ID_VC1_SIMPLE, sizeof(rcv_seqhdr));
index 25119e5e807e1101561f05623b3aec889a9e97ca..7eb6f01e6ab5d1c9cf00b78e5985e0ed625556fa 100644 (file)
@@ -312,11 +312,16 @@ static inline int vpu_iface_input_frame(struct vpu_inst *inst,
                                        struct vb2_buffer *vb)
 {
        struct vpu_iface_ops *ops = vpu_core_get_iface(inst->core);
+       int ret;
 
        if (!ops || !ops->input_frame)
                return -EINVAL;
 
-       return ops->input_frame(inst->core->iface, inst, vb);
+       ret = ops->input_frame(inst->core->iface, inst, vb);
+       if (ret < 0)
+               return ret;
+       inst->total_input_count++;
+       return ret;
 }
 
 static inline int vpu_iface_config_memory_resource(struct vpu_inst *inst,