📄 mv_dec.c
字号:
MV_DEC_PIP_MODE in_pip_mode
)
/*EMP=======================================================================*/
{
UInt32 lv_protection_level;
tmosalDisableInterruptsNoSysCall(&lv_protection_level);
if(in_pip_mode == MV_DEC_PIP_MODE_ENABLED)
{
GV_MV_DEC_status.dec_pip_enabled = TRUE;
MV_drv_set_video_int_clear(MV_VIDEO_EVENT_SEQUENCE_HEADER_START_CODE);
MV_drv_set_video_event_enable(MV_drv_video_event_enable() | MV_VIDEO_EVENT_SEQUENCE_HEADER_START_CODE);
}
else
{
GV_MV_DEC_status.dec_pip_enabled = FALSE;
}
tmosalEnableInterruptsNoSysCall(lv_protection_level);
} /* End of MV_DEC_set_pip_mode */
/*MPF=======================================================================*/
/*
FUNCTION NAME: MV_DEC_set_low_delay_mode
PACKAGE: MV_DEC
SCOPE: PLATFORM
DESCRIPTION:
Prepare decoding of a still picture in low delay mode, which mean that
each time a picture is decoded (in 2 or more Vs) each time it is
displayed.
PRECONDITIONS:
None
POSTCONDITIONS:
None
CALLING SEQUENCE:
*/
extern void
MV_DEC_set_low_delay_mode(
MV_DEC_LOW_DELAY_MODE in_low_delay_mode
)
/*EMP=======================================================================*/
{
UInt32 lv_protection_level;
tmosalDisableInterruptsNoSysCall(&lv_protection_level);
if(in_low_delay_mode == MV_DEC_LOW_DELAY_MODE_ENABLED)
{
GV_MV_DEC_status.dec_low_delay_forced_by_application = TRUE;
}
else
{
GV_MV_DEC_status.dec_low_delay_forced_by_application = FALSE;
}
tmosalEnableInterruptsNoSysCall(lv_protection_level);
} /* End of MV_DEC_set_pip_mode */
/*MPF=======================================================================*/
/*
FUNCTION NAME: MV_DEC_soft_reset
PACKAGE: MV_DEC
SCOPE: PLATFORM
DESCRIPTION:
Performs a software reset of the video decoder core.
PRECONDITIONS:
None
POSTCONDITIONS:
None
CALLING SEQUENCE:
*/
extern void
MV_DEC_soft_reset(
void
)
/*EMP=======================================================================*/
{
MV_ITV_enable_irpt(MV_ITV_RESET_DONE);
MV_FBM_soft_reset();
} /* End of MV_DEC_soft_reset */
/*MPF=======================================================================*/
/*
FUNCTION NAME: MV_DEC_abort_decoding_by_user
PACKAGE: MV_DEC
SCOPE: PLATFORM
DESCRIPTION:
Allows application to abort decoding.
PRECONDITIONS:
None
POSTCONDITIONS:
None
CALLING SEQUENCE:
*/
extern void
MV_DEC_abort_decoding_by_user(
void
)
/*EMP=======================================================================*/
{
MV_FBM_api_abort_decoding();
} /* End of MV_DEC_abort_decoding_by_user */
/*MPF=======================================================================*/
/*
FUNCTION NAME: MV_DEC_get_dec_delay
PACKAGE: MV_DEC
SCOPE: PLATFORM
DESCRIPTION:
Give the MPEG video decoder latency.
It gives the difference between the real PTS and the theorical PTS of
a picture.
This difference is given in unit of ticks (at 90000Hz)
ou_dec_delay_ptr = real PTS - theorical PTS
Drivers notify MV_DEC_PTS_DELAY_AVAILABLE_EVENT to application when
delay information is available.
NOTES:
MV_DEC_get_dec_delay() can be call in an ISR.
PRECONDITIONS:
Before calling this routine, application must enable notification of
MV_DEC_PTS_DELAY_AVAILABLE_EVENT via
MV_DEC_enable_notification(MV_DEC_PTS_DELAY_AVAILABLE_EVENT) routine.
POSTCONDITIONS:
None
CALLING SEQUENCE:
*/
extern void
MV_DEC_get_dec_delay(
MV_DEC_STC *ou_dec_delay_ptr
)
/*EMP=======================================================================*/
{
*ou_dec_delay_ptr = GV_MV_DEC_status.dec_pts_delay;
} /* End of MV_DEC_get_dec_delay */
/*==========================================================================*/
/* L O C A L F U N C T I O N S */
/*==========================================================================*/
/*LPF=======================================================================*/
/*
FUNCTION NAME: LF_VIDEO_EVENT_handler
DESCRIPTION:
NOTES:
CALLING SEQUENCE:
*/
static void
LF_VIDEO_EVENT_handler(
void
)
/*EMP=======================================================================*/
{
UInt32 lv_protection_level;
unsigned long lv_video_event;
#ifdef DV_DEBUG
unsigned long lv_info1 = 0;
unsigned long lv_info2 = 0;
unsigned long lv_info3 = 0;
#endif
DV_DBG_STORE_EVENT(IPVD_DBG_EV_ISR, IPVD_DBG_ISR_BEGIN_LEVEL,IPVD_VIDEO_EVENT_ISR, lv_info1, lv_info2, lv_info3);
lv_video_event = GV_itv_video_event;
#ifdef DV_DEBUG
lv_info1 = MV_drv_video_event_enable();
#endif
DV_DBG_STORE_EVENT(IPVD_DBG_EV_VIDEO_EVENT, IPVD_DBG_MAJOR_BEHAVIOR_LEVEL,lv_video_event,lv_info1,0,0);
/* mechanism to avoid to loose GOP_SC event which is used in EOPH ISR */
tmosalDisableInterruptsNoSysCall(&lv_protection_level);
if ((lv_video_event & MV_DEC_VIDEO_EVENT_GOP_SC) != 0)
{
GV_MV_DEC_status.dec_gop_sc_found = TRUE;
}
if ( (lv_video_event & MV_DEC_VIDEO_EVENT_PES_H_SC1) != 0 )
{
/* flag to prevent user data parser that a PES header 1 has been found start code */
GV_MV_DEC_status.dec_pes_sc1_found = TRUE;
}
if ( (lv_video_event & MV_DEC_VIDEO_EVENT_PES_H_SC2) != 0 )
{
/* flag to prevent user data parser that a PES header 1 has been found start code */
GV_MV_DEC_status.dec_pes_sc2_found = TRUE;
}
if((GV_MV_DEC_ud_status.dec_ud_parsing_done == TRUE) && (GV_MV_DEC_ud_status.dec_ud_request != 0))
{
/* look what start code is in video_event */
if (((lv_video_event & MV_DEC_VIDEO_EVENT_GOP_SC) != 0) && (GV_MV_DEC_ud_status.dec_ud_request & MV_DEC_SEQ_UD))
{
/* flag to prevent user data parser to parse sequence user data up to
next gop start code or up to next picture start code */
GV_MV_DEC_ud_status.dec_gop_sc_found = TRUE;
}
if ( (lv_video_event & MV_DEC_VIDEO_EVENT_PES_H_SC1) != 0 )
{
/* flag to prevent user data parser that a PES header 1 has been found start code */
GV_MV_DEC_ud_status.dec_pes_sc1_found = TRUE;
}
if ( (lv_video_event & MV_DEC_VIDEO_EVENT_PES_H_SC2) != 0 )
{
/* flag to prevent user data parser that a PES header 1 has been found start code */
GV_MV_DEC_ud_status.dec_pes_sc2_found = TRUE;
}
if (((lv_video_event & MV_DEC_VIDEO_EVENT_SEQ_UD_SC) != 0) && (GV_MV_DEC_ud_status.dec_ud_request & MV_DEC_SEQ_UD))
{
/* Add UD type found */
GV_MV_DEC_ud_status.dec_ud_found |= MV_DEC_SEQ_UD;
}
if (((lv_video_event & MV_DEC_VIDEO_EVENT_GOP_UD_SC) != 0) && (GV_MV_DEC_ud_status.dec_ud_request & MV_DEC_GOP_UD))
{
/* Add UD type found */
GV_MV_DEC_ud_status.dec_ud_found |= MV_DEC_GOP_UD;
}
if (((lv_video_event & MV_DEC_VIDEO_EVENT_PICT_UD_SC) != 0) && (GV_MV_DEC_ud_status.dec_ud_request & MV_DEC_PICT_UD))
{
/* Add UD type found */
GV_MV_DEC_ud_status.dec_ud_found |= MV_DEC_PICT_UD;
}
}
tmosalEnableInterruptsNoSysCall(lv_protection_level);
if(lv_video_event & MV_VIDEO_EVENT_SEQUENCE_HEADER_START_CODE)
{
/* a new sequence has been found,
update sequence informations fields in GV_MV_DEC_status */
GV_MV_DEC_status.dec_seq_info.seq_width = MV_drv_seq_hor_size();
GV_MV_DEC_status.dec_seq_info.seq_height =MV_drv_seq_ver_size();
GV_MV_DEC_status.dec_seq_info.aspect_ratio = MV_drv_aspect_ratio();
GV_MV_DEC_status.dec_seq_info.frame_rate = MV_drv_frame_rate();
/* Notify to application MV_DEC_NEW_SEQ_FOUND_EVENT
this event is used to aware application that it can call
MV_DEC_get_seq_info() */
if (GV_MV_DEC_status.dec_event_enabled & MV_DEC_NEW_SEQ_FOUND_EVENT)
{
/* Notify the application. */
GV_MV_DEC_status.function_ptr(MV_DEC_NEW_SEQ_FOUND_EVENT);
}
/* PR903 : 50Hz decoding -> 60 TV : update automatically setup_buffer_number */
/* in case of zapping for exemple */
/* tv_standard = MV_DEC_STANDARD_60HZ */
if(GV_MV_DEC_config_status.dec_bufcfg.tv_standard == MV_DEC_STANDARD_60HZ)
{
if((GV_MV_DEC_status.dec_seq_info.frame_rate == MV_DEC_FRAME_RATE_25) ||
(GV_MV_DEC_status.dec_seq_info.frame_rate == MV_DEC_FRAME_RATE_50))
{
if(GV_MV_DEC_config_status.dec_bufcfg.fs_memory_mapping == MV_DEC_FS_MAPPING_2_6)
{
MV_drv_set_setup_buffer_number(MV_DEC_SETUP_BUFFER_NUMBER_50HZ_2_6FS);
}
else
{
MV_drv_set_setup_buffer_number(MV_DEC_SETUP_BUFFER_NUMBER_50HZ_3_0FS);
}
}
else
{
MV_drv_set_setup_buffer_number(MV_DEC_SETUP_BUFFER_NUMBER_60HZ);
}
}
else
/* tv_standard = MV_DEC_STANDARD_50HZ */
{
if((GV_MV_DEC_status.dec_seq_info.frame_rate == MV_DEC_FRAME_RATE_25) ||
(GV_MV_DEC_status.dec_seq_info.frame_rate == MV_DEC_FRAME_RATE_50))
{
if(GV_MV_DEC_config_status.dec_bufcfg.fs_memory_mapping == MV_DEC_FS_MAPPING_2_6)
{
MV_drv_set_setup_buffer_number(MV_DEC_SETUP_BUFFER_NUMBER_50HZ_2_6FS);
}
else
{
MV_drv_set_setup_buffer_number(MV_DEC_SETUP_BUFFER_NUMBER_50HZ_3_0FS);
}
}
/* else not implement, that is to say don't handle 60 -> 50Hz conversion */
}
/* Used in case of PIP mode enabled */
if (GV_MV_DEC_status.dec_pip_enabled == TRUE)
{
GV_MV_DEC_status.dec_shc_found = TRUE;
}
/* New seq header found, a immediately following P picture type could
be decoded according to GI standard */
tmosalDisableInterruptsNoSysCall(&lv_protection_level);
GV_MV_DEC_status.dec_new_shc_decode_GI_P_possible = TRUE;
tmosalEnableInterruptsNoSysCall(lv_protection_level);
}
DV_DBG_STORE_EVENT(IPVD_DBG_EV_ISR, IPVD_DBG_ISR_END_LEVEL,IPVD_VIDEO_EVENT_ISR, 0, 0, 0);
} /* End of LF_VIDEO_EVENT_handler */
/*LPF=======================================================================*/
/*
FUNCTION NAME: LF_RESET_DONE_handler
DESCRIPTION:
NOTES:
CALLING SEQUENCE:
*/
static void
LF_RESET_DONE_handler(
void
)
/*EMP=======================================================================*/
{
DV_DBG_STORE_EVENT(IPVD_DBG_EV_ISR, IPVD_DBG_ISR_BEGIN_LEVEL,IPVD_RESET_DONE_ISR, 0, 0, 0);
DV_DBG_STORE_EVENT(IPVD_DBG_EV_RESET_DONE,IPVD_DBG_MAJOR_BEHAVIOR_LEVEL,0,0,0,0);
GV_Delta_VIDEO_DTS_PTS = 0;//JI
if (GV_MV_DEC_status.dec_event_enabled & MV_DEC_RESET_DONE_EVENT)
{
/* Notify the application. */
GV_MV_DEC_status.function_ptr(MV_DEC_RESET_DONE_EVENT);
}
MV_drv_set_video_int_clear((1<<MV_ITV_VIDEO_FIFO_OVER)
||(1<<MV_ITV_VIDEO_FIFO_UNDER)
||(1<<MV_ITV_VIDEO_FIFO_FULL)
||(1<<MV_ITV_VIDEO_FIFO_EMPTY)
);
/* PR530 : only notify HW reset when API is called, not in case of internal HW
reset due to hangup */
MV_ITV_isr_disable_irpt(MV_ITV_RESET_DONE);
DV_DBG_STORE_EVENT(IPVD_DBG_EV_ISR, IPVD_DBG_ISR_END_LEVEL,IPVD_RESET_DONE_ISR, 0, 0, 0);
} /* End of LF_RESET_DONE_handler */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -