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

📄 vsparser.c

📁 s3c6400 ADS下官方测试程序
💻 C
字号:

#include "vsparser.h"

//---------------------------------------------------------
// Function Name : bool Vsparser(MFC_CODEC_MODE eDecType, u32  uBufferStartAddr, u32 uBufferByteSize, bool bIsHeader,  //inputs
// u32 * puFrameStartAddr, u32 *puFrameSize, u32* puNumOfFrames) //outputs
//
// Function Description :
// This function parses H.264, H.263, MPEG4 and  VC-1  streams and returns the physical start address and size of  1 frame.
//
//
// Input : None
// Output : 
//---------------------------------------------------------
bool Vsparser(MFC_CODEC_MODE eDecType, u32  uBufferStartAddr, u32 uBufferByteSize, bool bIsHeader,  //inputs
	u32 * puFrameStartAddr, u32 *puFrameSize, u32* puNumOfFrames, bool* bIsMpeg4ShortHeader) //outputs
{
	
	u32 i;
	u32	uTemp32;
	u8 *pucSrcMem;
	bool bIsFrameCorrect;
	
	switch(eDecType)
	{
		case VC1_DEC:	
			
			//  VC-1 stream file parsing: Begin
			//=============================================================================================
		 	pucSrcMem = (u8*) uBufferStartAddr;
			*puFrameStartAddr = uBufferStartAddr;
			if(bIsHeader == true)
			{
				//Inp32(pucSrcMem, uTemp32);
				uTemp32 = Inp32(pucSrcMem);
		 		
		 		if ( ((uTemp32 >>24 ) &0x000000ff) != (u32) 0x000000C5)
		 		{
					Disp(" This file is not VC-1 stream file! Choose *.rcv file \n");
					return false;
		 		}
				uTemp32 = uTemp32 & 0x00ffffff; 		 // lower 24 bit is the number of frames
				Disp(" This file has %d frames \n", uTemp32);
 				*puFrameSize = 9*4; 					// Vc-1 Sequence Header meta data  has 9* 4 byte length.
				*puNumOfFrames = uTemp32;
				if(*puFrameSize > uBufferByteSize)
				{
					return false;
				}
				return true;
			}
			else
			{
				uTemp32 = Inp32Not4ByteAlign((u32) pucSrcMem);
				Assert( ( (uTemp32 & 0xff000000) == 0x80000000) ||  ((uTemp32 & 0xff000000) == 0x00000000));
				uTemp32 = uTemp32 & 0x00ffffff;
				*puFrameSize = 2*4+uTemp32; // Vc-1 Frame Layer header  has 2* 4 byte length.
				if(*puFrameSize > uBufferByteSize)
				{
					return false;
				}
				return true;
			}
	
			case AVC_DEC:
	
				break;
	
			case MP4_DEC:
	
				//  MPEG4  stream file parsing: Begin
				//=============================================================================================
		
			 	pucSrcMem = (u8*) uBufferStartAddr;
				if(bIsHeader == true)
				{
					*puFrameStartAddr = (u32) pucSrcMem;
					//Inp32(pucSrcMem, uTemp32); //FPGA
					uTemp32 = Inp32(pucSrcMem); //SMDK
					uTemp32 = ((uTemp32 &0xff) <<24)
							|(((uTemp32 >>8) &0xff) <<16)
							|(((uTemp32 >>16) &0xff) <<8)
							|((uTemp32 >>24) &0xff);
					uTemp32 = uTemp32 & 0xfffffc00;
					if(uTemp32 != 0x00008000)  // not short header
					{
						*bIsMpeg4ShortHeader = false;
						// find start_code 0x000001		
						for(i= 1; i < uBufferByteSize - *puFrameStartAddr + uBufferStartAddr ;i++)
						{
						if ( (*(pucSrcMem)  ==  0x00) && (*(pucSrcMem+1)  ==  0x00)&& (*(pucSrcMem+2)  ==  0x01)&& (*(pucSrcMem+3)  ==  0xb6)) 
							{ 
							*puFrameSize = (u32) (pucSrcMem) -  (u32) (*puFrameStartAddr);
							return true;
							}					
						pucSrcMem++;
						}
					}
					else 
					{
						*bIsMpeg4ShortHeader = true;
						// find short_header 22'b0000_0000_0000_00000_1000_00		
						for(i= 1; i < uBufferByteSize;i++)
						{
						if ( (*(pucSrcMem)  ==  0x00) && (*(pucSrcMem+1)  ==  0x00)&& ((*(pucSrcMem+2)&0xfc)  ==  0x80)) 
						{ 
							*puFrameStartAddr = (u32) pucSrcMem;
							pucSrcMem++;
							break;
						}
						pucSrcMem++;
						}
						for(i= 1; i < uBufferByteSize - *puFrameStartAddr + uBufferStartAddr ;i++)
						{
							if ( (*(pucSrcMem)  ==  0x00) && (*(pucSrcMem+1)  ==  0x00)&& ((*(pucSrcMem+2)&0xfc)  ==  0x80)) 
							{ 
								*puFrameSize = (u32) pucSrcMem - *puFrameStartAddr;
								return true;
							}					
						pucSrcMem++;
						}
					}
					return false;
				}
				else   
				{
					bIsFrameCorrect = false;
					if(* bIsMpeg4ShortHeader == false)
					{
						// find start_code 0x000001		
						for(i= 1; i < uBufferByteSize;i++)
						{
							if ( (*(pucSrcMem)  ==  0x00) && (*(pucSrcMem+1)  ==  0x00)&& (*(pucSrcMem+2)  ==  0x01)&& (*(pucSrcMem+3)  ==  0xb6)) 
							{ 
								*puFrameStartAddr = (u32) pucSrcMem;
								pucSrcMem++;
								break;
							}					
							pucSrcMem++;
						}
		
						for(i= 1; i < uBufferByteSize - *puFrameStartAddr + uBufferStartAddr ;i++)
						{
							if ( (*(pucSrcMem)  ==  0x00) && (*(pucSrcMem+1)  ==  0x00)&& (*(pucSrcMem+2)  ==  0x01)&& (*(pucSrcMem+3)  ==  0xb6)) 
							{ 
								*puFrameSize = (u32) pucSrcMem - *puFrameStartAddr;
								bIsFrameCorrect = true;
								break;
							}					
							pucSrcMem++;
						}
						return bIsFrameCorrect;
					}
					else 
					{
						// find short_header 22'b0000_0000_0000_00000_1000_00		
		
						for(i= 1; i < uBufferByteSize;i++)
						{
							if ( (*(pucSrcMem)  ==  0x00) && (*(pucSrcMem+1)  ==  0x00)&& ((*(pucSrcMem+2)&0xfc)  ==  0x80)) 
							{ 
								*puFrameStartAddr = (u32) pucSrcMem;
								pucSrcMem++;
								break;
							}
							pucSrcMem++;
						}
					
						for(i= 1; i < uBufferByteSize - *puFrameStartAddr + uBufferStartAddr ;i++)
						{
							if ( (*(pucSrcMem)  ==  0x00) && (*(pucSrcMem+1)  ==  0x00)&& ((*(pucSrcMem+2)&0xfc)  ==  0x80)) 
							{ 
								*puFrameSize = (u32) pucSrcMem -*puFrameStartAddr;
								bIsFrameCorrect = true;
								break;
							}					
							pucSrcMem++;
						}
						return bIsFrameCorrect;
					}
				}
				//=============================================================================================
				//  MPEG4 stream file parsing: End
		
			default:
				return	false;
	}
	
	return false;		
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -