⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mp4_decodeencodeapi.c

📁 凌阳SPCE3200 系统开发板随机自带源程序。共安排了32个子目录
💻 C
📖 第 1 页 / 共 2 页
字号:
    {
        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 + -