📄 mv_dec01.c
字号:
/*****************************************************************/
/* FIFO_START PIC_HEADER GOP_UD PES1_SC 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)))
/*****************************************************************/
/* FIFO_START PES1_SC PIC_HEADER GOP_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_gop and (info_pes_header_1 - 4bytes) */
LF_MV_DEC_store_user_data(lv_ud_gop_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_gop_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_gop_adr) && (lv_pes_header_2_adr < lv_picture_header_adr)) ||
/*****************************************************************/
/* FIFO_START GOP_UD PES2_SC PIC_HEADER FIFO_STOP */
/* ||-----------------|---------|------------|----------|| */
/*****************************************************************/
((lv_pes_header_2_adr > lv_ud_gop_adr) && (lv_pes_header_2_adr > lv_picture_header_adr) && (lv_picture_header_adr < lv_ud_gop_adr)) ||
/*****************************************************************/
/* FIFO_START PIC_HEADER GOP_UD PES2_SC FIFO_STOP */
/* ||-------------|------------|------------|-----------|| */
/*****************************************************************/
((lv_pes_header_2_adr < lv_ud_gop_adr) && (lv_pes_header_2_adr < lv_picture_header_adr) && (lv_picture_header_adr < lv_ud_gop_adr)))
/*****************************************************************/
/* FIFO_START PES2_SC PIC_HEADER GOP_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_gop and (info_pes_header_2 - 4bytes) */
LF_MV_DEC_store_user_data(lv_ud_gop_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_gop_adr, ((lv_picture_header_adr - 4 + lv_fifo_size) % lv_fifo_size));
}
}
else
{
LF_MV_DEC_store_user_data(lv_ud_gop_adr, ((lv_picture_header_adr - 4 + lv_fifo_size) % lv_fifo_size));
}
}
if(GV_MV_DEC_ud_status.dec_ud_found & MV_DEC_PICT_UD)
{
/* parsing between:
info_userdata_picture and (info_slice_header - 4 bytes) */
lv_ud_picture_adr = MV_drv_userdata_picture_address();
lv_slice_header_adr = MV_drv_slice_header_address();
if (GV_MV_DEC_ud_status.dec_pes_sc1_found == TRUE)
{
if (((lv_pes_header_1_adr > lv_ud_picture_adr) && (lv_pes_header_1_adr < lv_slice_header_adr)) ||
/*****************************************************************/
/* FIFO_START PIC_UD PES1_SC SLC_HEADER FIFO_STOP */
/* ||-----------------|---------|------------|----------|| */
/*****************************************************************/
((lv_pes_header_1_adr > lv_ud_picture_adr) && (lv_pes_header_1_adr > lv_slice_header_adr) && (lv_slice_header_adr < lv_ud_picture_adr)) ||
/*****************************************************************/
/* FIFO_START SLC_HEADER PIC_UD PES1_SC FIFO_STOP */
/* ||-------------|------------|------------|-----------|| */
/*****************************************************************/
((lv_pes_header_1_adr < lv_ud_picture_adr) && (lv_pes_header_1_adr < lv_slice_header_adr) && (lv_slice_header_adr < lv_ud_picture_adr)))
/*****************************************************************/
/* FIFO_START PES1_SC SLC_HEADER PIC_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_picture and (info_pes_header_1 - 4bytes) */
LF_MV_DEC_store_user_data(lv_ud_picture_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_slice_header - 4bytes) */
LF_MV_DEC_store_user_data(((lv_pes_header_1_adr + lv_pes_packet_size + 5) % lv_fifo_size), ((lv_slice_header_adr - 4 + lv_fifo_size ) % lv_fifo_size));
}
else
{
LF_MV_DEC_store_user_data(lv_ud_picture_adr, ((lv_slice_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_picture_adr) && (lv_pes_header_2_adr < lv_slice_header_adr)) ||
/*****************************************************************/
/* FIFO_START PIC_UD PES2_SC SLC_HEADER FIFO_STOP */
/* ||-----------------|---------|------------|----------|| */
/*****************************************************************/
((lv_pes_header_2_adr > lv_ud_picture_adr) && (lv_pes_header_2_adr > lv_slice_header_adr) && (lv_slice_header_adr < lv_ud_picture_adr)) ||
/*****************************************************************/
/* FIFO_START SLC_HEADER PIC_UD PES2_SC FIFO_STOP */
/* ||-------------|------------|------------|-----------|| */
/*****************************************************************/
((lv_pes_header_2_adr < lv_ud_picture_adr) && (lv_pes_header_2_adr < lv_slice_header_adr) && (lv_slice_header_adr < lv_ud_picture_adr)))
/*****************************************************************/
/* FIFO_START PES2_SC SLC_HEADER PIC_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_picture and (info_pes_header_2 - 4bytes) */
LF_MV_DEC_store_user_data(lv_ud_picture_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_slice_header - 4bytes) */
LF_MV_DEC_store_user_data(((lv_pes_header_2_adr + lv_pes_packet_size + 5) % lv_fifo_size), ((lv_slice_header_adr - 4 + lv_fifo_size ) % lv_fifo_size));
}
else
{
LF_MV_DEC_store_user_data(lv_ud_picture_adr, ((lv_slice_header_adr - 4 + lv_fifo_size) % lv_fifo_size));
}
}
else
{
LF_MV_DEC_store_user_data(lv_ud_picture_adr, ((lv_slice_header_adr - 4 + lv_fifo_size) % lv_fifo_size));
}
}
GV_MV_DEC_ud_status.dec_ud_parsing_done = TRUE;
GV_MV_DEC_ud_status.dec_ud_found = 0;
if (GV_MV_DEC_ud_status.dec_pes_sc1_found == TRUE)
{
GV_MV_DEC_ud_status.dec_pes_sc1_found = FALSE;
}
if (GV_MV_DEC_ud_status.dec_pes_sc2_found == TRUE)
{
GV_MV_DEC_ud_status.dec_pes_sc2_found = FALSE;
}
/* notify to application MV_DEC_UD_AVAILABLE_EVENT, so that it can now
call MV_DEC_get_user_data */
if (GV_MV_DEC_status.dec_event_enabled & MV_DEC_UD_AVAILABLE_EVENT)
{
DV_DBG_STORE_EVENT(IPVD_DBG_EV_UD_AVAILABLE,IPVD_DBG_UD_LEVEL,lv_info0,lv_info1,lv_info2,lv_info3);
/* Notify the application. */
GV_MV_DEC_status.function_ptr(MV_DEC_UD_AVAILABLE_EVENT);
}
}
else
{
lv_result = MV_DEC_NOT_OK;
}
#ifdef DV_DEBUG
lv_info0 = MV_drv_userdata_gop_address();
lv_info1 = MV_drv_picture_header_address();
lv_info2 = MV_drv_userdata_picture_address();
lv_info3 = MV_drv_slice_header_address();
#endif
DV_DBG_STORE_EVENT(IPVD_DBG_EV_EXIT_UD_PARSING,IPVD_DBG_UD_LEVEL,lv_info0,lv_info1,lv_info2,lv_info3);
return lv_result;
} /* End of MV_DEC_user_data_process */
/*==========================================================================*/
/* L O C A L F U N C T I O N S */
/*==========================================================================*/
/*LPF=======================================================================*/
/*
FUNCTION NAME: LF_MV_DEC_store_user_data
PACKAGE: DEC
SCOPE: COMPONENT
DESCRIPTION:
Store data from start address to stop address in User Data buffer.
parameters are specified in bytes address offset % video fifo start
address
PRECONDITIONS:
None
POSTCONDITIONS:
None
NOTE:
CALLING SEQUENCE:
*/
static void
LF_MV_DEC_store_user_data(
unsigned long in_start_addr,
unsigned long in_stop_addr
)
/*EMP=======================================================================*/
{
unsigned long lv_nr_to_store; /* in bytes */
unsigned long lv_load_count; /* in bytes */
unsigned long lv_free_space; /* in bytes */
unsigned long lv_video_start_ad;
MV_REG_SIZE lv_fifo_size;
tmErrorCode_t returnVal;
Int32 timeout = 1000;
#ifdef DV_DEBUG
register unsigned long lv_info0;
register unsigned long lv_info1;
register unsigned long lv_info2;
register unsigned long lv_info3 = 0;
#endif
/* take the sync semaphore, to continue : it allows no loses
of user data while application is retrieving user data */
returnVal = tmosalSemAcquire(GV_MV_DEC_ud_status.ptr_sync_semaphore, &timeout);
if(returnVal == TM_OK)
{
/* retrieve size of the video fifo, for wrap around */
lv_fifo_size = MV_drv_video_fifo_size();
lv_nr_to_store = ((in_stop_addr - in_start_addr + lv_fifo_size) % lv_fifo_size);
#ifdef DV_DEBUG
lv_info0 = in_start_addr;
lv_info1 = in_stop_addr;
lv_info2 = lv_nr_to_store;
#endif
DV_DBG_STORE_EVENT(IPVD_DBG_EV_UD_STORE_DATA,IPVD_DBG_UD_LEVEL,lv_info0,lv_info1,lv_info2,lv_info3);
/* determine nr of bytes free in the buffer */
lv_free_space = (GV_MV_DEC_ud_status.dec_ud_buffer_size - GV_MV_DEC_ud_status.dec_ud_bfm);
/* verify if it remains enough place in ud buffer, if not fullfill it
up to ud buffer becomes full and notify it to application */
if (lv_nr_to_store > lv_free_space)
{
lv_nr_to_store = lv_free_space;
DV_DBG_STORE_EVENT(IPVD_DBG_EV_UD_BUFFER_FULL,IPVD_DBG_UD_LEVEL,lv_info0,lv_info1,lv_info2,lv_info3);
if (GV_MV_DEC_status.dec_event_enabled & MV_DEC_UD_BUFFER_FULL_EVENT)
{
GV_MV_DEC_status.function_ptr(MV_DEC_UD_BUFFER_FULL_EVENT);
}
}
/* retrieve start address of the video fifo */
lv_video_start_ad = MV_drv_video_fifo_start();
/* Load the determined nr of bytes */
for ( lv_load_count = 0; lv_load_count < lv_nr_to_store; lv_load_count++)
{
*(unsigned char *)(GV_MV_DEC_ud_status.dec_ud_adr + GV_MV_DEC_ud_status.dec_ud_wptr) = *(unsigned char *)(GV_MV_INP_status.SDRAM_base_addr + lv_video_start_ad + in_start_addr);
GV_MV_DEC_ud_status.dec_ud_wptr++;
GV_MV_DEC_ud_status.dec_ud_bfm++;
GV_MV_DEC_ud_status.dec_ud_wptr = GV_MV_DEC_ud_status.dec_ud_wptr % GV_MV_DEC_ud_status.dec_ud_buffer_size; /* for ud buffer wrap around */
in_start_addr = ((in_start_addr + 1) % lv_fifo_size); /* for fifo wrap around */
}
/* 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);
}
} /* End of LF_MV_DEC_store_user_data */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -