mpeg2: CB1 t6d mpeg2 play special ts is not smooth [1/1]
PD#SWPL-189979
Problem:
1.T6D mpeg2 keeps reporting error reset
and then the decoder keeps dropping data.
2.MV out of picture rangeļ¼UV request missing
Solution:
1.The ucode reports error_reset and then
resets some of the decoder's registers in the driver,
and then continues to decode after the reset, and no
longer performs the operation of dropping data.
2.mpeg2 add mv error detection and limit
Verify:
t6d
SourceCode:
ucode:
0.4.168-gbfb5e75
I3cfbf
I66376
I6f63f
Idbdf0
I33830
Change-Id: Ie16b058197a4dfeb5b0ff7d862eac9d49c4ec4be
Signed-off-by: xing.xu <xing.xu@amlogic.com>
diff --git a/drivers/frame_provider/decoder/mpeg12/vmpeg12_multi.c b/drivers/frame_provider/decoder/mpeg12/vmpeg12_multi.c
index bc7cd55..ea01dc2 100644
--- a/drivers/frame_provider/decoder/mpeg12/vmpeg12_multi.c
+++ b/drivers/frame_provider/decoder/mpeg12/vmpeg12_multi.c
@@ -2273,6 +2273,56 @@
return false;
}
+#define nop_delay(n) do {nop_cnt = (n); while(nop_cnt--); } while (0)
+
+static void mpeg2_idle_axi_reset(struct vdec_mpeg12_hw_s *hw)
+{
+ int nop_cnt;
+ u32 data, vcop_ctrl;
+
+ if (!is_vdec_hevc_combine())
+ return;
+
+ arb_ctrl_wait_idle(0);
+
+ vcop_ctrl = READ_VREG(VCOP_CTRL_REG);
+
+ WRITE_VREG(DOS_SW_RESET0, 0x40);
+ WRITE_VREG(DOS_SW_RESET0, 0);
+
+ data = READ_VREG(MC_CTRL1);
+ data |= ((1 << 0) | (1 << 2) | (1 << 15));
+ WRITE_VREG(MC_CTRL1, data);
+ data &= ~((1 << 0) | (1 << 2) | (1 << 15));
+ WRITE_VREG(MC_CTRL1, data);
+
+ dos_wait_status(MDEC_PIC_DC_STATUS, 0xffffffff, 0);
+
+ data = READ_VREG(MDEC_PIC_DC_CTRL);
+ data |= ((0x27 << 24) | (1 << 0));
+ WRITE_VREG(MDEC_PIC_DC_CTRL, data);
+ data &= ~((0x27 << 24) | (1 << 0));
+ WRITE_VREG(MDEC_PIC_DC_CTRL, data);
+
+
+ data = READ_VREG(VLD_STATUS_CTRL);
+ data &= ~(1 << 6);
+ data |= (1 << 8);
+ WRITE_VREG(VLD_STATUS_CTRL, data);
+
+ SET_VREG_MASK(POWER_CTL_VLD, ((1 << 13)));
+
+ WRITE_VREG(DOS_SW_RESET0, 0x40);
+ WRITE_VREG(DOS_SW_RESET0, 0);
+ WRITE_VREG(MC_CTRL1, 0x65);
+ WRITE_VREG(MC_CTRL1, 0x60);
+ WRITE_VREG(VCOP_CTRL_REG, vcop_ctrl);
+
+ nop_delay(20);
+ arb_ctrl_wait_idle(1);
+ nop_delay(200);
+}
+
static irqreturn_t vmpeg12_isr_thread_handler(struct vdec_s *vdec, int irq)
{
u32 reg, index, info, seqinfo, offset, pts, frame_size=0, tmp;
@@ -2386,12 +2436,6 @@
reset_process_time(hw);
}
return IRQ_HANDLED;
- } else if (reg == MPEG12_ERROR_RESET) {
- /* for t6d error reset in c drvier */
- userdata_pushed_drop(hw);
- hw->dec_result = DEC_RESULT_DONE;
- vdec_schedule_work(&hw->work);
- return IRQ_HANDLED;
} else {
/* MPEG12_PIC_DONE, MPEG12_SEQ_END */
debug_print(DECODE_ID(hw), PRINT_FLAG_DEC_DETAIL,
@@ -2667,6 +2711,28 @@
WRITE_VREG(ASSIST_MBOX1_CLR_REG, 1);
+ if (READ_VREG(MREG_BUFFEROUT) == MPEG12_ERROR_RESET) {
+ reset_process_time(hw);
+
+ debug_print(DECODE_ID(hw), PRINT_FLAG_VLD_DETAIL,
+ "%s: lvl=%x ctrl=%x bcnt=%x reg %x\n",
+ __func__,
+ READ_VREG(VLD_MEM_VIFIFO_LEVEL),
+ READ_VREG(VLD_MEM_VIFIFO_CONTROL),
+ READ_VREG(VIFF_BIT_CNT), READ_VREG(MREG_BUFFEROUT));
+ /* for t6d error reset in c drvier */
+ if (vdec_frame_based(vdec))
+ userdata_pushed_drop(hw);
+ else
+ userdata_pushed_drop_stream(hw);
+ mpeg2_idle_axi_reset(hw);
+
+ WRITE_VREG(MREG_BUFFEROUT, 0x100);
+ start_process_time_set(hw);
+ hw->process_busy = false;
+ return IRQ_HANDLED;
+ }
+
return IRQ_WAKE_THREAD;
}
diff --git a/drivers/frame_provider/decoder_v4l/mpeg12/vmpeg12_multi.c b/drivers/frame_provider/decoder_v4l/mpeg12/vmpeg12_multi.c
index 9356300..b14dcb6 100644
--- a/drivers/frame_provider/decoder_v4l/mpeg12/vmpeg12_multi.c
+++ b/drivers/frame_provider/decoder_v4l/mpeg12/vmpeg12_multi.c
@@ -2472,6 +2472,56 @@
memset(hw->parse_user_data_buf, 0, CCBUF_SIZE);
}
+#define nop_delay(n) do {nop_cnt = (n); while(nop_cnt--); } while (0)
+
+static void mpeg2_idle_axi_reset(struct vdec_mpeg12_hw_s *hw)
+{
+ int nop_cnt;
+ u32 data, vcop_ctrl;
+
+ if (!is_vdec_hevc_combine())
+ return;
+
+ arb_ctrl_wait_idle(0);
+
+ vcop_ctrl = READ_VREG(VCOP_CTRL_REG);
+
+ WRITE_VREG(DOS_SW_RESET0, 0x40);
+ WRITE_VREG(DOS_SW_RESET0, 0);
+
+ data = READ_VREG(MC_CTRL1);
+ data |= ((1 << 0) | (1 << 2) | (1 << 15));
+ WRITE_VREG(MC_CTRL1, data);
+ data &= ~((1 << 0) | (1 << 2) | (1 << 15));
+ WRITE_VREG(MC_CTRL1, data);
+
+ dos_wait_status(MDEC_PIC_DC_STATUS, 0xffffffff, 0);
+
+ data = READ_VREG(MDEC_PIC_DC_CTRL);
+ data |= ((0x27 << 24) | (1 << 0));
+ WRITE_VREG(MDEC_PIC_DC_CTRL, data);
+ data &= ~((0x27 << 24) | (1 << 0));
+ WRITE_VREG(MDEC_PIC_DC_CTRL, data);
+
+
+ data = READ_VREG(VLD_STATUS_CTRL);
+ data &= ~(1 << 6);
+ data |= (1 << 8);
+ WRITE_VREG(VLD_STATUS_CTRL, data);
+
+ SET_VREG_MASK(POWER_CTL_VLD, ((1 << 13)));
+
+ WRITE_VREG(DOS_SW_RESET0, 0x40);
+ WRITE_VREG(DOS_SW_RESET0, 0);
+ WRITE_VREG(MC_CTRL1, 0x65);
+ WRITE_VREG(MC_CTRL1, 0x60);
+ WRITE_VREG(VCOP_CTRL_REG, vcop_ctrl);
+
+ nop_delay(20);
+ arb_ctrl_wait_idle(1);
+ nop_delay(200);
+}
+
static irqreturn_t vmpeg12_isr_thread_handler(struct vdec_s *vdec, int irq)
{
u32 reg, index, info, seqinfo, offset, frame_size=0, tmp_h, tmp_w;
@@ -2619,13 +2669,7 @@
reset_process_time(hw);
}
return IRQ_HANDLED;
- } else if (reg == MPEG12_ERROR_RESET) {
- /* for t6d error reset in c drvier */
- userdata_pushed_drop(hw);
- hw->dec_result = DEC_RESULT_DONE;
- vdec_schedule_work(&hw->work);
- return IRQ_HANDLED;
- } else { /* MPEG12_PIC_DONE, MPEG12_SEQ_END */
+ }else { /* MPEG12_PIC_DONE, MPEG12_SEQ_END */
debug_print(DECODE_ID(hw), PRINT_FLAG_DEC_DETAIL,
"%s, level %x, wp %x, rp %x, cnt %x\n",
__func__,
@@ -2933,6 +2977,24 @@
WRITE_VREG(ASSIST_MBOX1_CLR_REG, 1);
+ if (READ_VREG(MREG_BUFFEROUT) == MPEG12_ERROR_RESET) {
+ reset_process_time(hw);
+ debug_print(DECODE_ID(hw), PRINT_FLAG_VLD_DETAIL,
+ "%s: lvl=%x ctrl=%x bcnt=%x reg %x\n",
+ __func__,
+ READ_VREG(VLD_MEM_VIFIFO_LEVEL),
+ READ_VREG(VLD_MEM_VIFIFO_CONTROL),
+ READ_VREG(VIFF_BIT_CNT), READ_VREG(MREG_BUFFEROUT));
+ /* for t6d error reset in c drvier */
+ userdata_pushed_drop(hw);
+ mpeg2_idle_axi_reset(hw);
+
+ WRITE_VREG(MREG_BUFFEROUT, 0x100);
+ start_process_time_set(hw);
+ hw->process_busy = false;
+ return IRQ_HANDLED;
+ }
+
return IRQ_WAKE_THREAD;
}
diff --git a/firmware/A311D2/video_ucode.bin b/firmware/A311D2/video_ucode.bin
index f6451fa..e869754 100644
--- a/firmware/A311D2/video_ucode.bin
+++ b/firmware/A311D2/video_ucode.bin
Binary files differ
diff --git a/firmware/A311D2J/video_ucode.bin b/firmware/A311D2J/video_ucode.bin
index c086cd8..5a83c2d 100644
--- a/firmware/A311D2J/video_ucode.bin
+++ b/firmware/A311D2J/video_ucode.bin
Binary files differ
diff --git a/firmware/POP1/video_ucode.bin b/firmware/POP1/video_ucode.bin
index 38f88c5..7380869 100644
--- a/firmware/POP1/video_ucode.bin
+++ b/firmware/POP1/video_ucode.bin
Binary files differ
diff --git a/firmware/S805C1/video_ucode.bin b/firmware/S805C1/video_ucode.bin
index 0ff3025..229a327 100644
--- a/firmware/S805C1/video_ucode.bin
+++ b/firmware/S805C1/video_ucode.bin
Binary files differ
diff --git a/firmware/S805C1A/video_ucode.bin b/firmware/S805C1A/video_ucode.bin
index 36fa746..15b2e35 100644
--- a/firmware/S805C1A/video_ucode.bin
+++ b/firmware/S805C1A/video_ucode.bin
Binary files differ
diff --git a/firmware/S805C1ENG/video_ucode.bin b/firmware/S805C1ENG/video_ucode.bin
index 0ff3025..229a327 100644
--- a/firmware/S805C1ENG/video_ucode.bin
+++ b/firmware/S805C1ENG/video_ucode.bin
Binary files differ
diff --git a/firmware/S805C3/video_ucode.bin b/firmware/S805C3/video_ucode.bin
index 122c7df..12b286e 100644
--- a/firmware/S805C3/video_ucode.bin
+++ b/firmware/S805C3/video_ucode.bin
Binary files differ
diff --git a/firmware/S805C3L/video_ucode.bin b/firmware/S805C3L/video_ucode.bin
index f0ebdd6..8c1fe5f 100644
--- a/firmware/S805C3L/video_ucode.bin
+++ b/firmware/S805C3L/video_ucode.bin
Binary files differ
diff --git a/firmware/S805X2/video_ucode.bin b/firmware/S805X2/video_ucode.bin
index be406ee..b323623 100644
--- a/firmware/S805X2/video_ucode.bin
+++ b/firmware/S805X2/video_ucode.bin
Binary files differ
diff --git a/firmware/S805X2G/video_ucode.bin b/firmware/S805X2G/video_ucode.bin
index 270cd47..6e7ff90 100644
--- a/firmware/S805X2G/video_ucode.bin
+++ b/firmware/S805X2G/video_ucode.bin
Binary files differ
diff --git a/firmware/S805X3/video_ucode.bin b/firmware/S805X3/video_ucode.bin
index fbe9555..4a73925 100644
--- a/firmware/S805X3/video_ucode.bin
+++ b/firmware/S805X3/video_ucode.bin
Binary files differ
diff --git a/firmware/S905C2/video_ucode.bin b/firmware/S905C2/video_ucode.bin
index 41d94fe..2a480fa 100644
--- a/firmware/S905C2/video_ucode.bin
+++ b/firmware/S905C2/video_ucode.bin
Binary files differ
diff --git a/firmware/S905C2ENG/video_ucode.bin b/firmware/S905C2ENG/video_ucode.bin
index e5c6aaa..61ce9b5 100644
--- a/firmware/S905C2ENG/video_ucode.bin
+++ b/firmware/S905C2ENG/video_ucode.bin
Binary files differ
diff --git a/firmware/S905C2L/video_ucode.bin b/firmware/S905C2L/video_ucode.bin
index c273c4f..693313e 100644
--- a/firmware/S905C2L/video_ucode.bin
+++ b/firmware/S905C2L/video_ucode.bin
Binary files differ
diff --git a/firmware/S905C3/video_ucode.bin b/firmware/S905C3/video_ucode.bin
index 8b4285b..e76d24e 100644
--- a/firmware/S905C3/video_ucode.bin
+++ b/firmware/S905C3/video_ucode.bin
Binary files differ
diff --git a/firmware/S905C3ENG/video_ucode.bin b/firmware/S905C3ENG/video_ucode.bin
index 57f5f5a..adb5725 100644
--- a/firmware/S905C3ENG/video_ucode.bin
+++ b/firmware/S905C3ENG/video_ucode.bin
Binary files differ
diff --git a/firmware/S905C3NMA/video_ucode.bin b/firmware/S905C3NMA/video_ucode.bin
index 22db940..2869c3d 100644
--- a/firmware/S905C3NMA/video_ucode.bin
+++ b/firmware/S905C3NMA/video_ucode.bin
Binary files differ
diff --git a/firmware/S905C5/video_ucode.bin b/firmware/S905C5/video_ucode.bin
index 112bb56..97b4b11 100644
--- a/firmware/S905C5/video_ucode.bin
+++ b/firmware/S905C5/video_ucode.bin
Binary files differ
diff --git a/firmware/S905C5ENG/video_ucode.bin b/firmware/S905C5ENG/video_ucode.bin
index 348e51b..3bbf60e 100644
--- a/firmware/S905C5ENG/video_ucode.bin
+++ b/firmware/S905C5ENG/video_ucode.bin
Binary files differ
diff --git a/firmware/S905D5/video_ucode.bin b/firmware/S905D5/video_ucode.bin
index 585f0f8..6fee028 100644
--- a/firmware/S905D5/video_ucode.bin
+++ b/firmware/S905D5/video_ucode.bin
Binary files differ
diff --git a/firmware/S905W2/video_ucode.bin b/firmware/S905W2/video_ucode.bin
index d0c71a5..5236402 100644
--- a/firmware/S905W2/video_ucode.bin
+++ b/firmware/S905W2/video_ucode.bin
Binary files differ
diff --git a/firmware/S905X4/video_ucode.bin b/firmware/S905X4/video_ucode.bin
index 4bf4f31..99201a0 100644
--- a/firmware/S905X4/video_ucode.bin
+++ b/firmware/S905X4/video_ucode.bin
Binary files differ
diff --git a/firmware/S905X5/video_ucode.bin b/firmware/S905X5/video_ucode.bin
index 0515cbe..fdc902f 100644
--- a/firmware/S905X5/video_ucode.bin
+++ b/firmware/S905X5/video_ucode.bin
Binary files differ
diff --git a/firmware/S905X5L/video_ucode.bin b/firmware/S905X5L/video_ucode.bin
index fb2afa7..ed12940 100644
--- a/firmware/S905X5L/video_ucode.bin
+++ b/firmware/S905X5L/video_ucode.bin
Binary files differ
diff --git a/firmware/S905X5M/video_ucode.bin b/firmware/S905X5M/video_ucode.bin
index 4d3cc9e..ba106bf 100644
--- a/firmware/S905X5M/video_ucode.bin
+++ b/firmware/S905X5M/video_ucode.bin
Binary files differ
diff --git a/firmware/S905X5MENG/video_ucode.bin b/firmware/S905X5MENG/video_ucode.bin
index be4fb24..49664ff 100644
--- a/firmware/S905X5MENG/video_ucode.bin
+++ b/firmware/S905X5MENG/video_ucode.bin
Binary files differ
diff --git a/firmware/S905Y4/video_ucode.bin b/firmware/S905Y4/video_ucode.bin
index 3da0107..0e34253 100644
--- a/firmware/S905Y4/video_ucode.bin
+++ b/firmware/S905Y4/video_ucode.bin
Binary files differ
diff --git a/firmware/S905Y5/video_ucode.bin b/firmware/S905Y5/video_ucode.bin
index b081440..e892724 100644
--- a/firmware/S905Y5/video_ucode.bin
+++ b/firmware/S905Y5/video_ucode.bin
Binary files differ
diff --git a/firmware/S905Y5ENG/video_ucode.bin b/firmware/S905Y5ENG/video_ucode.bin
index edce903..2b11732 100644
--- a/firmware/S905Y5ENG/video_ucode.bin
+++ b/firmware/S905Y5ENG/video_ucode.bin
Binary files differ
diff --git a/firmware/S905Y5R/video_ucode.bin b/firmware/S905Y5R/video_ucode.bin
index 8261322..f08cb09 100644
--- a/firmware/S905Y5R/video_ucode.bin
+++ b/firmware/S905Y5R/video_ucode.bin
Binary files differ
diff --git a/firmware/S928X/video_ucode.bin b/firmware/S928X/video_ucode.bin
index 26ab451..5f649b6 100644
--- a/firmware/S928X/video_ucode.bin
+++ b/firmware/S928X/video_ucode.bin
Binary files differ
diff --git a/firmware/S928XENG/video_ucode.bin b/firmware/S928XENG/video_ucode.bin
index 678ebf3..b060f68 100644
--- a/firmware/S928XENG/video_ucode.bin
+++ b/firmware/S928XENG/video_ucode.bin
Binary files differ
diff --git a/firmware/T950D5/video_ucode.bin b/firmware/T950D5/video_ucode.bin
index b47d5c4..c5df3a5 100644
--- a/firmware/T950D5/video_ucode.bin
+++ b/firmware/T950D5/video_ucode.bin
Binary files differ
diff --git a/firmware/T950D5Z/video_ucode.bin b/firmware/T950D5Z/video_ucode.bin
index 516726c..b5382d5 100644
--- a/firmware/T950D5Z/video_ucode.bin
+++ b/firmware/T950D5Z/video_ucode.bin
Binary files differ
diff --git a/firmware/T950S/video_ucode.bin b/firmware/T950S/video_ucode.bin
index 42860ed..47459f9 100644
--- a/firmware/T950S/video_ucode.bin
+++ b/firmware/T950S/video_ucode.bin
Binary files differ
diff --git a/firmware/T962D4/video_ucode.bin b/firmware/T962D4/video_ucode.bin
index afadcef..b065ade 100644
--- a/firmware/T962D4/video_ucode.bin
+++ b/firmware/T962D4/video_ucode.bin
Binary files differ
diff --git a/firmware/T963D4/video_ucode.bin b/firmware/T963D4/video_ucode.bin
index 4b46db6..ec20bfa 100644
--- a/firmware/T963D4/video_ucode.bin
+++ b/firmware/T963D4/video_ucode.bin
Binary files differ
diff --git a/firmware/T963D4ENG/video_ucode.bin b/firmware/T963D4ENG/video_ucode.bin
index e1fcb70..1ae916b 100644
--- a/firmware/T963D4ENG/video_ucode.bin
+++ b/firmware/T963D4ENG/video_ucode.bin
Binary files differ
diff --git a/firmware/T963D4Z/video_ucode.bin b/firmware/T963D4Z/video_ucode.bin
index cfca333..8147059 100644
--- a/firmware/T963D4Z/video_ucode.bin
+++ b/firmware/T963D4Z/video_ucode.bin
Binary files differ
diff --git a/firmware/T965D4/video_ucode.bin b/firmware/T965D4/video_ucode.bin
index 1d29df3..ce9be4d 100644
--- a/firmware/T965D4/video_ucode.bin
+++ b/firmware/T965D4/video_ucode.bin
Binary files differ
diff --git a/firmware/T968D4/video_ucode.bin b/firmware/T968D4/video_ucode.bin
index 47e711f..0f67b50 100644
--- a/firmware/T968D4/video_ucode.bin
+++ b/firmware/T968D4/video_ucode.bin
Binary files differ
diff --git a/firmware/T982/video_ucode.bin b/firmware/T982/video_ucode.bin
index 18213ea..3ec61c5 100644
--- a/firmware/T982/video_ucode.bin
+++ b/firmware/T982/video_ucode.bin
Binary files differ
diff --git a/firmware/V918D/video_ucode.bin b/firmware/V918D/video_ucode.bin
index 03faf47..47d04b3 100644
--- a/firmware/V918D/video_ucode.bin
+++ b/firmware/V918D/video_ucode.bin
Binary files differ
diff --git a/firmware/video_ucode.bin b/firmware/video_ucode.bin
index afadcef..b065ade 100644
--- a/firmware/video_ucode.bin
+++ b/firmware/video_ucode.bin
Binary files differ
diff --git a/version.txt b/version.txt
index abe6fd0..fbd2066 100644
--- a/version.txt
+++ b/version.txt
@@ -1,7 +1,7 @@
-0.4.167-g72c72fe
+0.4.168-gbfb5e75
change id history:
+I3cfbf
I66376
I6f63f
Idbdf0
I33830
-I3f33a