⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 video_dec_isr.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 3 页
字号:

    {
        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 + -