📄 mp4_decodeencodeapi.c
字号:
{
ulSize = 320 * 240 * 2;
g_unBLD_DstWidth = 1;
g_unBLD_DstHigh = 0;
}
else
{
ulSize = 640 * 480 * 2;
g_unBLD_DstWidth = 3;
g_unBLD_DstHigh = 2;
}
g_unMP4HW_TVBuffer[0] = *P_TV_BUFFERA_SA1 = TVBuffAddrDst;
g_unMP4HW_TVBuffer[1] = *P_TV_BUFFERA_SA2 = TVBuffAddrDst + ulSize;
g_unMP4HW_TVBuffer[2] = *P_TV_BUFFERA_SA3 = TVBuffAddrDst + (ulSize*2);
//Set LCD buffer address and reset TV buffer
if(g_unMP4_setLCD_OK==0)
{
//Reset TV buffer.
memset((unsigned int *)g_unMP4HW_TVBuffer[0], 0, ulSize);
memset((unsigned int *)g_unMP4HW_TVBuffer[1], 0, ulSize);
memset((unsigned int *)g_unMP4HW_TVBuffer[2], 0, ulSize);
g_unMP4_setLCD_OK=1;
}
*P_MPEG4_VLCBUFFER_SEL = 0x00;
*P_MPEG4_VLCBUFFER_SA1 = 0x00000000;
*P_MPEG4_VLCBUFFER_SA2 = 0x00000000;
//------ SET E/F buffer
*P_MPEG4_WRITEBUFFER_SEL = 0x01;
*P_MPEG4_REFBUFFER_SEL = 0x00;
g_unMP4HW_DecodeBuff[0] = *P_MPEG4_WRITEBUFFER_SA1 = MP4WBuffAddrSrc;
g_unMP4HW_DecodeBuff[1] = *P_MPEG4_WRITEBUFFER_SA2 = MP4WBuffAddrSrc + unBuffSize;
g_unMP4HW_DecodeBuff[2] = *P_MPEG4_WRITEBUFFER_SA3 = MP4WBuffAddrSrc + (unBuffSize*2);
}
void mp4_deocder_prepare(unsigned int width,unsigned int height,unsigned int p_frame_cntr,unsigned int unVOPTimeIncLen)
{
unsigned int mbX, mbY, mb, n, ultemp;
g_unMP4HW_dvWidth = width;
g_unMP4HW_dvHigh = height;
*P_MPEG4_YUV_MODE=0x30;//yuv420 to Yuv422
// imgwidth
*P_MPEG4_FRAMEBUFFER_HSIZE = width;
*P_MPEG4_DECWIDTH_LOW = width;
*P_MPEG4_DECWIDTH_HIGH = (width>>8);
// imgheight
*P_MPEG4_DECHEIGHT_LOW = height;
*P_MPEG4_DECHEIGHT_HIGH = (height>>8);
// vlc offset
*P_MPEG4_DECVLCOFFSET_SALOW = 0x00;
*P_MPEG4_DECVLCOFFSET_SAMID = 0x00;
*P_MPEG4_DECVLCOFFSET_SAHIGH = 0x00;
*P_MPEG4_MODE_CTRL1 = 0x07; //operation mode
*P_MPEG4_HOR_SCALE = 0x00;
*P_MPEG4_VEL_SCALE = 0x00;
*P_MPEG4_PFRAME_NUMBER = p_frame_cntr;//gop can not be zero due to the design architecture
if(g_unMP4HW_RunMode==NORMAL_MODE)
{
*P_MPEG4_BUFFER_CTRL = 0x01;// bit 0 : dobule buffer enable
// bit 1 : double buffer update by sor/sdram
// bit 4 : zero mv
// bit 7 : video conference mode
}
else if(g_unMP4HW_RunMode==CONFERENCE_MODE)
{
*P_MPEG4_BUFFER_CTRL = 0x81;// bit 0 : dobule buffer enable
// bit 1 : double buffer update by sor/sdram
// bit 4 : zero mv
// bit 7 : video conference mode
}
else
{
//
}
*P_MPEG4_MODE_CTRL3 = 0x32; // bit 0 : goprstn
// bit 1 : halfpelen
// bit 2 : bit rate control enable
// bit 3 : rate control initial setting
// bit 4 : SOF mode ( 1 : MJPG engine is triggered by CPU )
// bit 5 : unrestricted
// bit 6 : gopsetting
// bit 7 : Mpg1skipmode
*P_MPEG4_PFRAME_NUMBER = 2;
if(((g_unMP4_decodePFrameCount++)%(P_FRAME_NUMBER+1))!=0)
{
*P_MPEG4_FRAME_MODE=0;//always P frame
}
else
{
*P_MPEG4_FRAME_MODE=1;//always I frame
}
*P_MPEG4_MODE_CTRL3 = 0x72;//gopsetting,SOF mode,half pel en
*P_MPEG4_TRUNCATE_CTRL=0x00000001; // bit 0 : Truncated after quantization
// bit 1 : DCT resolution
// turn on all the srams of texture engine
*P_MPEG4_SRAM_EN = 0x01;
// set Qscale enable
*P_MPEG4_QTABLE_CTRL = 0x06; // bit 0 : Q value one
// bit 1 : Q scale en
// bit 2 : Skip Type
// bit 3 : ExHeader Enable
// bit 4 : Half Pix MV enable
*P_MPEG4_VOPTIMEINC_LENGTH = unVOPTimeIncLen;
/////////////////////////////////////////////////////////////////////////////////
*P_MPEG4_MATCHCODE_CTRL = 0x03;
*P_MPEG4_MATCH_CODE1 = 0xb6;
*P_MPEG4_MATCH_CODE2 = 0x01;
*P_MPEG4_MATCH_CODE3 = 0x00;
*P_MPEG4_MATCH_CODE4 = 0x00;
/////////////////////////////////////////////////////////////////////////////////
#ifdef H263_CODEC
*P_MPEG4_MATCHCODE_CTRL = 0x00;
*P_MPEG4_H263_CTRL = 0x01 + H263_FORMAT; //bit0 Encoding/decoding 1:enable
// 0:disable
//bit3-1 Specify H.263 Format QCIF or others
//bit6 Enable 4MV Decoding mode or not
//bit7 Enable AC Prediction decoding mode or not
*P_MPEG4_H263_STRUCTURE = 0x00; //bit 0 Enable H.263 GOB structure for Encoding/Decoding
//bit7-4 Specify number of bits needed for certain resolution.
#else
*P_MPEG4_H263_CTRL = 0x40;
#endif
//Set MB num.
mbX = (width + 15) / 16;
mbY = (height + 15) / 16;
mb = mbX * mbY;
n = 0;
while ( mb > 0 )
{
mb = mb >> 1;
n++;
}
ultemp = (*P_MPEG4_H263_STRUCTURE)|(n << 4);
*P_MPEG4_H263_STRUCTURE = ultemp;
//~MB num.
//#ifdef SD_CARD_DEVICE
//*P_MPEG4_INT_CTRL = 0x0f;//0x0f close irq
//#else
*P_MPEG4_INT_CTRL = 0x03;//0x03 open irq
//#endif
}
///////////////////////////////////////////////////
void mp4_switch_decode_frame_buffer(unsigned int frame)
{
unsigned int rd_buffer_switch=frame%3;
unsigned int wd_buffer_switch=rd_buffer_switch+1;
if(wd_buffer_switch==3)
wd_buffer_switch =0;
//------ SET C/D buffer ------//
// RD Bufer
*P_MPEG4_REFBUFFER_SEL = rd_buffer_switch;
// WR Bufer
*P_MPEG4_WRITEBUFFER_SEL = wd_buffer_switch;
#ifdef BLENDING_MODE
BlnDmaStart_linear2block_Dma(g_unMP4HW_DecodeBuff[rd_buffer_switch], g_unMP4HW_TVBuffer[rd_buffer_switch], 0, 0, g_unBLD_DstWidth, g_unBLD_DstHigh, g_unMP4HW_dvWidth, g_unMP4HW_dvHigh, 0, 0, 0);
#endif
*P_TV_BUFFERA_SEL = rd_buffer_switch;
}
////////////////////////////////////////////////////////
void mp4_decompress(unsigned int vlc_address)
{
unsigned int vlc_sa;
#ifdef H263_CODEC
vlc_address = vlc_address+4;
#endif
vlc_sa=vlc_address&0xfffffc00;
*P_MPEG4_VLCBUFFER_SA1 = vlc_sa;
*P_MPEG4_DECVLCOFFSET_SALOW = vlc_address;
vlc_sa = vlc_address&0x00000300;
vlc_sa = vlc_sa>>8;
*P_MPEG4_DECVLCOFFSET_SAMID = vlc_sa;
*P_MPEG4_DECVLCOFFSET_SAHIGH = 0;
*P_MPEG4_COMPRESS_CTRL = 0x00000010; // bit 0 : mjpg c sof / encode done
// bit 1 : eof status
// bit 2 : skip frame
// bit 3 : sof info
// bit 4 : mjpg d sof /decode done
if(g_unMP4HW_RunMode==CONFERENCE_MODE)
{
while ((*P_MPEG4_COMPRESS_CTRL & 0x10) != 0);
}
}
void mp4_reset(void)
{
unsigned int i;
*P_MPEG4_CLK_CONF = 0x00000003; //RESET MP4
for(i=0;i<20;i++); //delay
*P_MPEG4_CLK_CONF = 0x00000007; //close MP4 RESET
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -