summaryrefslogtreecommitdiff
authorNanxin 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)
commitb7134870248cddc7ddd17a75e2c04094e6b9416a (patch)
treee596fb5c5918948847b4f68153295f3eccb5730e
parentf828b96a24c656b7ad66607c7de4258d432af2fc (diff)
downloadmedia_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>
Diffstat
-rw-r--r--drivers/frame_provider/decoder/avs/avs.c41
-rw-r--r--drivers/frame_provider/decoder/vc1/vvc1.c46
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");