📄 mv_dec01.c
字号:
lv_ud_count--;
}
/* free the sync semaphore, to continue : it allows no loses
of user data while application is retrieving user data */
returnVal = tmosalSemRelease(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_RELEASE,0,0,0);
}
}
else
{
DV_DBG_STORE_EVENT(IPVD_DBG_EV_UD_SEMAPHORE_ERROR,IPVD_DBG_UD_LEVEL,IPVD_SEMAPHORE_ACQUIRE,0,0,0);
*ou_nbytes_read_ptr = 0;
*ou_nbytes_remaining_ptr= GV_MV_DEC_ud_status.dec_ud_bfm; /* in bytes */
}
} /* End of MV_DEC_get_user_data */
/*MPF=======================================================================*/
/*
FUNCTION NAME: MV_DEC_user_data_process
PACKAGE: DEC
SCOPE: PLATEFORM
DESCRIPTION:
This function contain the User Data parsing action to be done on the
application thread.
The application thread must call the MV_DEC_user_data_process() routine
once for each notification of the MV_DEC_UD_PROCESSING_NEEDED_EVENT.
This routine will stock User Data in a specific buffer, which size has
been set by application during initialisation phase. This buffer can be read
via MV_DEC_get_user_data() API.
PRECONDITIONS:
To be inform to call User Data parsing routine, Application must enable
notification of MV_DEC_UD_PROCESSING_NEEDED_EVENT via API
MV_DEC_enable_notification().
POSTCONDITIONS:
None
NOTE:
CALLING SEQUENCE:
*/
extern MV_DEC_ERROR
MV_DEC_user_data_process(
void
)
/*EMP=======================================================================*/
{
MV_DEC_ERROR lv_result = MV_DEC_OK;
MV_REG_SIZE lv_fifo_size;
unsigned long lv_ud_sequence_adr;
unsigned long lv_ud_gop_adr;
unsigned long lv_ud_picture_adr;
unsigned long lv_gop_header_adr;
unsigned long lv_picture_header_adr;
unsigned long lv_slice_header_adr;
unsigned long lv_pes_header_1_adr;
unsigned long lv_pes_header_2_adr;
unsigned char lv_pes_packet_size;
unsigned long lv_video_start_ad;
UInt32 lv_protection_level;
#ifdef DV_DEBUG
register unsigned long lv_info0;
register unsigned long lv_info1;
register unsigned long lv_info2;
register unsigned long lv_info3;
lv_info0 = MV_drv_userdata_sequence_address();
lv_info1 = MV_drv_gop_header_address();
lv_info2 = GV_MV_DEC_ud_status.dec_gop_sc_found;
lv_info3 = GV_MV_DEC_ud_status.dec_ud_found;
DV_DBG_STORE_EVENT(IPVD_DBG_EV_ENTER_UD_PARSING,IPVD_DBG_UD_LEVEL,lv_info0,lv_info1,lv_info2,lv_info3);
lv_info0 = MV_drv_pes_header_1_address();
lv_info1 = GV_MV_DEC_ud_status.dec_pes_sc1_found;
lv_info2 = MV_drv_pes_header_2_address();
lv_info3 = GV_MV_DEC_ud_status.dec_pes_sc2_found;
DV_DBG_STORE_EVENT(IPVD_DBG_EV_UD_PES_INSIDE,IPVD_DBG_UD_LEVEL,lv_info0,lv_info1,lv_info2,lv_info3);
#endif
/* retrieve start address and size of the video fifo */
lv_video_start_ad = MV_drv_video_fifo_start();
lv_fifo_size = MV_drv_video_fifo_size();
/* read pes header addresses to verify if they are include in the
user data payload. Due to HW pb, normally adress read start from
the end of the Start Code, but as this is not the case, we make
shift of 4 bytes */
lv_pes_header_1_adr = (MV_drv_pes_header_1_address() + 4);
lv_pes_header_2_adr = (MV_drv_pes_header_2_address() + 4);
if (GV_MV_DEC_ud_status.dec_ud_parsing_done == FALSE)
{
if(GV_MV_DEC_ud_status.dec_ud_found & MV_DEC_SEQ_UD)
{
/* parsing between:
info_userdata_seq and (info_gop_header or info_picture_header) */
lv_ud_sequence_adr = MV_drv_userdata_sequence_address();
if(GV_MV_DEC_ud_status.dec_gop_sc_found == TRUE)
{
tmosalDisableInterruptsNoSysCall(&lv_protection_level);
GV_MV_DEC_ud_status.dec_gop_sc_found = FALSE;
tmosalEnableInterruptsNoSysCall(lv_protection_level);
/* parsing between:
info_userdata_seq and (info_gop_header - 4 bytes) */
lv_gop_header_adr = MV_drv_gop_header_address();
if (GV_MV_DEC_ud_status.dec_pes_sc1_found == TRUE)
{
if (((lv_pes_header_1_adr > lv_ud_sequence_adr) && (lv_pes_header_1_adr < lv_gop_header_adr))||
/*****************************************************************/
/* FIFO_START SEQ_UD PES1_SC GOP_HEADER FIFO_STOP */
/* ||-----------------|---------|------------|----------|| */
/*****************************************************************/
((lv_pes_header_1_adr > lv_ud_sequence_adr) && (lv_pes_header_1_adr > lv_gop_header_adr) && (lv_gop_header_adr < lv_ud_sequence_adr)) ||
/*****************************************************************/
/* FIFO_START GOP_HEADER SEQ_UD PES1_SC FIFO_STOP */
/* ||-------------|------------|------------|-----------|| */
/*****************************************************************/
((lv_pes_header_1_adr < lv_ud_sequence_adr) && (lv_pes_header_1_adr < lv_gop_header_adr) && (lv_gop_header_adr < lv_ud_sequence_adr)))
/*****************************************************************/
/* FIFO_START PES1_SC GOP_HEADER SEQ_UD FIFO_STOP */
/* ||-----------|------------|------------|-------------|| */
/*****************************************************************/
{
/* the PES packet 1 is inserted in User Data, so retrieve its
lenght to skip it, store of UD will be done in 2 blocks */
/* first block storing from info_userdata_seq and (info_pes_header_1 - 4bytes) */
LF_MV_DEC_store_user_data(lv_ud_sequence_adr, ((lv_pes_header_1_adr - 4 + lv_fifo_size) % lv_fifo_size));
/* retrieve size of PES 1 packet */
lv_pes_packet_size = *(unsigned char *)(GV_MV_INP_status.SDRAM_base_addr + lv_video_start_ad + ((lv_pes_header_1_adr + 4)% lv_fifo_size));
/* second block storing from (lv_pes_packet_size + 5 bytes) and (info_gop_header - 4bytes) */
LF_MV_DEC_store_user_data(((lv_pes_header_1_adr + lv_pes_packet_size + 5) % lv_fifo_size), ((lv_gop_header_adr - 4 + lv_fifo_size ) % lv_fifo_size));
}
else
{
LF_MV_DEC_store_user_data(lv_ud_sequence_adr, ((lv_gop_header_adr - 4 + lv_fifo_size) % lv_fifo_size));
}
}
else if (GV_MV_DEC_ud_status.dec_pes_sc2_found == TRUE)
{
if (((lv_pes_header_2_adr > lv_ud_sequence_adr) && (lv_pes_header_2_adr < lv_gop_header_adr)) ||
/*****************************************************************/
/* FIFO_START SEQ_UD PES2_SC GOP_HEADER FIFO_STOP */
/* ||-----------------|---------|------------|----------|| */
/*****************************************************************/
((lv_pes_header_2_adr > lv_ud_sequence_adr) && (lv_pes_header_2_adr > lv_gop_header_adr) && (lv_gop_header_adr < lv_ud_sequence_adr)) ||
/*****************************************************************/
/* FIFO_START GOP_HEADER SEQ_UD PES2_SC FIFO_STOP */
/* ||-------------|------------|------------|-----------|| */
/*****************************************************************/
((lv_pes_header_2_adr < lv_ud_sequence_adr) && (lv_pes_header_2_adr < lv_gop_header_adr) && (lv_gop_header_adr < lv_ud_sequence_adr)))
/*****************************************************************/
/* FIFO_START PES2_SC GOP_HEADER SEQ_UD FIFO_STOP */
/* ||-----------|------------|------------|-------------|| */
/*****************************************************************/
{
/* the PES packet 2 is inserted in User Data, so retrieve its
lenght to skip it, store of UD will be done in 2 blocks */
/* first block storing from info_userdata_seq and (info_pes_header_2 - 4bytes) */
LF_MV_DEC_store_user_data(lv_ud_sequence_adr, ((lv_pes_header_2_adr - 4 + lv_fifo_size) % lv_fifo_size));
/* retrieve size of PES 2 packet */
lv_pes_packet_size = *(unsigned char *)((GV_MV_INP_status.SDRAM_base_addr + lv_video_start_ad + (lv_pes_header_2_adr + 4)) % lv_fifo_size);
/* second block storing from (lv_pes_packet_size + 5 bytes) and (info_gop_header - 4bytes) */
LF_MV_DEC_store_user_data(((lv_pes_header_2_adr + lv_pes_packet_size + 5) % lv_fifo_size), ((lv_gop_header_adr - 4 + lv_fifo_size ) % lv_fifo_size));
}
else
{
LF_MV_DEC_store_user_data(lv_ud_sequence_adr, ((lv_gop_header_adr - 4 + lv_fifo_size) % lv_fifo_size));
}
}
else
{
LF_MV_DEC_store_user_data(lv_ud_sequence_adr, ((lv_gop_header_adr - 4 + lv_fifo_size) % lv_fifo_size));
}
}
else
{
/* parsing between:
info_userdata_seq and (info_picture_header - 4 bytes) */
lv_picture_header_adr = MV_drv_picture_header_address();
if (GV_MV_DEC_ud_status.dec_pes_sc1_found == TRUE)
{
if (((lv_pes_header_1_adr > lv_ud_sequence_adr) && (lv_pes_header_1_adr < lv_picture_header_adr)) ||
/*****************************************************************/
/* FIFO_START SEQ_UD PES1_SC PIC_HEADER FIFO_STOP */
/* ||-----------------|---------|------------|----------|| */
/*****************************************************************/
((lv_pes_header_1_adr > lv_ud_sequence_adr) && (lv_pes_header_1_adr > lv_picture_header_adr) && (lv_picture_header_adr < lv_ud_sequence_adr)) ||
/*****************************************************************/
/* FIFO_START PIC_HEADER SEQ_UD PES1_SC FIFO_STOP */
/* ||-------------|------------|------------|-----------|| */
/*****************************************************************/
((lv_pes_header_1_adr < lv_ud_sequence_adr) && (lv_pes_header_1_adr < lv_picture_header_adr) && (lv_picture_header_adr < lv_ud_sequence_adr)))
/*****************************************************************/
/* FIFO_START PES1_SC PIC_HEADER SEQ_UD FIFO_STOP */
/* ||-----------|------------|------------|-------------|| */
/*****************************************************************/
{
/* the PES packet 1 is inserted in User Data, so retrieve its
lenght to skip it, store of UD will be done in 2 blocks */
/* first block storing from info_userdata_seq and (info_pes_header_1 - 4bytes) */
LF_MV_DEC_store_user_data(lv_ud_sequence_adr, ((lv_pes_header_1_adr - 4 + lv_fifo_size) % lv_fifo_size));
/* retrieve size of PES 1 packet */
lv_pes_packet_size = *(unsigned char *)(GV_MV_INP_status.SDRAM_base_addr + lv_video_start_ad + ((lv_pes_header_1_adr + 4)% lv_fifo_size));
/* second block storing from (lv_pes_packet_size + 5 bytes) and (info_picture_header - 4bytes) */
LF_MV_DEC_store_user_data(((lv_pes_header_1_adr + lv_pes_packet_size + 5) % lv_fifo_size), ((lv_picture_header_adr - 4 + lv_fifo_size ) % lv_fifo_size));
}
else
{
LF_MV_DEC_store_user_data(lv_ud_sequence_adr, ((lv_picture_header_adr - 4 + lv_fifo_size) % lv_fifo_size));
}
}
else if (GV_MV_DEC_ud_status.dec_pes_sc2_found == TRUE)
{
if (((lv_pes_header_2_adr > lv_ud_sequence_adr) && (lv_pes_header_2_adr < lv_picture_header_adr)) ||
/*****************************************************************/
/* FIFO_START SEQ_UD PES2_SC PIC_HEADER FIFO_STOP */
/* ||-----------------|---------|------------|----------|| */
/*****************************************************************/
((lv_pes_header_2_adr > lv_ud_sequence_adr) && (lv_pes_header_2_adr > lv_picture_header_adr) && (lv_picture_header_adr < lv_ud_sequence_adr)) ||
/*****************************************************************/
/* FIFO_START PIC_HEADER SEQ_UD PES2_SC FIFO_STOP */
/* ||-------------|------------|------------|-----------|| */
/*****************************************************************/
((lv_pes_header_2_adr < lv_ud_sequence_adr) && (lv_pes_header_2_adr < lv_picture_header_adr) && (lv_picture_header_adr < lv_ud_sequence_adr)))
/*****************************************************************/
/* FIFO_START PES2_SC PIC_HEADER SEQ_UD FIFO_STOP */
/* ||-----------|------------|------------|-------------|| */
/*****************************************************************/
{
/* the PES packet 2 is inserted in User Data, so retrieve its
lenght to skip it, store of UD will be done in 2 blocks */
/* first block storing from info_userdata_seq and (info_pes_header_2 - 4bytes) */
LF_MV_DEC_store_user_data(lv_ud_sequence_adr, ((lv_pes_header_2_adr - 4 + lv_fifo_size) % lv_fifo_size));
/* retrieve size of PES 2 packet */
lv_pes_packet_size = *(unsigned char *)((GV_MV_INP_status.SDRAM_base_addr + lv_video_start_ad + (lv_pes_header_2_adr + 4)) % lv_fifo_size);
/* second block storing from (lv_pes_packet_size + 5 bytes) and (info_picture_header - 4bytes) */
LF_MV_DEC_store_user_data(((lv_pes_header_2_adr + lv_pes_packet_size + 5) % lv_fifo_size), ((lv_picture_header_adr - 4 + lv_fifo_size ) % lv_fifo_size));
}
else
{
LF_MV_DEC_store_user_data(lv_ud_sequence_adr, ((lv_picture_header_adr - 4 + lv_fifo_size) % lv_fifo_size));
}
}
else
{
LF_MV_DEC_store_user_data(lv_ud_sequence_adr, ((lv_picture_header_adr - 4 + lv_fifo_size) % lv_fifo_size));
}
}
}
if(GV_MV_DEC_ud_status.dec_ud_found & MV_DEC_GOP_UD)
{
/* parsing between:
info_userdata_gop and (info_picture_header - 4 bytes) */
lv_ud_gop_adr = MV_drv_userdata_gop_address();
lv_picture_header_adr = MV_drv_picture_header_address();
if (GV_MV_DEC_ud_status.dec_pes_sc1_found == TRUE)
{
if (((lv_pes_header_1_adr > lv_ud_gop_adr) && (lv_pes_header_1_adr < lv_picture_header_adr)) ||
/*****************************************************************/
/* FIFO_START GOP_UD PES1_SC PIC_HEADER FIFO_STOP */
/* ||-----------------|---------|------------|----------|| */
/*****************************************************************/
((lv_pes_header_1_adr > lv_ud_gop_adr) && (lv_pes_header_1_adr > lv_picture_header_adr) && (lv_picture_header_adr < lv_ud_gop_adr)) ||
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -