📄 fbm_api.c
字号:
return(MV_FBM_NOT_OK);
}
} /* End MV_FBM_set_error_concealment_copy */
/*MPF=======================================================================*/
/*
FUNCTION NAME: MV_FBM_set_error_concealment_freeze
DESCRIPTION:
RETURNS:
MV_FBM_OK
MV_FBM_NOT_OK
CALLING SEQUENCE:
*/
int
MV_FBM_set_error_concealment_freeze(
USHORT in_error_case
)
/*EMP=======================================================================*/
{
/****************-----------------------------------------------!*********
****************! Variable declarations !*********
****************!-----------------------------------------------*********/
BOOLEAN lv_valid_input_parameter = TRUE;
/****************-----------------------------------------------!*********
****************! Execution !*********
****************!------------------------------------------------********/
switch (in_error_case)
{
case MV_FBM_MEDIUM_FLAGED_ERROR:
MV_drv_set_medium_flaged_error_lock(MV_BIT_ON);
break;
case MV_FBM_LOW_FLAGED_ERROR:
MV_drv_set_low_flaged_error_lock(MV_BIT_ON);
break;
case MV_FBM_VLC_COEF_ERROR:
MV_drv_set_vlc_coef_error_lock(MV_BIT_ON);
break;
case MV_FBM_VLC_EOB_MISS_ERROR:
MV_drv_set_vlc_eob_miss_error_lock(MV_BIT_ON);
break;
case MV_FBM_VLC_MB_ERROR:
MV_drv_set_vlc_mb_error_lock(MV_BIT_ON);
break;
case MV_FBM_VECT_ERROR:
MV_drv_set_vect_error_lock(MV_BIT_ON);
break;
default:
lv_valid_input_parameter = FALSE;
break;
} /* End switch */
if(lv_valid_input_parameter == TRUE)
{
return(MV_FBM_OK);
}
else
{
return(MV_FBM_NOT_OK);
}
} /* End MV_FBM_set_error_concealment_freeze */
/*MPF=======================================================================*/
/*
FUNCTION NAME: MV_FBM_video_in_sync_handler
DESCRIPTION:
Informs FBM-tasks after occurance of the video-in-sync interrupt
RETURNS:
CALLING SEQUENCE:
*/
extern void
MV_FBM_video_in_sync_handler(
void
)
/*EMP=======================================================================*/
{
DV_DBG_STORE_EVENT(IPVD_DBG_EV_ISR, IPVD_DBG_ISR_BEGIN_LEVEL,IPVD_IN_SYNC_ISR, 0, 0, 0);
if (GV_MV_DEC_status.dec_sync_mode == MV_DEC_SYNC_MODE_DTS_FREE_RUNNING)
{
MV_drv_set_video_synchronisation_mode(MV_VIDEO_BUF_CTRL_START);
}
MV_FBM_in_sync_notification();
DV_DBG_STORE_EVENT(IPVD_DBG_EV_ISR, IPVD_DBG_ISR_END_LEVEL,IPVD_IN_SYNC_ISR, 0, 0, 0);
}
/*MPF=======================================================================*/
/*
FUNCTION NAME: MV_FBM_init
DESCRIPTION:
Perform initialization of FBM driver
RETURNS:
MV_FBM_OK
MV_FBM_NOT_OK
CALLING SEQUENCE:
*/
extern int
MV_FBM_init(
MV_DEC_BUFFERS *in_buffers /* In: application allocated buffers */
)
/*EMP=======================================================================*/
{
/****************-----------------------------------------------!*********
****************! Variable declarations !*********
****************!-----------------------------------------------*********/
/* Declarations for starting the fbm task */
#ifndef FBM_IN_ISR_ONLY
unsigned long FBM_tid;
#endif
/* Declaration for the 'fbm' message queue */
unsigned long q_size;
tmErrorCode_t lv_return_value;
/* Declaration for interrupts */
BOOLEAN it_enable;
/****************-----------------------------------------------!*********
****************! Execution !*********
****************!------------------------------------------------********/
/*---------------------------------------------------------------------*/
/* set store_hrz_size_nxt and setup_buffer_number from ipvd_cfg.h */
/*---------------------------------------------------------------------*/
MV_drv_set_store_hrz_size_nxt(GV_MV_DEC_config_status.dec_bufcfg.max_hor_dec_picture);
if(GV_MV_DEC_config_status.dec_bufcfg.tv_standard == MV_DEC_STANDARD_60HZ)
{
MV_drv_set_setup_buffer_number(MV_DEC_SETUP_BUFFER_NUMBER_60HZ);
}
else
{
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);
}
}
/*---------------------------------------------------------------------*/
/* anchored status structure on his pointer */
/*---------------------------------------------------------------------*/
LV_fbm_status_ptr = &LV_fbm_status;
/*---------------------------------------------------------------------*/
/* Create a message queue */
/*---------------------------------------------------------------------*/
q_size = 30; /* Max of messages in the queue */
lv_return_value = tmosalQueueCreate(q_size, sizeof(FBM_QUEUE_MSG), &GV_fbm_qid, tmosalQueueCreateFlagNone);
if (lv_return_value != TM_OK)
{
DV_DBG_STORE_EVENT(IPVD_DBG_EV_TMOSAL_ERROR,
IPVD_DBG_MAJOR_BEHAVIOR_LEVEL,
IPVD_QUEUE_CREATE, lv_return_value, 0, 0); // Log the error
}
/*---------------------------------------------------------------------*/
/* Create and start fbm task */
/*---------------------------------------------------------------------*/
#ifndef FBM_IN_ISR_ONLY
lv_return_value = tmosalTaskCreate (LF_FBM_task, Null,
FBM_PRIOR,
USTK,
&GV_FbmTaskHandle,
FBM_NAME,
FBM_FLAGS);
if (lv_return_value != TM_OK)
{
DV_DBG_STORE_EVENT(IPVD_DBG_EV_TMOSAL_ERROR,
IPVD_DBG_MAJOR_BEHAVIOR_LEVEL,
IPVD_TASK_CREATE, lv_return_value, 0, 0); // Log the error
}
#endif
/*---------------------------------------------------------------------*/
/* Install the event handler */
/*---------------------------------------------------------------------*/
/* Install FBM_fbm_event_handler and FBM_fbm_error_handler */
it_enable = TRUE;
MV_ITV_install_isr(LF_FBM_event_handler, MV_ITV_FBM_EVENT, it_enable);
MV_ITV_install_isr(LF_FBM_error_handler, MV_ITV_ERROR_EVENT, it_enable);
MV_ITV_install_isr(MV_FBM_video_in_sync_handler, MV_ITV_VIDEO_INSYNC, it_enable);
/* Hook-up on the VSYNC the function LF_FBM_Vs_handler */
DV_DBG_STORE_EVENT(IPVD_DBG_EV_CALL_EXTERNAL_API, IPVD_DBG_CALL_BEGIN_LEVEL,IPVD_CALL_SYNC, 0, 0, 0);
DV_SYN_link_callback(DV_SYN_CALLBACK_POS_VBI_START,LF_FBM_Vs_handler, DV_SYN_CALLBACK_PRIORITY_HIGH);
DV_DBG_STORE_EVENT(IPVD_DBG_EV_CALL_EXTERNAL_API, IPVD_DBG_CALL_END_LEVEL,IPVD_CALL_SYNC, 0, 0, 0);
MV_ITV_install_isr(LF_FBM_eoph_handler, MV_ITV_END_OF_PICTURE_HEADER, it_enable);
MV_ITV_install_isr(LF_FBM_eopd_handler, MV_ITV_END_OF_PICTURE_DECODING, it_enable);
/*---------------------------------------------------------------------*/
/* Progran Frame store base address per data type and per field */
/*---------------------------------------------------------------------*/
{
/*------------------------------------------------------------*/
/* Set the data zone: Yo, Ye, Co, Ce, of the FS0 */
/*------------------------------------------------------------*/
LV_fbm_status_ptr->frame_store_y_odd_add[FS0] =
(unsigned long)((unsigned long)in_buffers->FS0_y_odd_buf_addr -
(unsigned long)in_buffers->SDRAM_base_addr);
LV_fbm_status_ptr->frame_store_y_even_add[FS0] =
(unsigned long)((unsigned long)in_buffers->FS0_y_even_buf_addr -
(unsigned long)in_buffers->SDRAM_base_addr);
LV_fbm_status_ptr->frame_store_c_odd_add[FS0] =
(unsigned long)((unsigned long)in_buffers->FS0_c_odd_buf_addr -
(unsigned long)in_buffers->SDRAM_base_addr);
LV_fbm_status_ptr->frame_store_c_even_add[FS0] =
(unsigned long)((unsigned long)in_buffers->FS0_c_even_buf_addr -
(unsigned long)in_buffers->SDRAM_base_addr);
/*------------------------------------------------------------*/
/* Set the data zone: Yo, Ye, Co, Ce, of the FS1 */
/*------------------------------------------------------------*/
LV_fbm_status_ptr->frame_store_y_odd_add[FS1] =
(unsigned long)((unsigned long)in_buffers->FS1_y_odd_buf_addr -
(unsigned long)in_buffers->SDRAM_base_addr);
LV_fbm_status_ptr->frame_store_y_even_add[FS1] =
(unsigned long)((unsigned long)in_buffers->FS1_y_even_buf_addr -
(unsigned long)in_buffers->SDRAM_base_addr);
LV_fbm_status_ptr->frame_store_c_odd_add[FS1] =
(unsigned long)((unsigned long)in_buffers->FS1_c_odd_buf_addr -
(unsigned long)in_buffers->SDRAM_base_addr);
LV_fbm_status_ptr->frame_store_c_even_add[FS1] =
(unsigned long)((unsigned long)in_buffers->FS1_c_even_buf_addr -
(unsigned long)in_buffers->SDRAM_base_addr);
/*------------------------------------------------------------*/
/* set FS2 data zone accordingly */
/*------------------------------------------------------------*/
LV_fbm_status_ptr->frame_store_y_odd_add[FS2] =
(unsigned long)((unsigned long)in_buffers->FS2_y_odd_buf_addr -
(unsigned long)in_buffers->SDRAM_base_addr);
LV_fbm_status_ptr->frame_store_y_even_add[FS2] =
(unsigned long)((unsigned long)in_buffers->FS2_y_even_buf_addr -
(unsigned long)in_buffers->SDRAM_base_addr);
LV_fbm_status_ptr->frame_store_c_odd_add[FS2] =
(unsigned long)((unsigned long)in_buffers->FS2_c_odd_buf_addr -
(unsigned long)in_buffers->SDRAM_base_addr);
LV_fbm_status_ptr->frame_store_c_even_add[FS2] =
(unsigned long)((unsigned long)in_buffers->FS2_c_even_buf_addr -
(unsigned long)in_buffers->SDRAM_base_addr);
/*------------------------------------------------------------*/
/* set FS3 data zone accordingly */
/*------------------------------------------------------------*/
if(GV_MV_DEC_config_status.dec_bufcfg.fs_memory_mapping == MV_DEC_FS_MAPPING_4_0)
{
LV_fbm_status_ptr->frame_store_y_odd_add[FS3] =
(unsigned long)((unsigned long)in_buffers->FS3_y_odd_buf_addr -
(unsigned long)in_buffers->SDRAM_base_addr);
LV_fbm_status_ptr->frame_store_y_even_add[FS3] =
(unsigned long)((unsigned long)in_buffers->FS3_y_even_buf_addr -
(unsigned long)in_buffers->SDRAM_base_addr);
LV_fbm_status_ptr->frame_store_c_odd_add[FS3] =
(unsigned long)((unsigned long)in_buffers->FS3_c_odd_buf_addr -
(unsigned long)in_buffers->SDRAM_base_addr);
LV_fbm_status_ptr->frame_store_c_even_add[FS3] =
(unsigned long)((unsigned long)in_buffers->FS3_c_even_buf_addr -
(unsigned long)in_buffers->SDRAM_base_addr);
}
else
{
LV_fbm_status_ptr->frame_store_y_odd_add[FS3] = 0;
LV_fbm_status_ptr->frame_store_y_even_add[FS3] = 0;
LV_fbm_status_ptr->frame_store_c_odd_add[FS3] = 0;
LV_fbm_status_ptr->frame_store_c_even_add[FS3] = 0;
}
}
if(GV_MV_DEC_config_status.dec_bufcfg.dec_to_disp == 2)
{
MV_FBM_dec_to_disp(MV_DEC_TO_DISP_N2);
}
else
{
MV_FBM_dec_to_disp(MV_DEC_TO_DISP_N1);
}
return(MV_FBM_OK);
} /* End MV_FBM_init */
/*MPF=======================================================================*/
/*
FUNCTION NAME: MV_FBM_release_resources
DESCRIPTION:
Release all the resoources used by the FBM package
RETURNS:
MV_FBM_OK
MV_FBM_NOT_OK
CALLING SEQUENCE:
*/
extern int
MV_FBM_release_resources(
void
)
/*EMP=======================================================================*/
{
/****************-----------------------------------------------!*********
****************! Variable declarations !*********
****************!-----------------------------------------------*********/
# ifndef FBM_IN_ISR_ONLY
Int32 lv_timeout = MV_CFG_QUEUE_TIMEOUT;
FBM_QUEUE_MSG lv_msg;
tmErrorCode_t returnVal;
# endif
/****************-----------------------------------------------!*********
****************! Execution !*********
****************!------------------------------------------------********/
/* Disable all the interupts from fbm_error */
MV_drv_set_error_event_enable(0);
/* Disable all the interupts from fbm_event */
MV_drv_set_fbm_event_enable(0);
/* DE-Install FBM_fbm_event_handler,
FBM_fbm_error_handler, MV_FBM_video_in_sync_handler,
LF_FBM_Vs_handler,
LF_FBM_eoph_handler, LF_FBM_eopd_handler */
MV_ITV_deinstall_isr(MV_ITV_FBM_EVENT);
MV_ITV_deinstall_isr(MV_ITV_ERROR_EVENT);
MV_ITV_deinstall_isr(MV_ITV_VIDEO_INSYNC);
DV_SYN_unlink_callback(DV_SYN_CALLBACK_POS_VBI_START,LF_FBM_Vs_handler);
MV_ITV_deinstall_isr(MV_ITV_END_OF_PICTURE_HEADER);
MV_ITV_deinstall_isr(MV_ITV_END_OF_PICTURE_DECODING);
# ifndef FBM_IN_ISR_ONLY
/* Send FBM_MSG_RELEASE_RESOURCES message to FBM task */
lv_msg[0] = FBM_MSG_RELEASE_RESOURCES;
returnVal = tmosalQueueSend(GV_fbm_qid, lv_msg, sizeof(FBM_QUEUE_MSG), &lv_timeout, tmosalQueueSendFlagNone);
if (returnVal != TM_OK)
{
switch (returnVal)
{
case TMOSAL_ERR_QUE_TIMEOUT:
DV_DBG_STORE_EVENT(IPVD_DBG_EV_TIMEOUT, IPVD_DBG_QUEUE_TIMEOUT_LEVEL,1, 0,0,0);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -