Project import generated by Copybara.

GitOrigin-RevId: 9a8f48e904d2d8e81fafc4ef146826aca9541b3a
Change-Id: I4ad8b1ef175e8d5b79008e437263ac972c62b334
diff --git a/drivers/frame_provider/decoder/vp9/vvp9.c b/drivers/frame_provider/decoder/vp9/vvp9.c
index 2111c6a..ce4c496 100644
--- a/drivers/frame_provider/decoder/vp9/vvp9.c
+++ b/drivers/frame_provider/decoder/vp9/vvp9.c
@@ -9546,17 +9546,10 @@
 			if (!vdec_frame_based(hw_to_vdec(pbi)))
 				dec_again_process(pbi);
 			else {
-				if (pbi->common.show_existing_frame) {
 					pbi->dec_result = DEC_RESULT_DONE;
 					amhevc_stop();
 					vdec_schedule_work(&pbi->work);
 				}
-				else {
-					pbi->dec_result = DEC_RESULT_ERROR;
-					amhevc_stop();
-					vdec_schedule_work(&pbi->work);
-				}
-			}
 		}
 		pbi->process_busy = 0;
 		return IRQ_HANDLED;
@@ -11189,9 +11182,13 @@
 		pbi->process_state = PROC_STATE_INIT;
 		decode_frame_count[pbi->index] = pbi->frame_count;
 
-		if (pbi->mmu_enable)
+		if (pbi->mmu_enable) {
 			pbi->used_4k_num =
 				(READ_VREG(HEVC_SAO_MMU_STATUS) >> 16);
+			ATRACE_COUNTER(pbi->trace.decode_header_memory_time_name, TRACE_HEADER_MEMORY_START);
+			vp9_recycle_mmu_buf_tail(pbi);
+			ATRACE_COUNTER(pbi->trace.decode_header_memory_time_name, TRACE_HEADER_MEMORY_END);
+		}
 		vp9_print(pbi, PRINT_FLAG_VDEC_STATUS,
 			"%s (===> %d) dec_result %d %x %x %x shiftbytes 0x%x decbytes 0x%x\n",
 			__func__,
@@ -11247,9 +11244,13 @@
 		pbi->frame_count++;
 		pbi->process_state = PROC_STATE_INIT;
 
-		if (pbi->mmu_enable)
+		if (pbi->mmu_enable) {
 			pbi->used_4k_num =
 				(READ_VREG(HEVC_SAO_MMU_STATUS) >> 16);
+			ATRACE_COUNTER(pbi->trace.decode_header_memory_time_name, TRACE_HEADER_MEMORY_START);
+			vp9_recycle_mmu_buf_tail(pbi);
+			ATRACE_COUNTER(pbi->trace.decode_header_memory_time_name, TRACE_HEADER_MEMORY_END);
+		}
 		vp9_print(pbi, PRINT_FLAG_VDEC_STATUS,
 			"%s (===> %d) dec_result %d %x %x %x shiftbytes 0x%x decbytes 0x%x\n",
 			__func__,
@@ -11262,8 +11263,6 @@
 			READ_VREG(HEVC_SHIFT_BYTE_COUNT) -
 			pbi->start_shift_bytes);
 		amhevc_stop();
-	} else if (pbi->dec_result == DEC_RESULT_ERROR) {
-		vdec_vframe_dirty(hw_to_vdec(pbi), pbi->chunk);
 	}
 	if (pbi->stat & STAT_VDEC_RUN) {
 		amhevc_stop();
diff --git a/drivers/frame_provider/decoder/vp9_fb/vvp9_fb.c b/drivers/frame_provider/decoder/vp9_fb/vvp9_fb.c
index d16436d..f7c42bb 100644
--- a/drivers/frame_provider/decoder/vp9_fb/vvp9_fb.c
+++ b/drivers/frame_provider/decoder/vp9_fb/vvp9_fb.c
@@ -12776,7 +12776,6 @@
 			if (!vdec_frame_based(hw_to_vdec(pbi)))
 				dec_again_process(pbi);
 			else {
-				if (pbi->common.show_existing_frame) {
 					pbi->dec_result = DEC_RESULT_DONE;
 #ifdef NEW_FB_CODE
 					if (pbi->front_back_mode == 1) {
@@ -12789,11 +12788,6 @@
 					}
 					vdec_schedule_work(&pbi->work);
 				}
-				else {
-					pbi->dec_result = DEC_RESULT_GET_DATA;
-					vdec_schedule_work(&pbi->work);
-				}
-			}
 		}
 		pbi->process_busy = 0;
 		return IRQ_HANDLED;
@@ -14776,9 +14770,15 @@
 		pbi->process_state = PROC_STATE_INIT;
 		decode_frame_count[pbi->index] = pbi->frame_count;
 
-		if (pbi->mmu_enable)
+		if (pbi->mmu_enable) {
 			pbi->used_4k_num =
 				(READ_VREG(HEVC_SAO_MMU_STATUS) >> 16);
+			if (pbi->front_back_mode == 0) {
+				ATRACE_COUNTER(pbi->trace.decode_header_memory_time_name, TRACE_HEADER_MEMORY_START);
+				vp9_recycle_mmu_buf_tail(pbi);
+				ATRACE_COUNTER(pbi->trace.decode_header_memory_time_name, TRACE_HEADER_MEMORY_END);
+			}
+		}
 		vp9_print(pbi, PRINT_FLAG_VDEC_STATUS,
 			"%s (===> %d) dec_result %d %x %x %x shiftbytes 0x%x decbytes 0x%x\n",
 			__func__,
@@ -14838,9 +14838,15 @@
 		pbi->frame_count++;
 		pbi->process_state = PROC_STATE_INIT;
 
-		if (pbi->mmu_enable)
+		if (pbi->mmu_enable) {
 			pbi->used_4k_num =
 				(READ_VREG(HEVC_SAO_MMU_STATUS) >> 16);
+			if (pbi->front_back_mode == 0) {
+				ATRACE_COUNTER(pbi->trace.decode_header_memory_time_name, TRACE_HEADER_MEMORY_START);
+				vp9_recycle_mmu_buf_tail(pbi);
+				ATRACE_COUNTER(pbi->trace.decode_header_memory_time_name, TRACE_HEADER_MEMORY_END);
+			}
+		}
 		vp9_print(pbi, PRINT_FLAG_VDEC_STATUS,
 			"%s (===> %d) dec_result %d %x %x %x shiftbytes 0x%x decbytes 0x%x\n",
 			__func__,
diff --git a/drivers/frame_provider/decoder_v4l/vp9/vvp9.c b/drivers/frame_provider/decoder_v4l/vp9/vvp9.c
index ce5d86c..0d93ba8 100644
--- a/drivers/frame_provider/decoder_v4l/vp9/vvp9.c
+++ b/drivers/frame_provider/decoder_v4l/vp9/vvp9.c
@@ -1255,6 +1255,7 @@
 	ulong rdma_mem_handle;
 	bool timeout;
 	int v4l_duration;
+	bool has_unfinish;
 };
 
 static int vp9_print(struct VP9Decoder_s *pbi,
@@ -8539,20 +8540,14 @@
 				vp9_buf_ref_process_for_exception(pbi);
 				dec_again_process(pbi);
 			} else {
-				if (pbi->common.show_existing_frame) {
+				if (!pbi->common.show_existing_frame) {
+					if (pbi->has_unfinish != true)
+						vdec_v4l_post_error_frame_event(ctx);
+				}
 					pbi->dec_result = DEC_RESULT_DONE;
 					amhevc_stop();
 					vdec_schedule_work(&pbi->work);
 				}
-				else {
-					if (vdec_frame_based(hw_to_vdec(pbi)))
-						if (pbi->dec_result != DEC_RESULT_UNFINISH)
-							vdec_v4l_post_error_frame_event(ctx);
-					pbi->dec_result = DEC_RESULT_ERROR;
-					amhevc_stop();
-					vdec_schedule_work(&pbi->work);
-				}
-			}
 		}
 		pbi->process_busy = 0;
 		return IRQ_HANDLED;
@@ -9851,9 +9846,13 @@
 		decode_frame_count[pbi->index] = pbi->frame_count;
 		ctx->decoder_status_info.decoder_count++;
 
-		if (pbi->mmu_enable)
+		if (pbi->mmu_enable) {
 			pbi->used_4k_num =
 				(READ_VREG(HEVC_SAO_MMU_STATUS) >> 16);
+			ATRACE_COUNTER(pbi->trace.decode_header_memory_time_name, TRACE_HEADER_MEMORY_START);
+			vp9_recycle_mmu_buf_tail(pbi);
+			ATRACE_COUNTER(pbi->trace.decode_header_memory_time_name, TRACE_HEADER_MEMORY_END);
+		}
 		vp9_print(pbi, PRINT_FLAG_VDEC_STATUS,
 			"%s (===> %d) dec_result %d %x %x %x shiftbytes 0x%x decbytes 0x%x\n",
 			__func__,
@@ -9909,9 +9908,13 @@
 		pbi->frame_count++;
 		pbi->process_state = PROC_STATE_INIT;
 
-		if (pbi->mmu_enable)
+		if (pbi->mmu_enable) {
 			pbi->used_4k_num =
 				(READ_VREG(HEVC_SAO_MMU_STATUS) >> 16);
+			ATRACE_COUNTER(pbi->trace.decode_header_memory_time_name, TRACE_HEADER_MEMORY_START);
+			vp9_recycle_mmu_buf_tail(pbi);
+			ATRACE_COUNTER(pbi->trace.decode_header_memory_time_name, TRACE_HEADER_MEMORY_END);
+		}
 		vp9_print(pbi, PRINT_FLAG_VDEC_STATUS,
 			"%s (===> %d) dec_result %d %x %x %x shiftbytes 0x%x decbytes 0x%x\n",
 			__func__,
@@ -9924,8 +9927,6 @@
 			READ_VREG(HEVC_SHIFT_BYTE_COUNT) -
 			pbi->start_shift_bytes);
 		amhevc_stop();
-	} else if (pbi->dec_result == DEC_RESULT_ERROR) {
-		vdec_vframe_dirty(hw_to_vdec(pbi), pbi->chunk);
 	}
 	if (pbi->stat & STAT_VDEC_RUN) {
 		amhevc_stop();
@@ -10289,6 +10290,8 @@
 		(pbi->dec_result == DEC_RESULT_UNFINISH)) {
 		u32 res_byte = pbi->data_size - pbi->consume_byte;
 
+		pbi->has_unfinish = true;
+
 		vp9_print(pbi, VP9_DEBUG_BUFMGR,
 			"%s before, consume 0x%x, size 0x%x, offset 0x%x, res 0x%x\n", __func__,
 			pbi->consume_byte, pbi->data_size, pbi->data_offset + pbi->consume_byte, res_byte);
@@ -10320,13 +10323,13 @@
 			pbi->data_offset = pbi->chunk->offset;
 			pbi->data_size = size;
 		}
+		pbi->has_unfinish = false;
 		WRITE_VREG(HEVC_ASSIST_SCRATCH_C, 0);
 	}
 
 	vdec_tracing(&ctx->vtr, VTRACE_DEC_ST_0, size);
 
 	input_empty[pbi->index] = 0;
-	if (pbi->dec_result != DEC_RESULT_UNFINISH)
 		pbi->dec_result = DEC_RESULT_NONE;
 	pbi->start_shift_bytes = READ_VREG(HEVC_SHIFT_BYTE_COUNT);
 
diff --git a/drivers/frame_provider/decoder_v4l/vp9_fb/vvp9_fb_v4l.c b/drivers/frame_provider/decoder_v4l/vp9_fb/vvp9_fb_v4l.c
index f872f54..29da897 100644
--- a/drivers/frame_provider/decoder_v4l/vp9_fb/vvp9_fb_v4l.c
+++ b/drivers/frame_provider/decoder_v4l/vp9_fb/vvp9_fb_v4l.c
@@ -1592,6 +1592,7 @@
 	int triple_write_mode;
 	int start_decoder_flag;
 	int v4l_duration;
+	bool has_unfinish;
 };
 
 #ifdef NEW_FRONT_BACK_CODE
@@ -11647,7 +11648,10 @@
 				vp9_buf_ref_process_for_exception(pbi);
 				dec_again_process(pbi);
 			} else {
-				if (pbi->common.show_existing_frame) {
+				if (!pbi->common.show_existing_frame) {
+					if (pbi->has_unfinish != true)
+						vdec_v4l_post_error_frame_event(ctx);
+				}
 					pbi->dec_result = DEC_RESULT_DONE;
 #ifdef NEW_FB_CODE
 					if (pbi->front_back_mode == 1)
@@ -11657,13 +11661,6 @@
 						amhevc_stop();
 					vdec_schedule_work(&pbi->work);
 				}
-				else {
-					pbi->dec_result = DEC_RESULT_GET_DATA;
-					if (vdec_frame_based(hw_to_vdec(pbi)))
-						vdec_v4l_post_error_frame_event(ctx);
-					vdec_schedule_work(&pbi->work);
-				}
-			}
 		}
 		pbi->process_busy = 0;
 		return IRQ_HANDLED;
@@ -13275,9 +13272,15 @@
 		pbi->process_state = PROC_STATE_INIT;
 		decode_frame_count[pbi->index] = pbi->frame_count;
 
-		if (pbi->mmu_enable)
+		if (pbi->mmu_enable) {
 			pbi->used_4k_num =
 				(READ_VREG(HEVC_SAO_MMU_STATUS) >> 16);
+			if (pbi->front_back_mode == 0) {
+				ATRACE_COUNTER(pbi->trace.decode_header_memory_time_name, TRACE_HEADER_MEMORY_START);
+				vp9_recycle_mmu_buf_tail(pbi);
+				ATRACE_COUNTER(pbi->trace.decode_header_memory_time_name, TRACE_HEADER_MEMORY_END);
+			}
+		}
 		vp9_print(pbi, PRINT_FLAG_VDEC_STATUS,
 			"%s (===> %d) dec_result %d %x %x %x shiftbytes 0x%x decbytes 0x%x\n",
 			__func__,
@@ -13338,9 +13341,15 @@
 		pbi->frame_count++;
 		pbi->process_state = PROC_STATE_INIT;
 
-		if (pbi->mmu_enable)
+		if (pbi->mmu_enable) {
 			pbi->used_4k_num =
 				(READ_VREG(HEVC_SAO_MMU_STATUS) >> 16);
+			if (pbi->front_back_mode == 0) {
+				ATRACE_COUNTER(pbi->trace.decode_header_memory_time_name, TRACE_HEADER_MEMORY_START);
+				vp9_recycle_mmu_buf_tail(pbi);
+				ATRACE_COUNTER(pbi->trace.decode_header_memory_time_name, TRACE_HEADER_MEMORY_END);
+			}
+		}
 		vp9_print(pbi, PRINT_FLAG_VDEC_STATUS,
 			"%s (===> %d) dec_result %d %x %x %x shiftbytes 0x%x decbytes 0x%x\n",
 			__func__,
@@ -13790,6 +13799,8 @@
 		(pbi->dec_result == DEC_RESULT_UNFINISH)) {
 		u32 res_byte = pbi->data_size - pbi->consume_byte;
 
+		pbi->has_unfinish = true;
+
 		vp9_print(pbi, VP9_DEBUG_BUFMGR,
 			"%s before, consume 0x%x, size 0x%x, offset 0x%x, res 0x%x\n", __func__,
 			pbi->consume_byte, pbi->data_size, pbi->data_offset + pbi->consume_byte, res_byte);
@@ -13821,6 +13832,7 @@
 			pbi->data_offset = pbi->chunk->offset;
 			pbi->data_size = size;
 		}
+		pbi->has_unfinish = false;
 		WRITE_VREG(HEVC_ASSIST_SCRATCH_C, 0);
 	}
 
diff --git a/firmware/A311D2/video_ucode.bin b/firmware/A311D2/video_ucode.bin
index 914b08a..c47f429 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 a2e2b39..58af456 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 7f3a33a..a6de262 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 3eb4c8b..642bef0 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 89e8b47..07cda83 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 3eb4c8b..642bef0 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 551aa68..c7f5235 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 d7e0762..a9a217d 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 819a181..f5bd077 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 4a5fa04..764f178 100644
--- a/firmware/S805X2G/video_ucode.bin
+++ b/firmware/S805X2G/video_ucode.bin
Binary files differ
diff --git a/firmware/S905C2/video_ucode.bin b/firmware/S905C2/video_ucode.bin
index b9ba336..7db09de 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 7722877..09e8986 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 9b1d19d..ba9f09d 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 c3c81f2..e38e06e 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 a3cb0b0..0fc001e 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 f4ad452..4d79de7 100644
--- a/firmware/S905C3NMA/video_ucode.bin
+++ b/firmware/S905C3NMA/video_ucode.bin
Binary files differ
diff --git a/firmware/S905W2/video_ucode.bin b/firmware/S905W2/video_ucode.bin
index 6f6f983..068b2f3 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 694ad26..cb7dc26 100644
--- a/firmware/S905X4/video_ucode.bin
+++ b/firmware/S905X4/video_ucode.bin
Binary files differ
diff --git a/firmware/S905Y4/video_ucode.bin b/firmware/S905Y4/video_ucode.bin
index 3604eb8..28da452 100644
--- a/firmware/S905Y4/video_ucode.bin
+++ b/firmware/S905Y4/video_ucode.bin
Binary files differ
diff --git a/firmware/S928X/video_ucode.bin b/firmware/S928X/video_ucode.bin
index ec5b898..0ec91de 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 e729152..75c302f 100644
--- a/firmware/S928XENG/video_ucode.bin
+++ b/firmware/S928XENG/video_ucode.bin
Binary files differ
diff --git a/firmware/T950S/video_ucode.bin b/firmware/T950S/video_ucode.bin
index 8158f4f..577f8cf 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 a1c8bb1..ec4899c 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 7f39de0..ab01b1e 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 daabb78..9c71083 100644
--- a/firmware/T963D4ENG/video_ucode.bin
+++ b/firmware/T963D4ENG/video_ucode.bin
Binary files differ
diff --git a/firmware/T965D4/video_ucode.bin b/firmware/T965D4/video_ucode.bin
index d0a5151..85ea9fa 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 8d13140..9adbede 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 67d7fca..512a8eb 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 87e74df..beeb17c 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 a1c8bb1..ec4899c 100755
--- a/firmware/video_ucode.bin
+++ b/firmware/video_ucode.bin
Binary files differ