📄 video_dec_isr.c
字号:
{
kal_uint32 savedMask;
GPTI_StopItem(g_video_dec_isr_param.gpt_exception_protect_handle);
/* race condition protect*/
savedMask = SaveAndSetIRQMask();
/* set AV callback function to error report function */
mpeg4_dec_set_error_recover_process();
RestoreIRQMask(savedMask);
/* AV has process done*/
if (g_video_dec_isr_param.b_check_exception == KAL_FALSE)
return;
VIDEO_ASSERT(0);
/* deblock will waste time, disable it */
g_video_dec_info_ptr->force_deblock_disable = KAL_TRUE;
g_video_dec_isr_param.b_check_exception = KAL_FALSE;
mpeg4_dec_lisr_process();
savedMask = SaveAndSetIRQMask();
if (g_video_dec_isr_param.b_check_av_error == KAL_TRUE)
{
/* av intr comes before the recovery. AV will not sync after it. Start recover mechanism */
//video_dec_stop_av();
video_dec_set_av_callback(NULL);
VIDEO_ASSERT(0);
RestoreIRQMask(savedMask);
g_video_dec_isr_param.b_check_av_error = KAL_FALSE;
/*Auto Pause/resume*/
g_video_dec_info_ptr->recover_start = KAL_TRUE;
g_video_dec_info_ptr->recover_start_frame = g_video_dec_info_ptr->dec_frames_no;
video_dec_start_refresh();
visual_active_hisr(VISUAL_MPEG4_DEC_HISR_ID);
}
else
{
/* check AV intr not come before this error recovery */
video_dec_set_av_callback(mpeg4_dec_LISR); /*Avoid race condition*/
RestoreIRQMask(savedMask);
}
}
}
/* Decode LISR function. Act in AV sync LISR context.
* It should check whether next AV intr comes before error recover MP4 intr.
* @param None
* @return None
*/
static void mpeg4_dec_LISR(void) /*AV sync intr.*/
{
kal_uint32 savedMask;
#ifdef __VIDEO_EDITOR__
if (g_video_dec_status.scenario == VIDEO_SCENARIO_EDITOR)
{
EXT_ASSERT(0, 0, 0, 0);
}
#endif /*__VIDEO_EDITOR__*/
if ((g_video_dec_info_ptr->isr_error_event_happen == KAL_TRUE) ||
(g_video_dec_info_ptr->recover_start == KAL_TRUE))
{
return;
}
GPTI_StopItem(g_video_dec_isr_param.gpt_exception_protect_handle);
/* race condition protect*/
savedMask = SaveAndSetIRQMask();
if (g_video_dec_isr_param.b_check_exception == KAL_TRUE)
{
/* mask MP4 intr */
mpeg4_dec_set_error_recover_process();
}
RestoreIRQMask(savedMask);
if ((g_video_dec_isr_param.b_check_exception == KAL_FALSE)
&& (g_video_dec_info_ptr->hdr_parse_frames_no > g_video_dec_info_ptr->dec_frames_no))
{
mpeg4_dec_lisr_process();
}
else
{
/*Auto pause/resume,
1. next AV sync comes before previous error handling (g_video_dec_isr_param.b_check_exception == KAL_TRUE
2. header parse slower than decode (g_video_dec_info_ptr->hdr_parse_frames_no <= g_video_dec_info_ptr->dec_frames_no)*/
VIDEO_ASSERT(0);
/* audio interrupt should continue to count (in order to get time information) */
video_dec_set_av_callback(NULL);
g_video_dec_info_ptr->recover_start = KAL_TRUE;
g_video_dec_info_ptr->recover_start_frame = g_video_dec_info_ptr->dec_frames_no;
visual_active_hisr(VISUAL_MPEG4_DEC_HISR_ID);
g_video_dec_isr_param.b_check_exception = KAL_FALSE;
return;
}
}
///////////////////////////////////////////////////////////////////
// //
// Seek ISR functions //
//////////////////////////////////////////////////////////////////
/* Seek done process function.
* @param None
* @return None
*/
static void mpeg4_dec_seek_done_process(void)
{
ASSERT(g_video_dec_info_ptr->video_dec_callback != NULL);
g_video_dec_info_ptr->dec_state = VIDEO_DEC_STATE_UNKOWN;
// ??
//g_video_dec_info_ptr->video_end = KAL_FALSE;
#if defined(__VIDEO_EDITOR__)
if (g_video_dec_status.scenario == VIDEO_SCENARIO_EDITOR)
{
g_video_dec_info_ptr->video_dec_callback(VIDEO_EDITOR_DEC_EVENT_SEEK_DONE);
}
else
#endif /*__VIDEO_EDITOR__*/
{
g_video_dec_info_ptr->video_dec_callback(VIDEO_DEC_EVENT_SEEK_DONE);
}
if ((g_video_dec_info_ptr->seek_frame_number == g_video_dec_info_ptr->total_frames_in_file) || (g_video_dec_info_ptr->seek_frame_number == g_video_dec_info_ptr->stop_frame_no))
{
#if defined(__VIDEO_EDITOR__)
if (g_video_dec_status.scenario == VIDEO_SCENARIO_EDITOR)
{
ASSERT(0);
}
else
#endif /*__VIDEO_EDITOR__*/
{
video_dec_complete();
}
}
}
/* Seek HISR function. Check whether seek done or not in this function.
* @param None
* @return None
*/
void mpeg4_dec_seek_HISR(void)
{
if (g_video_dec_info_ptr->isr_error_event_happen == KAL_TRUE)
{
VIDEO_ASSERT(0);
//g_video_dec_info_ptr->isr_error_event_happen = KAL_FALSE;
mpeg4_dec_isr_error_report_hdlr();
//video_dec_disable_irq();
// Rey's A2V
//video_dec_stop_av();
return;
}
if (g_video_dec_info_ptr->dec_frames_no == g_video_dec_info_ptr->seek_frame_number)
{
/* Seek done */
#if defined(__VIDEO_EDITOR__)
if (VIDEO_EDITOR_DATA.veditor_state == VIEDO_EDITOR_STATE_START)
{
VIDEO_EDITOR_DEC_DONE_HISR();
}
else
#endif /*__VIDEO_EDITOR__*/
{
mpeg4_dec_seek_done_process();
}
}
else
{
#if defined(__VIDEO_EDITOR__)
if (g_video_dec_status.scenario == VIDEO_SCENARIO_EDITOR)
{
g_video_dec_info_ptr->video_dec_callback(VIDEO_EDITOR_DEC_DRV_SEEK_ACTION);
}
else
#endif /*__VIDEO_EDITOR__*/
{
g_video_dec_info_ptr->video_dec_callback(VIDEO_DEC_DRV_SEEK_ACTION);
}
}
}
/* Seek LISR process function. Check exception(ex. re-entry). Check decode status.
* @param None.
* @return None
*/
void mpeg4_dec_seek_lisr_process(kal_uint32 status)
{
#if ( defined(MT6219) || defined(MT6226) || defined(MT6227) || defined(MT6226M) )
IRQMask(IRQ_MPEG4_CODE);
#else /* !(MT6219, MT6226, MT6227, MT6226M) */
IRQMask(IRQ_MPEG4_DEC_CODE);
#endif /* (MT6219, MT6226, MT6227, MT6226M) */
if (g_video_dec_info_ptr->dec_state != VIDEO_DEC_STATE_SEEK)
{
return;
}
if ( g_video_dec_isr_param.b_check_reentry != KAL_FALSE)
{
VIDEO_ASSERT(0);
g_video_dec_info_ptr->isr_error_event_happen = KAL_TRUE;
g_video_dec_status.VIDEO_STATUS = VIDEO_DEC_FATAL_ERROR;
visual_active_hisr(VISUAL_MP4_SEEK_HISR_ID);
g_video_dec_isr_param.b_check_reentry = KAL_FALSE;
return;
}
g_video_dec_isr_param.b_check_reentry = KAL_TRUE;
video_dbg_trace(MP4_DEC_SEEK_LISR_START, video_get_current_time());
#if ( defined(MT6219) || defined(MT6226) || defined(MT6227) || defined(MT6226M) )
if (status & MP4_IRQ_STS_DEC)
{
DRV_WriteReg32(MP4_IRQ_ACK, MP4_IRQ_STS_DEC);
DRV_WriteReg32(MP4_VLC_COMD, MP4_VLC_COMD_STOP);
#ifdef VIDEO_DEC_YUV_MODE
if (g_video_dec_info_ptr->path_type == VIDEO_DEC_IMG_PATH_HW)
video_dec_display();
#endif /*VIDEO_DEC_YUV_MODE*/
}
else
{
mpeg4_dec_reset();
DRV_WriteReg32(MP4_IRQ_ACK, status);
VIDEO_ASSERT(0);
video_dbg_trace(MP4_MAY_ISR_ERROR, video_get_current_time());
}
#else /* !(MT6219, MT6226, MT6227, MT6226M) */
if (status & MP4_DEC_IRQ_STS_DEC)
{
DRV_WriteReg32(MP4_DEC_IRQ_ACK, MP4_DEC_IRQ_STS_DEC);
DRV_WriteReg32(MP4_VLC_DMA_COMD, MP4_VLC_DMA_COMD_STOP);
#ifdef VIDEO_DEC_YUV_MODE
if (g_video_dec_info_ptr->path_type == VIDEO_DEC_IMG_PATH_HW)
video_dec_display();
#endif /*VIDEO_DEC_YUV_MODE*/
}
else if (status & MP4_DEC_IRQ_STS_DMA)
{
if (g_video_dec_isr_param.check_vlc_addr == KAL_TRUE)
{
VIDEO_ASSERT(0);
DRV_WriteReg32(MP4_CORE_VLC_LIMIT, 0xffff);
DRV_WriteReg32(MP4_CORE_VLC_ADDR, (g_video_dec_isr_param.vlc_addr + 0xffff));
g_video_dec_isr_param.vlc_addr = (g_video_dec_isr_param.vlc_addr + 0xffff);
DRV_WriteReg32(MP4_VLC_DMA_COMD, MP4_VLC_DMA_COMD_RELOAD);
g_video_dec_isr_param.b_check_reentry = KAL_FALSE;
return;
}
else
{
ASSERT(0);
}
}
else
{
mpeg4_dec_reset();
mpeg4_core_reset();
DRV_WriteReg32(MP4_DEC_IRQ_ACK, status);
VIDEO_ASSERT(0);
video_dbg_trace(MP4_MAY_ISR_ERROR, video_get_current_time());
}
#endif /* (MT6219, MT6226, MT6227, MT6226M) */
g_video_dec_info_ptr->dec_frames_no++;
/* Rita */
if (g_video_dec_info_ptr->dec_frames_no == g_video_dec_info_ptr->seek_frame_number)
{
video_dbg_trace(MP4_DEC_SEEK_HISR_DONE, video_get_current_time());
}
visual_active_hisr(VISUAL_MP4_SEEK_HISR_ID);
g_video_dec_isr_param.b_check_reentry = KAL_FALSE;
video_dbg_trace(MP4_DEC_SEEK_LISR_END, video_get_current_time());
#if ( defined(MT6219) || defined(MT6226) || defined(MT6227) || defined(MT6226M) )
IRQUnmask(IRQ_MPEG4_CODE);
#else /*!(MT6219, MT6226, MT6227, MT6226M)*/
IRQUnmask(IRQ_MPEG4_DEC_CODE);
#endif /*(MT6219, MT6226, MT6227, MT6226M)*/
}
/* Seek LISR function.
* @param None.
* @return None
*/
static void mpeg4_dec_seek_LISR(void)
{
kal_uint32 status;
#ifdef __VIDEO_EDITOR__
if ((g_video_dec_status.scenario == VIDEO_SCENARIO_EDITOR) && (VIDEO_EDITOR_DATA.veditor_state == VIEDO_EDITOR_STATE_START))
{
//MPEG4_EDITOR_LISR(); //Not here, we should enable image data path, and run it at image data path isr.
EXT_ASSERT(0, 0, 0, 0);
}
#endif /*__VIDEO_EDITOR__*/
#if ( defined(MT6219) || defined(MT6226) || defined(MT6227) || defined(MT6226M) )
status = DRV_Reg32(MP4_IRQ_STS);
#else /* !(MT6219, MT6226, MT6227, MT6226M) */
status = DRV_Reg32(MP4_DEC_IRQ_STS);
#endif /* (MT6219, MT6226, MT6227, MT6226M) */
mpeg4_dec_seek_lisr_process(status);
}
/* Init and set seek LISR and HISR functions
* @param None.
* @return None
*/
void video_set_seek_isr(void)
{
kal_uint32 savedMask;
savedMask = SaveAndSetIRQMask();
mpeg4_dec_init_isr_param();
g_video_dec_info_ptr->dec_state = VIDEO_DEC_STATE_SEEK;
VISUAL_Register_HISR(VISUAL_MP4_SEEK_HISR_ID, mpeg4_dec_seek_HISR);
#if ( defined(MT6219) || defined(MT6226) || defined(MT6227) || defined(MT6226M) )
IRQ_Register_LISR(IRQ_MPEG4_CODE, mpeg4_dec_seek_LISR, "MPEG4Seek");
IRQSensitivity(IRQ_MPEG4_CODE, LEVEL_SENSITIVE);
IRQUnmask(IRQ_MPEG4_CODE);
#else /*!(MT6219, MT6226, MT6227, MT6226M)*/
IRQ_Register_LISR(IRQ_MPEG4_DEC_CODE, mpeg4_dec_seek_LISR, "MPEG4Seek");
IRQSensitivity(IRQ_MPEG4_DEC_CODE, LEVEL_SENSITIVE);
IRQUnmask(IRQ_MPEG4_DEC_CODE);
#endif /*(MT6219, MT6226, MT6227, MT6226M)*/
RestoreIRQMask(savedMask);
}
/* Init and set decode LISR and HISR functions
* @param None.
* @return None
*/
void video_set_dec_isr(void)
{
kal_uint32 savedMask;
savedMask = SaveAndSetIRQMask();
mpeg4_dec_init_isr_param();
g_video_dec_info_ptr->dec_state = VIDEO_DEC_STATE_NORMAL;
VISUAL_Register_HISR(VISUAL_MPEG4_DEC_HISR_ID, mpeg4_dec_HISR);
video_dec_set_enable_av_callback(mpeg4_dec_LISR);
RestoreIRQMask(savedMask);
}
/* Disable decode interrupt
* @param None.
* @return None
*/
void video_dec_disable_irq(void)
{
kal_uint32 savedMask;
savedMask = SaveAndSetIRQMask();
#if ( defined(MT6219) || defined(MT6226) || defined(MT6227) || defined(MT6226M) )
IRQMask(IRQ_MPEG4_CODE);
#else /*!(MT6219, MT6226, MT6227, MT6226M)*/
IRQMask(IRQ_MPEG4_DEC_CODE);
#endif /*(MT6219, MT6226, MT6227, MT6226M)*/
//video_dec_stop_av();
video_dec_set_av_callback(NULL);
if(g_video_dec_isr_param.gpt_exception_protect_handle!=0)
GPTI_StopItem(g_video_dec_isr_param.gpt_exception_protect_handle);
RestoreIRQMask(savedMask);
}
#else /*MP4_CODEC*/
#include "drv_comm.h"
#endif /*MP4_CODEC*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -