📄 mv_dec.c
字号:
GV_MV_DEC_status = GV_MV_DEC_status_init;
GV_MV_DEC_ud_status = GV_MV_DEC_ud_status_init;
/* restore address and size of UD buffer */
GV_MV_DEC_status.dec_pip_buf_addr = lv_seq_adr;
GV_MV_DEC_status.dec_pip_buf_size = lv_seq_buf_size;
GV_MV_DEC_ud_status.dec_ud_adr = lv_ud_adr;
GV_MV_DEC_ud_status.dec_ud_buffer_size = lv_ud_buf_size;
GV_MV_DEC_ud_status.ptr_sync_semaphore = lv_new_semaphore;
GV_MV_DEC_status.dec_watchdog_vs_nb_threshold = GV_MV_DEC_config_status.dec_bufcfg.threshold_error_param;
GV_MV_DEC_status.dec_video_event_mask |= (MV_VIDEO_EVENT_SEQUENCE_HEADER_START_CODE | MV_DEC_VIDEO_EVENT_GOP_SC);
tmosalDisableInterruptsNoSysCall(&lv_protection_level);
GV_MV_DEC_status.dec_state = MV_DEC_DECODING_STATE_READY;
tmosalEnableInterruptsNoSysCall(lv_protection_level);
} /* End of MV_DEC_set_defaults */
/*MPF=======================================================================*/
/*
FUNCTION NAME: MV_DEC_term
PACKAGE: DEC
SCOPE: PLATEFORM
DESCRIPTION:
Deinitialise the video decoding package.
Frees all resources allocated by MV_DEC_init call.
PRECONDITIONS:
None
POSTCONDITIONS:
After calling to this API, only MV_DEC_bufuse() and MV_IDEC_init()
can be called.
Video Decoder is in state MV_DEC_DECODING_STATE_IDLE
CALLING SEQUENCE:
*/
extern void
MV_DEC_term(
void
)
/*EMP=======================================================================*/
{
UInt32 lv_protection_level;
tmErrorCode_t returnVal;
MV_FBM_release_resources();
tmosalDisableInterruptsNoSysCall(&lv_protection_level);
GV_MV_DEC_status.dec_state = MV_DEC_DECODING_STATE_IDLE;
tmosalEnableInterruptsNoSysCall(lv_protection_level);
/* Deinstall VIDEO_EVENT_handler */
MV_ITV_deinstall_isr(MV_ITV_VIDEO_EVENT);
/* Deinstall RESET_DONE_handler */
MV_ITV_deinstall_isr(MV_ITV_RESET_DONE);
/* Delete the synchronisation semaphore */
returnVal = tmosalSemDestroy(GV_MV_DEC_ud_status.ptr_sync_semaphore);
if (returnVal != TM_OK)
{
DV_DBG_STORE_EVENT(IPVD_DBG_EV_UD_SEMAPHORE_ERROR,IPVD_DBG_UD_LEVEL,IPVD_SEMAPHORE_DESTROY,0,0,0);
}
MV_ITV_term();
} /* End of MV_DEC_term */
/*MPF=======================================================================*/
/*
FUNCTION NAME: MV_DEC_set_sync_mode
PACKAGE: MV_DEC
SCOPE: PLATFORM
DESCRIPTION:
Select the video decoder synchronisation mode.
4 different synchronisation mode can be choosen :
MV_DEC_SYNC_MODE_DTS_LOCKED
- Decoding of each picture is done when the corresponding DTS value
matches the STC value.
MV_DEC_SYNC_MODE_DTS_FREE_RUNNING
- Decoding of the first picture is done when the corresponding DTS
value matches the STC value. Consecutive pictures are decoded
without further checks.
MV_DEC_SYNC_MODE_BUF_CONTROLLED
- In the buffer controlled play mode, decoding of pictures is started
when the video input buffer fullness reaches the video input buffer
overflow warning level.
The video input buffer overflow and underflow levels can
be configured using MV_INP_set_warning_levels() API.
MV_DEC_SYNC_MODE_SW_CONTROLLED
- In the software controlled play mode, decoding of pictures is started
when the MV_DEC_play() API is called.
Initially the play sync is MV_DEC_SYNC_MODE_DTS_LOCKED.
Changing the video play mode takes effect the next time MV_DEC_play is
called if it's the first time or if video decoder is stopped,
otherwise if MV_DEC_play has been already called (video decoder is still
running) synchronisation mode will be changed on the fly.
PRECONDITIONS:
None
POSTCONDITIONS:
None
CALLING SEQUENCE:
*/
extern void
MV_DEC_set_sync_mode(
MV_DEC_SYNC_MODE in_sync_mode /* In: New video sync mode */
)
/*EMP=======================================================================*/
{
#ifdef DV_DEBUG
register unsigned long lv_info0 = MV_drv_video_fifo_bfmo_cur();
register unsigned long lv_info1 = MV_drv_video_fifo_bfmu_cur();
register unsigned long lv_info2 = MV_drv_video_fifo_over();
register unsigned long lv_info3 = 0;
#endif
GV_MV_DEC_status.dec_sync_mode = in_sync_mode;
/* if video decoder is already started, allows possibility to change
synchronisation mode on the fly */
if ((GV_MV_DEC_status.dec_state == MV_DEC_DECODING_STATE_STARTING) ||(GV_MV_DEC_status.dec_state == MV_DEC_DECODING_STATE_STARTED))
{
if((GV_MV_DEC_status.dec_sync_mode == MV_DEC_SYNC_MODE_DTS_LOCKED) || (GV_MV_DEC_status.dec_sync_mode == MV_DEC_SYNC_MODE_DTS_FREE_RUNNING))
{
MV_drv_set_video_fifo_disable(MV_BIT_OFF);
MV_drv_set_video_synchronisation_mode(MV_VIDEO_BUF_CTRL_DTS_LOCKED);
MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_UNDER);
MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_OVER);
MV_ITV_enable_irpt(MV_ITV_NEW_VIDEO_DTS);
}
if(GV_MV_DEC_status.dec_sync_mode == MV_DEC_SYNC_MODE_BUF_CONTROLLED)
{
/* now enable VIDEO_FIFO_UNDER, VIDEO_FIFO_OVER irpts and disable
NEW_VIDEO_DTS irpts */
MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_UNDER);
MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_OVER);
MV_ITV_disable_irpt(MV_ITV_NEW_VIDEO_DTS);
}
if(GV_MV_DEC_status.dec_sync_mode == MV_DEC_SYNC_MODE_SW_CONTROLLED)
{
/* now enable VIDEO_FIFO_UNDER, VIDEO_FIFO_OVER irpts and disable
NEW_VIDEO_DTS irpts */
MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_UNDER);
MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_OVER);
MV_ITV_disable_irpt(MV_ITV_NEW_VIDEO_DTS);
MV_drv_set_video_fifo_disable(MV_BIT_OFF);
MV_drv_set_video_synchronisation_mode(MV_VIDEO_BUF_CTRL_START);
GV_cmd_buf_start = TRUE;
DV_DBG_STORE_EVENT(IPVD_DBG_EV_BUF_CMD_START, IPVD_DBG_MAJOR_BEHAVIOR_LEVEL,lv_info0,lv_info1,lv_info2,__LINE__);
if (GV_MV_INP_status.inp_event_enabled & MV_INP_BUFFER_CMD_START_EVENT != 0)
{
/* Notify the application. */
GV_MV_INP_status.function_ptr(MV_INP_BUFFER_CMD_START_EVENT);
}
}
}
} /* End of MV_DEC_set_sync_mode */
/*MPF=======================================================================*/
/*
FUNCTION NAME: MV_DEC_freeze
PACKAGE: MV_DEC
SCOPE: PLATFORM
DESCRIPTION:
Freeze on the next decoded picture.
Freeze modes can be :
- MV_DEC_FREEZE_MODE_B : The displays freezes on the next correctly
decoded B picture
- MV_DEC_FREEZE_MODE_IP : The displays freezes on the next correctly
decoded I or P picture
- MV_DEC_FREEZE_MODE_NONE : Freeze mode is desactivated
Normal decoding and display can be resumed by calling MV_DEC_play() API.
NOTES:
MV_DEC_freeze() can be call in an ISR.
PRECONDITIONS:
None
POSTCONDITIONS:
Video Decoder is in state MV_DEC_DECODING_STATE_FREEZING
CALLING SEQUENCE:
*/
extern void
MV_DEC_freeze(
MV_DEC_FREEZE_MODE in_freeze_mode /* In: The desired freeze mode */
)
/*EMP=======================================================================*/
{
UInt32 lv_protection_level;
if(in_freeze_mode == MV_DEC_FREEZE_MODE_B)
{
MV_FBM_freeze(MV_DEC_FREEZE_MODE_B);
}
if(in_freeze_mode == MV_DEC_FREEZE_MODE_IP)
{
MV_FBM_freeze(MV_DEC_FREEZE_MODE_IP);
}
if(in_freeze_mode == MV_DEC_FREEZE_MODE_NONE)
{
MV_FBM_freeze(MV_DEC_FREEZE_MODE_NONE);
}
tmosalDisableInterruptsNoSysCall(&lv_protection_level);
GV_MV_DEC_status.dec_state = MV_DEC_DECODING_STATE_FREEZING;
tmosalEnableInterruptsNoSysCall(lv_protection_level);
} /* End of MV_DEC_freeze */
/*MPF=======================================================================*/
/*
FUNCTION NAME: MV_DEC_play
PACKAGE: MV_DEC
SCOPE: PLATFORM
DESCRIPTION:
Launch the video decoding process.
PRECONDITIONS:
Before calling this API, application must have called
MV_DEC_set_sync_mode().
POSTCONDITIONS:
Video Decoder is in state MV_DEC_DECODING_STATE_STARTING. It will
change to MV_DEC_DECODING_STATE_STARTED once the first picture is
decoded
CALLING SEQUENCE:
*/
extern void
MV_DEC_play(
void
)
/*EMP=======================================================================*/
{
UInt32 lv_protection_level;
#ifdef DV_DEBUG
register unsigned long lv_info0 = MV_drv_video_fifo_bfmo_cur();
register unsigned long lv_info1 = MV_drv_video_fifo_bfmu_cur();
register unsigned long lv_info2 = MV_drv_video_fifo_over();
register unsigned long lv_info3 = 0;
#endif
MV_FBM_play();
tmosalDisableInterruptsNoSysCall(&lv_protection_level);
GV_MV_DEC_status.dec_state = MV_DEC_DECODING_STATE_STARTING;
tmosalEnableInterruptsNoSysCall(lv_protection_level);
if((GV_MV_DEC_status.dec_sync_mode == MV_DEC_SYNC_MODE_DTS_LOCKED) || (GV_MV_DEC_status.dec_sync_mode == MV_DEC_SYNC_MODE_DTS_FREE_RUNNING))
{
MV_drv_set_video_fifo_disable(MV_BIT_OFF);
MV_drv_set_video_synchronisation_mode(MV_VIDEO_BUF_CTRL_DTS_LOCKED);
MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_UNDER);
MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_OVER);
MV_ITV_enable_irpt(MV_ITV_NEW_VIDEO_DTS);
}
if(GV_MV_DEC_status.dec_sync_mode == MV_DEC_SYNC_MODE_BUF_CONTROLLED)
{
/* now enable VIDEO_FIFO_UNDER, VIDEO_FIFO_OVER irpts and disable
NEW_VIDEO_DTS irpts */
MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_UNDER);
MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_OVER);
MV_ITV_disable_irpt(MV_ITV_NEW_VIDEO_DTS);
}
if(GV_MV_DEC_status.dec_sync_mode == MV_DEC_SYNC_MODE_SW_CONTROLLED)
{
/* now enable VIDEO_FIFO_UNDER, VIDEO_FIFO_OVER irpts and disable
NEW_VIDEO_DTS irpts */
MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_UNDER);
MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_OVER);
MV_ITV_disable_irpt(MV_ITV_NEW_VIDEO_DTS);
MV_drv_set_video_fifo_disable(MV_BIT_OFF);
MV_drv_set_video_synchronisation_mode(MV_VIDEO_BUF_CTRL_START);
GV_cmd_buf_start = TRUE;
DV_DBG_STORE_EVENT(IPVD_DBG_EV_BUF_CMD_START, IPVD_DBG_MAJOR_BEHAVIOR_LEVEL,lv_info0,lv_info1,lv_info2,__LINE__);
if (GV_MV_INP_status.inp_event_enabled & MV_INP_BUFFER_CMD_START_EVENT != 0)
{
/* Notify the application. */
GV_MV_INP_status.function_ptr(MV_INP_BUFFER_CMD_START_EVENT);
}
}
} /* End of MV_DEC_play */
/*MPF=======================================================================*/
/*
FUNCTION NAME: MV_DEC_stop
PACKAGE: MV_DEC
SCOPE: PLATFORM
DESCRIPTION:
Freeze on the next decoded picture and stop decoding video data from
the video input buffer.
PRECONDITIONS:
None
POSTCONDITIONS:
Video Decoder is in state MV_DEC_DECODING_STATE_STOPPED.
CALLING SEQUENCE:
*/
extern void
MV_DEC_stop(
void
)
/*EMP=======================================================================*/
{
UInt32 lv_protection_level;
tmosalDisableInterruptsNoSysCall(&lv_protection_level);
GV_MV_DEC_status.dec_state = MV_DEC_DECODING_STATE_STOPPED;
GV_MV_DEC_status.dec_discontinuity_detected = FALSE;
tmosalEnableInterruptsNoSysCall(lv_protection_level);
GV_cmd_buf_start = FALSE;
MV_ITV_disable_irpt(MV_ITV_VIDEO_FIFO_UNDER);
MV_ITV_disable_irpt(MV_ITV_VIDEO_FIFO_OVER);
MV_FBM_change_channel();
} /* End of MV_DEC_stop */
/*MPF=======================================================================*/
/*
FUNCTION NAME: MV_DEC_scan
PACKAGE: MV_DEC
SCOPE: PLATFORM
DESCRIPTION:
Decode and display only the I or the I&P pictures.
When the play mode requires waiting for the system time counter to
reach the video decoding time stamp (DTS), or for the video input
buffer contents to reach the over level, this is done asynchronously.
This function returns immediately.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -