author | shihong.zheng <shihong.zheng@amlogic.com> | 2020-08-11 04:28:36 (GMT) |
---|---|---|
committer | Gan Zhang <gan.zhang@amlogic.com> | 2020-08-17 05:45:27 (GMT) |
commit | 14c542557e779e2ec2b55df26598b86e38db79cc (patch) | |
tree | 5f383b56c1b626173d3a23b1ac2ef924bbc7b7bb | |
parent | 8c84a9c10e55f8b6d52c125de9266573d253859c (diff) | |
download | media_modules-14c542557e779e2ec2b55df26598b86e38db79cc.zip media_modules-14c542557e779e2ec2b55df26598b86e38db79cc.tar.gz media_modules-14c542557e779e2ec2b55df26598b86e38db79cc.tar.bz2 |
mpeg12: fix frame mode interlace data insufficient. [1/1]
PD#SWPL-30096
Problem:
decode timeout repeatly when use android raw extractor.
cts failed. interlace mpeg12 two slices in two packets.
Solution:
add data request status send more chunk for decode when
data insufficient.
ucode gerrit id: 120436
ucode commit id: 713286
ucode change id: I517c3
Verify:
ah212
Change-Id: Ieeb93c93290ab8b6fcf31b30ea63dddcf01cf47b
Signed-off-by: shihong.zheng <shihong.zheng@amlogic.com>
-rw-r--r-- | drivers/frame_provider/decoder/mpeg12/vmpeg12_multi.c | 149 | ||||
-rw-r--r-- | firmware/video_ucode.bin | 292 |
2 files changed, 258 insertions, 183 deletions
diff --git a/drivers/frame_provider/decoder/mpeg12/vmpeg12_multi.c b/drivers/frame_provider/decoder/mpeg12/vmpeg12_multi.c index 8a0bb19..ef45eb8 100644 --- a/drivers/frame_provider/decoder/mpeg12/vmpeg12_multi.c +++ b/drivers/frame_provider/decoder/mpeg12/vmpeg12_multi.c @@ -160,6 +160,18 @@ enum { FRAME_REPEAT_BOT, FRAME_REPEAT_NONE }; + +/*Send by AV_SCRATCH_9*/ +#define MPEG12_PIC_DONE 1 +#define MPEG12_DATA_EMPTY 2 +#define MPEG12_SEQ_END 3 +#define MPEG12_DATA_REQUEST 4 + +/*Send by AV_SCRATCH_G*/ +#define MPEG12_V4L2_INFO_NOTIFY 1 +/*Send by AV_SCRATCH_J*/ +#define MPEG12_USERDATA_DONE 0x8000 + #define DEC_RESULT_NONE 0 #define DEC_RESULT_DONE 1 #define DEC_RESULT_AGAIN 2 @@ -173,15 +185,6 @@ enum { #define DECODE_ID(hw) (hw_to_vdec(hw)->id) #define DECODE_STOP_POS AV_SCRATCH_K -static struct vframe_s *vmpeg_vf_peek(void *); -static struct vframe_s *vmpeg_vf_get(void *); -static void vmpeg_vf_put(struct vframe_s *, void *); -static int vmpeg_vf_states(struct vframe_states *states, void *); -static int vmpeg_event_cb(int type, void *data, void *private_data); -static int notify_v4l_eos(struct vdec_s *vdec); - - - struct mmpeg2_userdata_record_t { struct userdata_meta_info_t meta_info; u32 rec_start; @@ -334,6 +337,13 @@ static int vmpeg12_hw_ctx_restore(struct vdec_mpeg12_hw_s *hw); static void reset_process_time(struct vdec_mpeg12_hw_s *hw); static void vmpeg12_canvas_init(struct vdec_mpeg12_hw_s *hw); static void flush_output(struct vdec_mpeg12_hw_s *hw); +static struct vframe_s *vmpeg_vf_peek(void *); +static struct vframe_s *vmpeg_vf_get(void *); +static void vmpeg_vf_put(struct vframe_s *, void *); +static int vmpeg_vf_states(struct vframe_states *states, void *); +static int vmpeg_event_cb(int type, void *data, void *private_data); +static int notify_v4l_eos(struct vdec_s *vdec); +static void start_process_time_set(struct vdec_mpeg12_hw_s *hw); static int debug_enable; /*static struct work_struct userdata_push_work;*/ @@ -505,7 +515,6 @@ static int vmpeg12_v4l_alloc_buff_config_canvas(struct vdec_mpeg12_hw_s *hw, int return 0; } - static unsigned int vmpeg12_get_buf_num(struct vdec_mpeg12_hw_s *hw) { unsigned int buf_num = DECODE_BUFFER_NUM_DEF; @@ -1294,7 +1303,8 @@ static void vmmpeg2_reset_userdata_fifo(struct vdec_s *vdec, int bInit) if (hw) { mutex_lock(&hw->userdata_mutex); - pr_info("vmh264_reset_userdata_fifo: bInit: %d, ri: %d, wi: %d\n", + pr_info("%s: bInit: %d, ri: %d, wi: %d\n", + __func__, bInit, hw->userdata_info.read_index, hw->userdata_info.write_index); @@ -1860,24 +1870,38 @@ static irqreturn_t vmpeg12_isr_thread_fn(struct vdec_s *vdec, int irq) } reg = READ_VREG(AV_SCRATCH_J); - if (reg & (1<<16)) { + if (reg & (1 << 16)) { vdec_schedule_work(&hw->userdata_push_work); return IRQ_HANDLED; } reg = READ_VREG(MREG_BUFFEROUT); - if (reg == 2) { + if (reg == MPEG12_DATA_REQUEST) { + debug_print(DECODE_ID(hw), PRINT_FLAG_RUN_FLOW, + "%s: data request, bcnt=%x\n", + __func__, READ_VREG(VIFF_BIT_CNT)); + if (vdec_frame_based(vdec)) { + reset_process_time(hw); + hw->dec_result = DEC_RESULT_GET_DATA; + vdec_schedule_work(&hw->work); + } + } else if (reg == MPEG12_DATA_EMPTY) { /*timeout when decoding next frame*/ debug_print(DECODE_ID(hw), PRINT_FLAG_VLD_DETAIL, - "mmpeg12: lack data, lvl=%x ctrl=%x bcnt=%x\n", + "%s: Insufficient data, lvl=%x ctrl=%x bcnt=%x\n", + __func__, READ_VREG(VLD_MEM_VIFIFO_LEVEL), READ_VREG(VLD_MEM_VIFIFO_CONTROL), READ_VREG(VIFF_BIT_CNT)); - if (vdec_frame_based(vdec)) { - /* vmpeg12_save_hw_context(hw); */ - reset_process_time(hw); - hw->dec_result = DEC_RESULT_DONE; + u32 bitcnt = READ_VREG(VIFF_BIT_CNT); + if (bitcnt < 32) { + reset_process_time(hw); + hw->dec_result = DEC_RESULT_GET_DATA; + } else { + userdata_pushed_drop(hw); + hw->dec_result = DEC_RESULT_DONE; + } vdec_schedule_work(&hw->work); } else { hw->dec_result = DEC_RESULT_AGAIN; @@ -1886,7 +1910,7 @@ static irqreturn_t vmpeg12_isr_thread_fn(struct vdec_s *vdec, int irq) reset_process_time(hw); } return IRQ_HANDLED; - } else { + } else { /* MPEG12_PIC_DONE, MPEG12_SEQ_END */ reset_process_time(hw); info = READ_VREG(MREG_PIC_INFO); @@ -2135,6 +2159,8 @@ static int notify_v4l_eos(struct vdec_s *vdec) static void vmpeg12_work_implement(struct vdec_mpeg12_hw_s *hw, struct vdec_s *vdec, int from) { + int r; + if (hw->dec_result != DEC_RESULT_DONE) debug_print(DECODE_ID(hw), PRINT_FLAG_RUN_FLOW, "%s, result=%d, status=%d\n", __func__, @@ -2173,6 +2199,39 @@ static void vmpeg12_work_implement(struct vdec_mpeg12_hw_s *hw, vdec_vframe_dirty(vdec, hw->chunk); hw->chunk = NULL; vdec_clean_input(vdec); + + r = vdec_prepare_input(vdec, &hw->chunk); + if (r < 0) { + hw->input_empty++; + reset_process_time(hw); + hw->dec_result = DEC_RESULT_GET_DATA; + debug_print(DECODE_ID(hw), PRINT_FLAG_DEC_DETAIL, + "%s: Insufficient data, get data retry\n", __func__); + vdec_schedule_work(&hw->work); + return; + } + hw->input_empty = 0; + if (vdec_frame_based(vdec) && (hw->chunk != NULL)) { + r = hw->chunk->size + + (hw->chunk->offset & (VDEC_FIFO_ALIGN - 1)); + WRITE_VREG(VIFF_BIT_CNT, r * 8); + if (vdec->mvfrm) + vdec->mvfrm->frame_size += hw->chunk->size; + } + debug_print(DECODE_ID(hw), PRINT_FLAG_VDEC_STATUS, + "%s: %x %x %x size %d, bitcnt %d\n", + __func__, + READ_VREG(VLD_MEM_VIFIFO_LEVEL), + READ_VREG(VLD_MEM_VIFIFO_WP), + READ_VREG(VLD_MEM_VIFIFO_RP), + r, READ_VREG(VIFF_BIT_CNT)); + vdec_enable_input(vdec); + hw->dec_result = DEC_RESULT_NONE; + hw->last_vld_level = 0; + start_process_time_set(hw); + hw->init_flag = 1; + mod_timer(&hw->check_timer, jiffies + CHECK_INTERVAL); + WRITE_VREG(MREG_BUFFEROUT, 0); return; } else if (hw->dec_result == DEC_RESULT_FORCE_EXIT) { debug_print(DECODE_ID(hw), PRINT_FLAG_ERROR, @@ -2612,7 +2671,8 @@ static void reset_process_time(struct vdec_mpeg12_hw_s *hw) max_process_time[DECODE_ID(hw)] = process_time; } } -static void start_process_time(struct vdec_mpeg12_hw_s *hw) + +static void start_process_time_set(struct vdec_mpeg12_hw_s *hw) { if ((hw->refs[1] != -1) && (hw->refs[0] == -1)) hw->decode_timeout_count = 1; @@ -2620,6 +2680,7 @@ static void start_process_time(struct vdec_mpeg12_hw_s *hw) hw->decode_timeout_count = 10; hw->start_process_time = jiffies; } + static void timeout_process(struct vdec_mpeg12_hw_s *hw) { struct vdec_s *vdec = hw_to_vdec(hw); @@ -2690,7 +2751,7 @@ static void check_timer_func(unsigned long arg) static int vmpeg12_hw_ctx_restore(struct vdec_mpeg12_hw_s *hw) { - u32 index, i; + u32 index = -1, i; struct aml_vcodec_ctx * v4l2_ctx = hw->v4l2_ctx; index = find_free_buffer(hw); @@ -3068,6 +3129,15 @@ void (*callback)(struct vdec_s *, void *), return; } + hw->input_empty = 0; + if ((vdec_frame_based(vdec)) && + (hw->chunk != NULL)) { + size = hw->chunk->size + + (hw->chunk->offset & (VDEC_FIFO_ALIGN - 1)); + WRITE_VREG(VIFF_BIT_CNT, size * 8); + if (vdec->mvfrm) + vdec->mvfrm->frame_size = hw->chunk->size; + } if (vdec_frame_based(vdec) && !vdec_secure(vdec)) { /* HW needs padding (NAL start) for frame ending */ char* tail = (char *)hw->chunk->block->start_virt; @@ -3080,7 +3150,7 @@ void (*callback)(struct vdec_s *, void *), codec_mm_dma_flush(tail, 4, DMA_TO_DEVICE); } - if (vdec_frame_based(vdec) && debug_enable) { + if (vdec_frame_based(vdec) && debug_enable && !vdec_secure(vdec)) { u8 *data = NULL; if (hw->chunk) debug_print(DECODE_ID(hw), PRINT_FLAG_RUN_FLOW, @@ -3107,42 +3177,32 @@ void (*callback)(struct vdec_s *, void *), if (debug_enable & PRINT_FRAMEBASE_DATA ) { int jj; - + debug_print(DECODE_ID(hw), PRINT_FRAMEBASE_DATA, + "frame data:\n"); for (jj = 0; jj < size; jj++) { if ((jj & 0xf) == 0) - debug_print(DECODE_ID(hw), - PRINT_FRAMEBASE_DATA, - "%06x:", jj); - debug_print(DECODE_ID(hw), - PRINT_FRAMEBASE_DATA, - "%02x ", data[jj]); + pr_info("%06x:", jj); + pr_info("%02x ", data[jj]); if (((jj + 1) & 0xf) == 0) - debug_print(DECODE_ID(hw), - PRINT_FRAMEBASE_DATA, - "\n"); + pr_info("\n"); } + pr_info("\n"); } if (!hw->chunk->block->is_mapped) codec_mm_unmap_phyaddr(data); - } else + } else { debug_print(DECODE_ID(hw), PRINT_FLAG_VDEC_STATUS, - "%s: %x %x %x %x %x size 0x%x\n", + "%s: %x %x %x %x %x size 0x%x, bitcnt %d\n", __func__, READ_VREG(VLD_MEM_VIFIFO_LEVEL), READ_VREG(VLD_MEM_VIFIFO_WP), READ_VREG(VLD_MEM_VIFIFO_RP), STBUF_READ(&vdec->vbuf, get_rp), STBUF_READ(&vdec->vbuf, get_wp), - size); - - if (vdec->mvfrm && hw->chunk) - vdec->mvfrm->frame_size = hw->chunk->size; - - hw->input_empty = 0; - vdec_enable_input(vdec); + size, READ_VREG(VIFF_BIT_CNT)); + } - hw->dec_result = DEC_RESULT_NONE; if (vdec->mc_loaded) { /*firmware have load before, and not changes to another. @@ -3161,6 +3221,7 @@ void (*callback)(struct vdec_s *, void *), vdec->mc_loaded = 1; vdec->mc_type = VFORMAT_MPEG12; } + if (vmpeg12_hw_ctx_restore(hw) < 0) { hw->dec_result = DEC_RESULT_ERROR; debug_print(DECODE_ID(hw), PRINT_FLAG_ERROR, @@ -3169,9 +3230,11 @@ void (*callback)(struct vdec_s *, void *), return; } /*wmb();*/ + hw->dec_result = DEC_RESULT_NONE; hw->stat |= STAT_MC_LOAD; + vdec_enable_input(vdec); hw->last_vld_level = 0; - start_process_time(hw); + start_process_time_set(hw); if (vdec->mvfrm) vdec->mvfrm->hw_decode_start = local_clock(); amvdec_start(); diff --git a/firmware/video_ucode.bin b/firmware/video_ucode.bin index a36e3d7..2499e5e 100644 --- a/firmware/video_ucode.bin +++ b/firmware/video_ucode.bin @@ -1,4 +1,4 @@ -עR.<HK|UK2w?Աprhc2*ufʙ +,T#-W{RU<-Deڨ&h6cΰ7JfwܒT7t0t[ioi@ebaz ^Zt-@0HJ݅FF)'xt[O6'KdWTagmg@x @ I` @@ -494,7 +494,7 @@ An+,wA 2 ?2 x3 - + @ @@ -932,7 +932,7 @@ An+,wA 2 ?2 x3 - + @ @@ -1365,7 +1365,7 @@ An+,wA 2 ?2 x3 - + @ @@ -1805,7 +1805,7 @@ An+,wA 2 ?2 x3 - + @x Ȁ @@ -1819,7 +1819,7 @@ H H @p 6
-@ +@ % x @@ -1830,7 +1830,7 @@ H H x -@ +@ @ I` x` @@ -2319,7 +2319,7 @@ HCP
HCX
"@Ir C C @ Ir C C 3 -C C B LCH +C C B LCH @ I` x` @@ -2807,7 +2807,7 @@ HCP
HCX
"@Ir C C @ Ir C C 3 -C C B LCH +C C B LCH @ I` x` @@ -3295,7 +3295,7 @@ HCP
HCX
"@Ir C C @ Ir C C 3 -C C B LCH +C C B LCH I v G @@ -3388,7 +3388,7 @@ U T%H @ID T%H @ID T%H @ID -U +U I@ v G @@ -3490,7 +3490,7 @@ U T%H @ID T%H @ID T%H @ID -U +U I@ v @@ -3587,7 +3587,7 @@ U T%H @ID T%H @ID T%H @ID -U +U I v @@ -3693,7 +3693,7 @@ U T%H @ID T%H @ID T%H @ID -U +U x B< @@ -4247,14 +4247,14 @@ I G -G"@ @@#A +G"@ @@#A - + x B< @@ -4814,7 +4814,7 @@ I G @C# -G"@ ?#@A +G"@ ?#@A x B< @@ -5362,7 +5362,7 @@ I G -G"@ @@#A +G"@ @@#A x B< @@ -5912,10 +5912,10 @@ I G -G"@ @@#A +G"@ @@#A - + I ! `xI@ C @ @@ -6313,7 +6313,7 @@ EG EŅ " EG ņ -EŇ " +EŇ " I ! `iI@ C @ @@ -6685,7 +6685,7 @@ EŇ@x EG ł EŃ@ -` +` I ! `xI@ C @ @@ -7057,7 +7057,7 @@ EŇ@x EG ł EŃ@ -` +` I ! `iI@ C @ @@ -7455,7 +7455,7 @@ EG EŅ " EG ņ -EŇ " +EŇ " I ! `xI@ C @ @@ -7827,7 +7827,7 @@ EŇ@x EG ł EŃ@ -` +` I ! `xI@ C @ @@ -8225,7 +8225,7 @@ EG EŅ " EG ņ -EŇ " +EŇ " x @@ -8407,7 +8407,7 @@ n J` -J` +J` @@ -8605,7 +8605,7 @@ n J` -J` +J` +@+ @@ -9090,7 +9090,7 @@ C@ B B -@ +@ +@+ @@ -9576,7 +9576,7 @@ C@ B B -@ +@ @@ -9875,7 +9875,7 @@ G *C(I( ,J@($,*F ( ) ("L(h! ( 튂( ( ,J@ ($("Lh! ( 튂( , -("Lh! ( 튂( +("Lh! ( 튂( @@ -10173,26 +10173,26 @@ G *C(I( ,J@($,*F ( ) ("L(h! ( 튂( ( ,J@ ($("Lh! ( 튂( , -("Lh! ( 튂( +("Lh! ( 튂( - + - + -:x +:x G
@a @x -x +@x , - + -@ +@ ! @@ -10205,48 +10205,48 @@ J G$ ` - + @I - + o -I@Ip v Gv v Gw p v Gv v Gw +I@Ip v Gv v Gw p v Gv v Gw - + -k@W@\ - +k@W@a + r -H - +H + @I ` G
` - +x G`HR@ `"@ - - + + b 2x -B - - +B + + - + - + A @a - + @@ -10256,7 +10256,7 @@ G
` @I ^ G \ G Z -I +I @@ -10272,39 +10272,45 @@ QRIc P PCIIG
B G LI B HbBx a t - +x + > + + L + + +<x -@_ +_ GIǁ a O I@I - + - + > @x - & - + + xQL FLBL -@Lr@ǁ +@Lr@ǁ ?I H I HR I Ix I I L H2X - + - + @@ -10323,9 +10329,9 @@ H2X I A@_` -T@GL~ -U - +T@GL~ +U + A@ @@ -10362,28 +10368,28 @@ E=== E DL>L D@ @ -@xHR& b@I"@J@Hb +@xHR& b@I"@J@Hb - + - + - + -:x +:x G
@a @x -x + , - + - + ! @@ -10396,48 +10402,48 @@ J G$ ` - + @I - + o -I@Ip v Gv v Gw p v Gv v Gw +I@Ip v Gv v Gw p v Gv v Gw - + -k@W_ - +k@Wd + r -H - +H + @I ` G
` -x +@x G`HR@ `"@ - - + + b 2x -B - - +B + + - + - + A @a - + @@ -10447,7 +10453,7 @@ G
` @I ^ G \ G Z -I +I @@ -10463,25 +10469,31 @@ QRIc P PCIIG
B G LI B HbBx a t - +x + > + + L + + +?x -b +@c GIǁ a O I@I - + - + > @x - & - + + xQL FLBL -@Lr@ǁ +@Lr@ǁ ?I H I HR I Ix I I @@ -10490,14 +10502,14 @@ I@I H2X IH - + - + @@ -10516,9 +10528,9 @@ H2X I A@_` -T@GL@~ -U - +T@GL@~ +U + A@ @@ -10555,9 +10567,9 @@ E=== E DL>L D@ @ -@xHR& b@I"@J@Hb +@xHR& b@I"@J@Hb - + G+ % @@ -10849,7 +10861,7 @@ G @ ! G - + y G@, % @@ -11167,7 +11179,7 @@ G *C(I( ,J@($,*F ( ) ("L(h! ( 튂( ( ,J@ ($("Lh! ( 튂( , -("Lh! ( 튂( +("Lh! ( 튂( y G@, % @@ -11485,7 +11497,7 @@ G *C(I( ,J@($,*F ( ) ("L(h! ( 튂( ( ,J@ ($("Lh! ( 튂( , -("Lh! ( 튂( +("Lh! ( 튂( G+ % @@ -11777,7 +11789,7 @@ G @ ! G - + x ` x @@ -11992,7 +12004,7 @@ E - + x ` x @@ -12207,7 +12219,7 @@ E - + x ` x @@ -12429,7 +12441,7 @@ E - + @ I` @@ -12819,7 +12831,7 @@ H *AL+CLh j@ j - + @ I` @x` @@ -13209,7 +13221,7 @@ H *AL+CLh j@ j - + @ I` /y` @@ -13658,7 +13670,7 @@ H *AL+CLh j@ j - + @ I` @x` @@ -14042,7 +14054,7 @@ H *AL+CLh j@ j - + 3 @@ -14877,7 +14889,7 @@ q @ -:1 +:1 3 @@ -15713,7 +15725,7 @@ q @ -:1 +:1 @` @@ -16362,7 +16374,7 @@ J2x 0 ` - + @` @@ -17011,7 +17023,7 @@ J2x 0 ` - + @x @` @x @@ -17658,7 +17670,7 @@ J2x 0 ` - + x @@ -18193,7 +18205,7 @@ H$` JI JI'@BH - + x @x @@ -18726,7 +18738,7 @@ H$` ' - + x @@ -19246,7 +19258,7 @@ H$` ' - + x @x @@ -19777,7 +19789,7 @@ H$` JI JI'@BH - + x @@ -20312,7 +20324,7 @@ H$` JI JI'@BH - + x x @@ -20849,7 +20861,7 @@ H$` JI JI'@BH -A +A x @@ -21384,7 +21396,7 @@ H$` JI JI'@BH - + @x @@ -21991,7 +22003,7 @@ H - + +@+@ @@ -22315,7 +22327,7 @@ a .
AB+@+@ -J` JJ` +J` JJ` +@+@ @@ -22637,7 +22649,7 @@ a .
AB+@+@ -J` JJ` +J` JJ` +@+@ @@ -22959,7 +22971,7 @@ a .
AB+@+@ -J` JJ` +J` JJ` +@+@ @@ -23278,7 +23290,7 @@ a .
AB+@+@ -J` JJ` +J` JJ` +@+@ @@ -23600,7 +23612,7 @@ a .
AB+@+@ -J` JJ` +J` JJ` +@+@ @@ -23925,7 +23937,7 @@ a .
AB+@+@ -J` JJ` +J` JJ` FL CL R@ I` x` @@ -24153,7 +24165,7 @@ E=== E DL>L D@ @ -xHR& b@I"@J@Hb +xHR& b@I"@J@Hb FL CL R@ I` x` @@ -24379,4 +24391,4 @@ E=== E DL>L D@ @ -xHR& b@I"@J@Hb +xHR& b@I"@J@Hb |