author | Nanxin Qin <nanxin.qin@amlogic.com> | 2019-12-30 03:27:44 (GMT) |
---|---|---|
committer | Nanxin Qin <nanxin.qin@amlogic.com> | 2020-01-15 05:49:58 (GMT) |
commit | b7134870248cddc7ddd17a75e2c04094e6b9416a (patch) | |
tree | e596fb5c5918948847b4f68153295f3eccb5730e | |
parent | f828b96a24c656b7ad66607c7de4258d432af2fc (diff) | |
download | media_modules-b7134870248cddc7ddd17a75e2c04094e6b9416a.zip media_modules-b7134870248cddc7ddd17a75e2c04094e6b9416a.tar.gz media_modules-b7134870248cddc7ddd17a75e2c04094e6b9416a.tar.bz2 |
decode: the second part of local reset patches. [1/1]
PD#SWPL-18664
Problem:
optimize local reset when decode error happened.
Solution:
optimize local reset when decode error happened
Verify:
u212
Change-Id: I3a32c5a21e125a412167c839cd28cee108f1dcd0
Signed-off-by: Nanxin Qin <nanxin.qin@amlogic.com>
-rw-r--r-- | drivers/frame_provider/decoder/avs/avs.c | 41 | ||||
-rw-r--r-- | drivers/frame_provider/decoder/vc1/vvc1.c | 46 |
2 files changed, 46 insertions, 41 deletions
diff --git a/drivers/frame_provider/decoder/avs/avs.c b/drivers/frame_provider/decoder/avs/avs.c index 642c3bb..c7e7f7d 100644 --- a/drivers/frame_provider/decoder/avs/avs.c +++ b/drivers/frame_provider/decoder/avs/avs.c @@ -644,7 +644,6 @@ static void vavs_isr(void) decoder_bmmu_box_get_mem_handle( mm_blk_handle, buffer_index); - kfifo_put(&display_q, (const struct vframe_s *)vf); ATRACE_COUNTER(MODULE_NAME, vf->pts); @@ -727,6 +726,7 @@ static void vavs_isr(void) mm_blk_handle, buffer_index); decoder_do_frame_check(NULL, vf); + kfifo_put(&display_q, (const struct vframe_s *)vf); ATRACE_COUNTER(MODULE_NAME, vf->pts); @@ -1161,7 +1161,7 @@ static int vavs_prot_init(void) #ifdef AVSP_LONG_CABAC static unsigned char es_write_addr[MAX_CODED_FRAME_SIZE] __aligned(64); #endif -static void vavs_local_init(void) +static void vavs_local_init(bool is_reset) { int i; @@ -1180,19 +1180,23 @@ static void vavs_local_init(void) #ifdef DEBUG_PTS pts_hit = pts_missed = pts_i_hit = pts_i_missed = 0; #endif - INIT_KFIFO(display_q); - INIT_KFIFO(recycle_q); - INIT_KFIFO(newframe_q); - for (i = 0; i < VF_POOL_SIZE; i++) { - const struct vframe_s *vf = &vfpool[i]; + if (!is_reset) { + INIT_KFIFO(display_q); + INIT_KFIFO(recycle_q); + INIT_KFIFO(newframe_q); + + for (i = 0; i < VF_POOL_SIZE; i++) { + const struct vframe_s *vf = &vfpool[i]; - vfpool[i].index = vf_buf_num; - vfpool[i].bufWidth = 1920; - kfifo_put(&newframe_q, vf); + vfpool[i].index = vf_buf_num; + vfpool[i].bufWidth = 1920; + kfifo_put(&newframe_q, vf); + } + + for (i = 0; i < vf_buf_num; i++) + vfbuf_use[i] = 0; } - for (i = 0; i < vf_buf_num; i++) - vfbuf_use[i] = 0; cur_vfpool = vfpool; @@ -1232,7 +1236,7 @@ static void vavs_ppmgr_reset(void) { vf_notify_receiver(PROVIDER_NAME, VFRAME_EVENT_PROVIDER_RESET, NULL); - vavs_local_init(); + vavs_local_init(true); pr_info("vavs: vf_ppmgr_reset\n"); } @@ -1241,12 +1245,12 @@ static void vavs_ppmgr_reset(void) static void vavs_local_reset(void) { mutex_lock(&vavs_mutex); - recover_flag = 1; + //recover_flag = 1; pr_info("error, local reset\n"); amvdec_stop(); msleep(100); vf_notify_receiver(PROVIDER_NAME, VFRAME_EVENT_PROVIDER_RESET, NULL); - vavs_local_init(); + vavs_local_init(true); vavs_recover(); @@ -1283,7 +1287,7 @@ static void vavs_fatal_error_handler(struct work_struct *work) vavs_ppmgr_reset(); #else vf_light_unreg_provider(&vavs_vf_prov); - vavs_local_init(); + vavs_local_init(true); vf_reg_provider(&vavs_vf_prov); #endif vavs_recover(); @@ -1341,7 +1345,7 @@ static void vavs_put_timer_func(unsigned long arg) vavs_ppmgr_reset(); #else vf_light_unreg_provider(&vavs_vf_prov); - vavs_local_init(); + vavs_local_init(true); vf_reg_provider(&vavs_vf_prov); #endif vavs_recover(); @@ -1409,7 +1413,6 @@ static void vavs_put_timer_func(unsigned long arg) kfifo_put(&newframe_q, (const struct vframe_s *)vf); } - } if (frame_dur > 0 && saved_resolution != @@ -1548,7 +1551,7 @@ static s32 vavs_init(void) stat |= STAT_TIMER_INIT; amvdec_enable(); - vavs_local_init(); + vavs_local_init(false); if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_GXM) size = get_firmware_data(VIDEO_DEC_AVS, buf); diff --git a/drivers/frame_provider/decoder/vc1/vvc1.c b/drivers/frame_provider/decoder/vc1/vvc1.c index 1616893..3904fd5 100644 --- a/drivers/frame_provider/decoder/vc1/vvc1.c +++ b/drivers/frame_provider/decoder/vc1/vvc1.c @@ -101,7 +101,7 @@ static int vvc1_vf_states(struct vframe_states *states, void *); static int vvc1_event_cb(int type, void *data, void *private_data); static int vvc1_prot_init(void); -static void vvc1_local_init(void); +static void vvc1_local_init(bool is_reset); static const char vvc1_dec_id[] = "vvc1-dev"; @@ -496,7 +496,6 @@ static irqreturn_t vvc1_isr(int irq, void *dev_id) decoder_bmmu_box_get_mem_handle( mm_blk_handle, buffer_index); - kfifo_put(&display_q, (const struct vframe_s *)vf); ATRACE_COUNTER(MODULE_NAME, vf->pts); @@ -556,7 +555,6 @@ static irqreturn_t vvc1_isr(int irq, void *dev_id) decoder_bmmu_box_get_mem_handle( mm_blk_handle, buffer_index); - kfifo_put(&display_q, (const struct vframe_s *)vf); ATRACE_COUNTER(MODULE_NAME, vf->pts); @@ -642,6 +640,7 @@ static irqreturn_t vvc1_isr(int irq, void *dev_id) decoder_bmmu_box_get_mem_handle( mm_blk_handle, buffer_index); + kfifo_put(&display_q, (const struct vframe_s *)vf); ATRACE_COUNTER(MODULE_NAME, vf->pts); @@ -719,7 +718,7 @@ static int vvc1_event_cb(int type, void *data, void *private_data) vf_light_unreg_provider(&vvc1_vf_prov); #endif spin_lock_irqsave(&lock, flags); - vvc1_local_init(); + vvc1_local_init(true); vvc1_prot_init(); spin_unlock_irqrestore(&lock, flags); #ifndef CONFIG_AMLOGIC_POST_PROCESS_MANAGER @@ -920,7 +919,7 @@ static int vvc1_prot_init(void) return r; } -static void vvc1_local_init(void) +static void vvc1_local_init(bool is_reset) { int i; @@ -942,25 +941,28 @@ static void vvc1_local_init(void) memset(&frm, 0, sizeof(frm)); - for (i = 0; i < DECODE_BUFFER_NUM_MAX; i++) - vfbuf_use[i] = 0; + if (!is_reset) { + for (i = 0; i < DECODE_BUFFER_NUM_MAX; i++) + vfbuf_use[i] = 0; - INIT_KFIFO(display_q); - INIT_KFIFO(recycle_q); - INIT_KFIFO(newframe_q); - cur_pool_idx ^= 1; - for (i = 0; i < VF_POOL_SIZE; i++) { - const struct vframe_s *vf; + INIT_KFIFO(display_q); + INIT_KFIFO(recycle_q); + INIT_KFIFO(newframe_q); + cur_pool_idx ^= 1; + for (i = 0; i < VF_POOL_SIZE; i++) { + const struct vframe_s *vf; - if (cur_pool_idx == 0) { - vf = &vfpool[i]; - vfpool[i].index = DECODE_BUFFER_NUM_MAX; + if (cur_pool_idx == 0) { + vf = &vfpool[i]; + vfpool[i].index = DECODE_BUFFER_NUM_MAX; } else { - vf = &vfpool2[i]; - vfpool2[i].index = DECODE_BUFFER_NUM_MAX; + vf = &vfpool2[i]; + vfpool2[i].index = DECODE_BUFFER_NUM_MAX; } - kfifo_put(&newframe_q, (const struct vframe_s *)vf); + kfifo_put(&newframe_q, (const struct vframe_s *)vf); + } } + if (mm_blk_handle) { decoder_bmmu_box_free(mm_blk_handle); mm_blk_handle = NULL; @@ -980,7 +982,7 @@ static void vvc1_ppmgr_reset(void) { vf_notify_receiver(PROVIDER_NAME, VFRAME_EVENT_PROVIDER_RESET, NULL); - vvc1_local_init(); + vvc1_local_init(true); /* vf_notify_receiver(PROVIDER_NAME, * VFRAME_EVENT_PROVIDER_START,NULL); @@ -1008,7 +1010,7 @@ static void error_do_work(struct work_struct *work) vvc1_ppmgr_reset(); #else vf_light_unreg_provider(&vvc1_vf_prov); - vvc1_local_init(); + vvc1_local_init(true); vf_reg_provider(&vvc1_vf_prov); #endif vvc1_prot_init(); @@ -1062,7 +1064,7 @@ static s32 vvc1_init(void) intra_output = 0; amvdec_enable(); - vvc1_local_init(); + vvc1_local_init(false); if (vvc1_amstream_dec_info.format == VIDEO_DEC_FORMAT_WMV3) { pr_info("WMV3 dec format\n"); |