mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 22:51:35 +00:00
media: amphion: only insert the first sequence startcode for vc1l format
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: 145e936380
("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>
This commit is contained in:
parent
d8f1eb105e
commit
e670f5d672
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user