av1: CB2 fix playback crash problems in specail cases. [1/1]
PD#SWPL-191799
Problem:
Because isr fun cannot run in time, timeout triggers a decoding exception.
Solution:
Turn off the timer function in isr to prevent both timeout and isr fun
from being triggered.
Verify:
S5.
Change-Id: I84ee7a7fa7be83523611c4cf1bbdfaae11dccb6d
Signed-off-by: gan.zhang <gan.zhang@amlogic.com>
diff --git a/drivers/frame_provider/decoder/vav1_fb/vav1_fb.c b/drivers/frame_provider/decoder/vav1_fb/vav1_fb.c
index c18988e..340a820 100644
--- a/drivers/frame_provider/decoder/vav1_fb/vav1_fb.c
+++ b/drivers/frame_provider/decoder/vav1_fb/vav1_fb.c
@@ -1205,6 +1205,7 @@
return;
}
+ reset_process_time_back(hw);
hw->timeout_num_back++;
av1_print(hw, 0, "%s decoder timeout, lcu 0x%x \n", __func__, READ_VREG(HEVC_PARSER_LCU_START));
if (hw->front_back_mode == 1) {
@@ -1225,7 +1226,6 @@
hevc->decoding_pic = NULL;
hevc->dec_result = DEC_RESULT_DONE;
#endif
- reset_process_time_back(hw);
if (work_pending(&hw->work_back))
return;
@@ -9635,7 +9635,6 @@
) {
hw->front_irq_time = local_clock();
if (hw->m_ins_flag) {
- reset_process_time(hw);
if (!vdec_frame_based(hw_to_vdec(hw)))
dec_again_process(hw);
else {
@@ -9705,7 +9704,7 @@
//config_next_ref_info_hw(hw);
}
#endif
- reset_process_time(hw);
+
#ifdef NEW_FB_CODE
if ((hw->front_back_mode != 1) && (hw->front_back_mode != 3)) {
#endif
@@ -9867,8 +9866,6 @@
if (dec_status == AOM_EOS) {
DEBUG_PRINT_FUNC_LINE("eos status in");
- if (hw->m_ins_flag)
- reset_process_time(hw);
av1_print(hw, AOM_DEBUG_HW_MORE, "AV1_EOS, flush buffer\r\n");
@@ -9892,8 +9889,6 @@
av1_print(hw, AOM_DEBUG_HW_MORE, "av1 decode oversize !!\n");
hw->fatal_error |= DECODER_FATAL_ERROR_SIZE_OVERFLOW;
hw->process_busy = 0;
- if (hw->m_ins_flag)
- reset_process_time(hw);
return IRQ_HANDLED;
}
@@ -10033,9 +10028,6 @@
if (hw->frame_decoded)
hw->one_compressed_data_done = 1;
- if (hw->m_ins_flag)
- reset_process_time(hw);
-
if (hw->process_state != PROC_STATE_SENDAGAIN
) {
if (hw->one_compressed_data_done) {
@@ -10360,6 +10352,8 @@
}
ATRACE_COUNTER(hw->trace.decode_time_name, DECODER_ISR_END);
DEBUG_PRINT_FUNC_LINE("vav1_isr_end");
+ if (hw->m_ins_flag)
+ reset_process_time(hw);
return IRQ_WAKE_THREAD;
}
@@ -12573,7 +12567,8 @@
return IRQ_HANDLED;
}
- /**/
+
+ reset_process_time_back(hw);
return IRQ_WAKE_THREAD;
}
#if 1
@@ -12779,7 +12774,6 @@
"fg_data0 0x%x fg_data1 0x%x fg_valid %d\n",
fg_reg0, fg_reg1, hw->fgs_valid);
- reset_process_time_back(hw);
if (hw->front_back_mode == 1) {
if (front_back_debug & 2) {
printk("BackEnd data done %d, fb_rd_pos %d pic %px, crc (%x, %x), y_crc (%x, %x), c_crc (%x, %x)\n",
diff --git a/drivers/frame_provider/decoder_v4l/vav1_fb/vav1_fb_v4l.c b/drivers/frame_provider/decoder_v4l/vav1_fb/vav1_fb_v4l.c
index 5349307..ef24b23 100644
--- a/drivers/frame_provider/decoder_v4l/vav1_fb/vav1_fb_v4l.c
+++ b/drivers/frame_provider/decoder_v4l/vav1_fb/vav1_fb_v4l.c
@@ -1187,6 +1187,8 @@
static void timeout_process_back(struct AV1HW_s *hw)
{
+ reset_process_time_back(hw);
+
hw->timeout_num_back++;
av1_print(hw, 0, "%s decoder timeout\n", __func__);
if (hw->front_back_mode == 1) {
@@ -1207,7 +1209,6 @@
hevc->decoding_pic = NULL;
hevc->dec_result = DEC_RESULT_DONE;
#endif
- reset_process_time_back(hw);
if (work_pending(&hw->work_back))
return;
@@ -9224,7 +9225,6 @@
) {
hw->front_irq_time = local_clock();
if (hw->m_ins_flag) {
- reset_process_time(hw);
if (!vdec_frame_based(hw_to_vdec(hw))) {
av1_buf_ref_process_for_exception(hw);
dec_again_process(hw);
@@ -9291,7 +9291,6 @@
hw->config_next_ref_info_flag = 1; /*to do: low_latency_flag case*/
}
#endif
- reset_process_time(hw);
#ifdef NEW_FB_CODE
if ((hw->front_back_mode != 1) && (hw->front_back_mode != 3)) {
@@ -9460,9 +9459,6 @@
}
if (dec_status == AOM_EOS) {
- if (hw->m_ins_flag)
- reset_process_time(hw);
-
av1_print(hw, AOM_DEBUG_HW_MORE, "AV1_EOS, flush buffer\r\n");
av1_postproc(hw);
@@ -9486,8 +9482,6 @@
hw->fatal_error |= DECODER_FATAL_ERROR_SIZE_OVERFLOW;
hw->process_busy = 0;
- if (hw->m_ins_flag)
- reset_process_time(hw);
return IRQ_HANDLED;
}
@@ -9713,9 +9707,6 @@
if (hw->frame_decoded)
hw->one_compressed_data_done = 1;
- if (hw->m_ins_flag)
- reset_process_time(hw);
-
if (hw->process_state != PROC_STATE_SENDAGAIN) {
if (hw->one_compressed_data_done) {
av1_postproc(hw);
@@ -9922,6 +9913,9 @@
return IRQ_HANDLED;
}
}
+
+ if (hw->m_ins_flag)
+ reset_process_time(hw);
ATRACE_COUNTER(hw->trace.decode_time_name, DECODER_ISR_END);
return IRQ_WAKE_THREAD;
}
@@ -12045,6 +12039,7 @@
return IRQ_HANDLED;
}
+ reset_process_time_back(hw);
return IRQ_WAKE_THREAD;
}
#if 1
@@ -12258,7 +12253,6 @@
"fg_data0 0x%x fg_data1 0x%x fg_valid %d\n",
fg_reg0, fg_reg1, hw->fgs_valid);
- reset_process_time_back(hw);
if (hw->front_back_mode == 1) {
if (front_back_debug & 2) {
printk("BackEnd data done %d, fb_rd_pos %d pic %px, crc (%x, %x), y_crc (%x, %x), c_crc (%x, %x)\n",