h265: CF1 optimize suffix sei or dv meta process flow [1/1]
PD#SWPL-184803
Problem:
1.optimize suffix sei or dv meta process flow
2.Move vdec interrupt handling to CPU1 for processing.
Solution:
1.optimize suffix sei or dv meta process flow
2.T3X move vdec interrupt handling to CPU1 for processing.
Verify:
T3X
Change-Id: I45a31458d0ece21ba32ae8aec93538b1cf0b8694
Signed-off-by: xing.xu <xing.xu@amlogic.com>
diff --git a/drivers/frame_provider/decoder/h265/vh265.c b/drivers/frame_provider/decoder/h265/vh265.c
index 0a036a9..3f3e4db 100644
--- a/drivers/frame_provider/decoder/h265/vh265.c
+++ b/drivers/frame_provider/decoder/h265/vh265.c
@@ -2021,6 +2021,7 @@
struct completion complete;
u32 data_size_bak;
u32 data_offset_bak;
+ bool check_suffix_data;
} /*hevc_stru_t */;
struct hevc_RPS_s {
@@ -11539,10 +11540,13 @@
&& (frmbase_multi_slice == 1)) {
hevc->consume_byte = READ_VREG(HEVC_SHIFT_BYTE_COUNT) - 8;
hevc->dec_result = DEC_RESULT_UNFINISH;
+ if (efficiency_mode)
+ hevc->check_suffix_data = true;
} else {
hevc->data_size = 0;
hevc->data_offset = 0;
hevc->dec_result = DEC_RESULT_DONE;
+ hevc->check_suffix_data = false;
}
if ((!input_stream_based(vdec) &&
@@ -11653,7 +11657,12 @@
}
}
ATRACE_COUNTER(hevc->trace.decode_time_name, DECODER_ISR_THREAD_EDN);
- vh265_work_implement(hevc, vdec, 0);
+ if (hevc->check_suffix_data && dec_status == HEVC_DECPIC_DATA_DONE) {
+ WRITE_VREG(HEVC_DEC_STATUS_REG, HEVC_ACTION_DONE);
+ start_process_time(hevc);
+ return IRQ_HANDLED;
+ } else
+ vh265_work_implement(hevc, vdec, 0);
}
return IRQ_HANDLED;
@@ -12582,6 +12591,14 @@
return IRQ_HANDLED;
}
}
+
+ if (dec_status == HEVC_SLICE_SEGMENT_DONE && hevc->check_suffix_data) {
+ hevc->check_suffix_data = false;
+
+ hevc->dec_result = DEC_RESULT_UNFINISH;
+ vdec_schedule_work(&hevc->work);
+ return IRQ_HANDLED;
+ }
ATRACE_COUNTER(hevc->trace.decode_time_name, DECODER_ISR_END);
return IRQ_WAKE_THREAD;
}
@@ -14397,7 +14414,7 @@
int i;
hevc->dec_again_cnt = 0;
decode_frame_count[hevc->index]++;
- if (hevc->multi_frame_flag)
+ if (hevc->check_suffix_data)
goto done_end;
#ifdef DETREFILL_ENABLE
@@ -15144,6 +15161,8 @@
(hevc->dec_result == DEC_RESULT_UNFINISH)) {
u32 res_byte = hevc->data_size - hevc->consume_byte;
+ hevc->data_offset_bak = hevc->data_offset;
+ hevc->data_size_bak = hevc->data_size;
hevc_print(hevc, PRINT_FLAG_VDEC_DETAIL,
"%s before, consume 0x%x, size 0x%x, offset 0x%x, res 0x%x\n", __func__,
hevc->consume_byte, hevc->data_size, hevc->data_offset + hevc->consume_byte, res_byte);
@@ -15182,8 +15201,6 @@
(hevc->chunk != NULL)) {
hevc->data_offset = hevc->chunk->offset;
hevc->data_size = r;
- hevc->data_offset_bak = hevc->chunk->offset;
- hevc->data_size_bak = r;
}
hevc->multi_frame_flag = 0;
WRITE_VREG(HEVC_WAIT_FLAG, 0);
@@ -15334,6 +15351,7 @@
if (is_vcpu_clk_set())
WRITE_VREG(HEVC_DECODE_COUNT, hevc->decode_idx);
hevc->init_flag = 1;
+ hevc->check_suffix_data = false;
if (hevc->pic_list_init_flag == 3)
init_pic_list_hw(hevc);
diff --git a/drivers/frame_provider/decoder/h265_fb/vh265_fb.c b/drivers/frame_provider/decoder/h265_fb/vh265_fb.c
index e231aca..be894aa 100644
--- a/drivers/frame_provider/decoder/h265_fb/vh265_fb.c
+++ b/drivers/frame_provider/decoder/h265_fb/vh265_fb.c
@@ -2290,6 +2290,7 @@
struct completion complete;
u32 data_size_bak;
u32 data_offset_bak;
+ bool check_suffix_data;
} /*hevc_stru_t */;
struct hevc_RPS_s {
@@ -12874,10 +12875,15 @@
) {
hevc->consume_byte = READ_VREG(HEVC_SHIFT_BYTE_COUNT) - 8;
hevc->dec_result = DEC_RESULT_UNFINISH;
+ if (efficiency_mode &&
+ hevc->front_back_mode == 0)
+ hevc->check_suffix_data = true;
} else {
hevc->data_size = 0;
hevc->data_offset = 0;
hevc->dec_result = DEC_RESULT_DONE;
+ if (hevc->front_back_mode == 0)
+ hevc->check_suffix_data = false;
}
if ((!input_stream_based(vdec) &&
@@ -13027,7 +13033,12 @@
hevc->dec_result = DEC_RESULT_AGAIN;
}
ATRACE_COUNTER(hevc->trace.decode_time_name, DECODER_ISR_THREAD_EDN);
- vh265_work_implement(hevc,hw_to_vdec(hevc), 0);
+ if (hevc->check_suffix_data && dec_status == HEVC_DECPIC_DATA_DONE) {
+ WRITE_VREG(HEVC_DEC_STATUS_REG, HEVC_ACTION_DONE);
+ start_process_time(hevc);
+ return IRQ_HANDLED;
+ } else
+ vh265_work_implement(hevc,hw_to_vdec(hevc), 0);
}
return IRQ_HANDLED;
@@ -14214,6 +14225,14 @@
return IRQ_HANDLED;
}
}
+
+ if (dec_status == HEVC_SLICE_SEGMENT_DONE && hevc->check_suffix_data) {
+ hevc->check_suffix_data = false;
+
+ hevc->dec_result = DEC_RESULT_UNFINISH;
+ vdec_schedule_work(&hevc->work);
+ return IRQ_HANDLED;
+ }
ATRACE_COUNTER(hevc->trace.decode_time_name, DECODER_ISR_END);
return IRQ_WAKE_THREAD;
}
@@ -16136,7 +16155,7 @@
hevc->dec_again_cnt = 0;
decode_frame_count[hevc->index]++;
- if (hevc->multi_frame_flag)
+ if (hevc->check_suffix_data)
goto done_end;
#ifdef DETREFILL_ENABLE
if (hevc->is_swap &&
@@ -17475,6 +17494,8 @@
(hevc->dec_result == DEC_RESULT_UNFINISH)) {
u32 res_byte = hevc->data_size - hevc->consume_byte;
+ hevc->data_offset_bak = hevc->data_offset;
+ hevc->data_size_bak = hevc->data_size;
hevc_print(hevc, PRINT_FLAG_VDEC_DETAIL,
"%s before, consume 0x%x, size 0x%x, offset 0x%x, res 0x%x\n", __func__,
hevc->consume_byte, hevc->data_size, hevc->data_offset + hevc->consume_byte, res_byte);
@@ -17509,8 +17530,6 @@
(hevc->chunk != NULL)) {
hevc->data_offset = hevc->chunk->offset;
hevc->data_size = r;
- hevc->data_offset_bak = hevc->chunk->offset;
- hevc->data_size_bak = r;
}
hevc->multi_frame_flag = 0;
if (hevc->front_back_mode == 0)
@@ -17703,6 +17722,7 @@
/*WRITE_VREG(HEVC_DECODE_COUNT, hevc->decode_idx);*/
hevc->init_flag = 1;
hevc->start_decoder_flag = 0;
+ hevc->check_suffix_data = false;
if (hevc->pic_list_init_flag == 3) {
if (efficiency_mode == 0) {
#ifdef NEW_FB_CODE
diff --git a/drivers/frame_provider/decoder/utils/vdec.c b/drivers/frame_provider/decoder/utils/vdec.c
index 26da19f..924970f 100644
--- a/drivers/frame_provider/decoder/utils/vdec.c
+++ b/drivers/frame_provider/decoder/utils/vdec.c
@@ -6485,6 +6485,13 @@
vdec_core->isr_context[num].dev_isr = handler;
vdec_core->isr_context[num].dev_threaded_isr = thread_fn;
vdec_core->isr_context[num].dev_id = dev;
+
+ if (get_cpu_major_id() == AM_MESON_CPU_MAJOR_ID_T3X) {
+ if (num_online_cpus() > 1)
+ irq_set_affinity_hint(res_irq, cpumask_of(1));
+ } else {
+ irq_set_affinity_hint(res_irq, get_cpu_mask(num_online_cpus()));
+ }
ret = request_threaded_irq(res_irq,
vdec_isr,
vdec_thread_isr,
diff --git a/drivers/frame_provider/decoder_v4l/h265/vh265.c b/drivers/frame_provider/decoder_v4l/h265/vh265.c
index 082fd31..b17807e 100644
--- a/drivers/frame_provider/decoder_v4l/h265/vh265.c
+++ b/drivers/frame_provider/decoder_v4l/h265/vh265.c
@@ -2018,6 +2018,7 @@
u32 data_size_bak;
u32 data_offset_bak;
struct mmu_copy mmu_copy_array[BUF_FBC_NUM_MAX];
+ bool check_suffix_data;
} /*hevc_stru_t */;
struct hevc_RPS_s {
@@ -12035,10 +12036,13 @@
&& (frmbase_multi_slice == 1)) {
hevc->consume_byte = READ_VREG(HEVC_SHIFT_BYTE_COUNT) - 8;
hevc->dec_result = DEC_RESULT_UNFINISH;
+ if (efficiency_mode)
+ hevc->check_suffix_data = true;
} else {
hevc->data_size = 0;
hevc->data_offset = 0;
hevc->dec_result = DEC_RESULT_DONE;
+ hevc->check_suffix_data = false;
}
if ((!input_stream_based(vdec) &&
@@ -12157,7 +12161,13 @@
}
}
ATRACE_COUNTER(hevc->trace.decode_time_name, DECODER_ISR_THREAD_EDN);
- vh265_work_implement(hevc, vdec, 0);
+ if (hevc->check_suffix_data && dec_status == HEVC_DECPIC_DATA_DONE) {
+ hevc->last_dec_result = DEC_RESULT_UNFINISH;
+ WRITE_VREG(HEVC_DEC_STATUS_REG, HEVC_ACTION_DONE);
+ start_process_time(hevc);
+ return IRQ_HANDLED;
+ } else
+ vh265_work_implement(hevc, vdec, 0);
}
return IRQ_HANDLED;
@@ -13053,6 +13063,13 @@
}
}
+ if (dec_status == HEVC_SLICE_SEGMENT_DONE && hevc->check_suffix_data) {
+ hevc->check_suffix_data = false;
+
+ hevc->dec_result = DEC_RESULT_UNFINISH;
+ vdec_schedule_work(&hevc->work);
+ return IRQ_HANDLED;
+ }
ATRACE_COUNTER(hevc->trace.decode_time_name, DECODER_ISR_END);
return IRQ_WAKE_THREAD;
@@ -14882,7 +14899,7 @@
ctx->decoder_status_info.decoder_count++;
decode_frame_count[hevc->index]++;
- if (hevc->multi_frame_flag)
+ if (hevc->check_suffix_data)
goto done_end;
#ifdef DETREFILL_ENABLE
@@ -15608,6 +15625,8 @@
(hevc->dec_result == DEC_RESULT_UNFINISH)) {
u32 res_byte = hevc->data_size - hevc->consume_byte;
+ hevc->data_offset_bak = hevc->data_offset;
+ hevc->data_size_bak = hevc->data_size;
hevc_print(hevc, PRINT_FLAG_VDEC_DETAIL,
"%s before, consume 0x%x, size 0x%x, offset 0x%x, res 0x%x\n", __func__,
hevc->consume_byte, hevc->data_size, hevc->data_offset + hevc->consume_byte, res_byte);
@@ -15644,11 +15663,11 @@
}
if ((vdec_frame_based(vdec)) &&
(hevc->chunk != NULL)) {
- hevc->data_offset = hevc->chunk->offset;
- hevc->data_size = r;
- }
- hevc->multi_frame_flag = 0;
- WRITE_VREG(HEVC_WAIT_FLAG, 0);
+ hevc->data_offset = hevc->chunk->offset;
+ hevc->data_size = r;
+ }
+ hevc->multi_frame_flag = 0;
+ WRITE_VREG(HEVC_WAIT_FLAG, 0);
}
vdec_tracing(&ctx->vtr, VTRACE_DEC_ST_0, r);
@@ -15794,6 +15813,7 @@
if (is_vcpu_clk_set())
WRITE_VREG(HEVC_DECODE_COUNT, hevc->decode_idx);
hevc->init_flag = 1;
+ hevc->check_suffix_data = false;
if (hevc->pic_list_init_flag == 3)
init_pic_list_hw(hevc);
diff --git a/drivers/frame_provider/decoder_v4l/h265_fb/vh265_fb_v4l.c b/drivers/frame_provider/decoder_v4l/h265_fb/vh265_fb_v4l.c
index d0748c1..d952232 100644
--- a/drivers/frame_provider/decoder_v4l/h265_fb/vh265_fb_v4l.c
+++ b/drivers/frame_provider/decoder_v4l/h265_fb/vh265_fb_v4l.c
@@ -2278,6 +2278,7 @@
u32 data_size_bak;
u32 data_offset_bak;
struct mmu_copy mmu_copy_array[BUF_FBC_NUM_MAX];
+ bool check_suffix_data;
} /*hevc_stru_t */;
struct hevc_RPS_s {
@@ -13235,10 +13236,15 @@
) {
hevc->consume_byte = READ_VREG(HEVC_SHIFT_BYTE_COUNT) - 8;
hevc->dec_result = DEC_RESULT_UNFINISH;
+ if (efficiency_mode &&
+ hevc->front_back_mode == 0)
+ hevc->check_suffix_data = true;
} else {
hevc->data_size = 0;
hevc->data_offset = 0;
hevc->dec_result = DEC_RESULT_DONE;
+ if (hevc->front_back_mode == 0)
+ hevc->check_suffix_data = false;
}
if ((!input_stream_based(vdec) &&
@@ -13361,7 +13367,13 @@
}
}
ATRACE_COUNTER(hevc->trace.decode_time_name, DECODER_ISR_THREAD_EDN);
- vh265_work_implement(hevc,hw_to_vdec(hevc), 0);
+ if (hevc->check_suffix_data && dec_status == HEVC_DECPIC_DATA_DONE) {
+ hevc->last_dec_result = DEC_RESULT_UNFINISH;
+ WRITE_VREG(HEVC_DEC_STATUS_REG, HEVC_ACTION_DONE);
+ start_process_time(hevc);
+ return IRQ_HANDLED;
+ } else
+ vh265_work_implement(hevc,hw_to_vdec(hevc), 0);
}
return IRQ_HANDLED;
@@ -14518,6 +14530,14 @@
return IRQ_HANDLED;
}
}
+
+ if (dec_status == HEVC_SLICE_SEGMENT_DONE && hevc->check_suffix_data) {
+ hevc->check_suffix_data = false;
+
+ hevc->dec_result = DEC_RESULT_UNFINISH;
+ vdec_schedule_work(&hevc->work);
+ return IRQ_HANDLED;
+ }
ATRACE_COUNTER(hevc->trace.decode_time_name, DECODER_ISR_END);
return IRQ_WAKE_THREAD;
@@ -16398,7 +16418,7 @@
int i;
decode_frame_count[hevc->index]++;
- if (hevc->multi_frame_flag)
+ if (hevc->check_suffix_data)
goto done_end;
#ifdef DETREFILL_ENABLE
if (hevc->is_swap &&
@@ -17713,6 +17733,8 @@
(hevc->dec_result == DEC_RESULT_UNFINISH)) {
u32 res_byte = hevc->data_size - hevc->consume_byte;
+ hevc->data_offset_bak = hevc->data_offset;
+ hevc->data_size_bak = hevc->data_size;
hevc_print(hevc, PRINT_FLAG_VDEC_DETAIL,
"%s before, consume 0x%x, size 0x%x, offset 0x%x, res 0x%x\n", __func__,
hevc->consume_byte, hevc->data_size, hevc->data_offset + hevc->consume_byte, res_byte);
@@ -17747,8 +17769,6 @@
(hevc->chunk != NULL)) {
hevc->data_offset = hevc->chunk->offset;
hevc->data_size = r;
- hevc->data_offset_bak = hevc->chunk->offset;
- hevc->data_size_bak = r;
}
hevc->multi_frame_flag = 0;
if (hevc->front_back_mode == 0)
@@ -17930,6 +17950,7 @@
/*WRITE_VREG(HEVC_DECODE_COUNT, hevc->decode_idx);*/
hevc->init_flag = 1;
hevc->start_decoder_flag = 0;
+ hevc->check_suffix_data = false;
if (hevc->pic_list_init_flag == 3) {
if (efficiency_mode == 0) {
#ifdef NEW_FB_CODE