📄 video_dec_isr.c
字号:
/*****************************************************************************
* Copyright Statement:
* --------------------
* This software is protected by Copyright and the information contained
* herein is confidential. The software may not be copied and the information
* contained herein may not be used or disclosed except with the written
* permission of MediaTek Inc. (C) 2005
*
* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
*
* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/
/*****************************************************************************
*
* Filename:
* ---------
* video_dec_isr.c
*
* Project:
* --------
* MT6218B and MT6219
*
* Description:
* ------------
* This file defines the isr handler when mpeg4 decode.
*
* Author:
* -------
* -------
*
*============================================================================
* HISTORY
* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*------------------------------------------------------------------------------
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
****************************************************************************/
#ifdef MP4_CODEC
#include "drv_comm.h"
#include "med_status.h"
#include "visual_comm.h"
#include "fsal.h"
#include "mp4_parser.h"
#include "l1audio.h"
#include "lcd_if.h"
#include "rtc_sw.h"
#include "video_file_creator.h"
#include "bmd.h"
#include "video_enc_glb.h"
#include "video_dec_glb.h"
#include "video_glb.h"
#include "stack_common.h"
#include "syscomp_config.h" /*MOD_BMT*/
#include "stack_msgs.h"
#include "app_ltlcom.h" /* Task message communiction */
#include "stacklib.h" /* Basic type for dll, evshed, stacktimer */
#include "event_shed.h" /* Event scheduler */
#include "stack_timer.h" /*Timer*/
#include "app_buff_alloc.h" /*buffer*/
#include "task_config.h" /* Task creation */
#include "stack_ltlcom.h" /*msg_send_ext_queue.....definitions*/
#include "video_hw.h"
#include "intrCtrl.h"
#include "visualhisr.h"
#include "gpt_sw.h"
static void mpeg4_dec_init_isr_param(void);
static void mpeg4_av_error_hdlr(void);
static void mpeg4_dec_isr_error_report_hdlr(void);
static void mpeg4_exception_handler(void * parameter);
static void mpeg4_dec_set_error_recover_process(void);
static void mpeg4_dec_HISR(void);
static void mpeg4_dec_lisr_process(void);
static void mpeg4_dec_recover_LISR(void);
static void mpeg4_dec_LISR(void);
static void mpeg4_dec_seek_done_process(void);
static void mpeg4_dec_seek_LISR(void);
static VIDEO_DEC_ISR_PARAM g_video_dec_isr_param;
///////////////////////////////////////////////////////////////////
// //
// Parameter setting functions //
//////////////////////////////////////////////////////////////////
/* Init ISR self parameter
* @param None
* @return None
*/
static void mpeg4_dec_init_isr_param(void)
{
if (g_video_dec_isr_param.gpt_exception_protect_handle == 0)
GPTI_GetHandle(&g_video_dec_isr_param.gpt_exception_protect_handle);
g_video_dec_isr_param.b_check_reentry = KAL_FALSE;
g_video_dec_isr_param.b_check_exception = KAL_FALSE;
g_video_dec_isr_param.b_check_av_error = KAL_FALSE;
g_video_dec_isr_param.check_vlc_addr = KAL_FALSE;
g_video_dec_isr_param.speed_recover_count = 0;
g_video_dec_isr_param.vlc_addr = 0;
}
/* Set VLC check parameters.
* Set this before decode, and ISR check this parameter to see whether the VLC interrupt is legal or not.
* @param b_check. Check VLC or not.
* @param addr. Decode atsrt addr.
* @return None
*/
void mpeg4_dec_set_isr_vlc_param(kal_bool b_check, kal_uint32 addr)
{
g_video_dec_isr_param.check_vlc_addr = b_check;
g_video_dec_isr_param.vlc_addr = addr;
}
///////////////////////////////////////////////////////////////////
// //
// Error handler functions //
//////////////////////////////////////////////////////////////////
/* AV error hander function. Used when miss AV sync.
* @param None
* @return None
*/
static void mpeg4_av_error_hdlr(void)
{
g_video_dec_isr_param.b_check_av_error = KAL_TRUE;
VIDEO_ASSERT(0);
}
/* Report the error status from ISR to MED task
* @param None
* @return None
*/
static void mpeg4_dec_isr_error_report_hdlr(void)
{
video_dec_disable_irq();
//video_dec_stop_av();
ASSERT(g_video_dec_info_ptr->video_dec_callback != NULL);
#if defined(__VIDEO_EDITOR__)
if (g_video_dec_status.scenario == VIDEO_SCENARIO_EDITOR)
{
g_video_dec_info_ptr->video_dec_callback(VIDEO_EDITOR_EVENT_FAIL);
}
else
#endif /*__VIDEO_EDITOR__*/
{
g_video_dec_info_ptr->video_dec_callback(VIDEO_DEC_EVENT_FAIL);
}
if (g_video_dec_info_ptr->dec_state == VIDEO_DEC_STATE_NORMAL)
{
video_dec_start_refresh();
}
}
/* Decode can not longer than N ms, thif function is the handler when it exceeds the time limit
* @param None
* @return None
*/
static void mpeg4_exception_handler(void * parameter)
{
kal_uint32 savedMask;
/* race condition protect*/
savedMask = SaveAndSetIRQMask();
if (g_video_dec_isr_param.b_check_exception == KAL_FALSE)
{
/* mp4 or AV intr has process done before this exception handler*/
RestoreIRQMask(savedMask);
return;
}
/* mp4 or AV intr not done before this exception handler*/
mpeg4_dec_set_error_recover_process();
//video_dec_stop_av();
video_dec_set_av_callback(NULL);
RestoreIRQMask(savedMask);
VIDEO_ASSERT(0);
/*Auto pause/resume, Jensen*/
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;
#if defined(__VIDEO_EDITOR__)
if (g_video_dec_status.scenario == VIDEO_SCENARIO_EDITOR)
{
ASSERT(0);
}
else
#endif /*__VIDEO_EDITOR__*/
{
video_dec_cancel_put_buffer();
g_video_dec_info_ptr->video_dec_callback(VIDEO_DEC_RECOVER);
}
g_video_dec_isr_param.b_check_exception = KAL_FALSE;
video_dec_start_refresh();
}
///////////////////////////////////////////////////////////////////
// //
// Decode ISR functions //
//////////////////////////////////////////////////////////////////
/* In the error recover duration. Mask mp4 interrupt and set AV interrupt to error handler
* @param None
* @return None
*/
static void mpeg4_dec_set_error_recover_process(void)
{
/*Redirect DSP ISR*/
video_dec_set_av_callback(mpeg4_av_error_hdlr);
/*Disable GPT ISR*/
GPTI_StopItem(g_video_dec_isr_param.gpt_exception_protect_handle);
/*Disable Mpeg4 ISR*/
#if ( defined(MT6219) || defined(MT6226) || defined(MT6227) || defined(MT6226M) )
IRQMask(IRQ_MPEG4_CODE);
#else /*MT6228, MT6229, MT6230*/
IRQMask(IRQ_MPEG4_DEC_CODE);
#endif /*MT6228, MT6229, MT6230*/
}
/* Decode HISR function. Parse the next frame.
* @param None
* @return None
*/
static void mpeg4_dec_HISR(void)
{
kal_uint32 frame_length;
kal_uint32 prev_frame_duration;
kal_uint8 *frame_addr;
MEDIA_STATUS_CODE result;
if (g_video_dec_info_ptr->isr_error_event_happen == KAL_TRUE)
{
/* This error may happens when lisr re-entry happens*/
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->recover_start == KAL_TRUE)
{
#if defined(__VIDEO_EDITOR__)
if (g_video_dec_status.scenario == VIDEO_SCENARIO_EDITOR)
{
ASSERT(0);
}
else
#endif /*__VIDEO_EDITOR__*/
{
/* reset skip frame as 0 */
g_video_dec_info_ptr->skip_frames = 0;
video_dec_cancel_put_buffer();
g_video_dec_info_ptr->video_dec_callback(VIDEO_DEC_RECOVER);
}
return;
}
if (g_video_dec_info_ptr->dec_frames_no == g_video_dec_info_ptr->total_frames_in_file)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -