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

📄 atomparse.cpp

📁 mpeg4 demux 代码
💻 CPP
字号:
/* <LIC_AMD_STD>
 * Copyright (C) 2003-2005 Advanced Micro Devices, Inc.  All Rights Reserved.
 *
 * Unless otherwise designated in writing, this software and any related
 * documentation are the confidential proprietary information of AMD.
 * THESE MATERIALS ARE PROVIDED "AS IS" WITHOUT ANY
 * UNLESS OTHERWISE NOTED IN WRITING, EXPRESS OR IMPLIED WARRANTY OF ANY
 * KIND, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY,
 * NONINFRINGEMENT, TITLE, FITNESS FOR ANY PARTICULAR PURPOSE AND IN NO
 * EVENT SHALL AMD OR ITS LICENSORS BE LIABLE FOR ANY DAMAGES WHATSOEVER.
 *
 * AMD does not assume any responsibility for any errors which may appear
 * in the Materials nor any responsibility to support or update the
 * Materials.  AMD retains the right to modify the Materials at any time,
 * without notice, and is not obligated to provide such modified
 * Materials to you. AMD is not obligated to furnish, support, or make
 * any further information available to you.
 * </LIC_AMD_STD>  */
/* <CTL_AMD_STD>
 * </CTL_AMD_STD>  */
/* <DOC_AMD_STD>
 * </DOC_AMD_STD>  */

#include "atomparse.h"
#include "mp4parse.h"


void CBox::ReadData(Byte_Stream &input_stream)
{
	size = input_stream.GetUINT();
	if (size==1) {
		  largesize = input_stream.GetUINT();
		   largesize <<= 32;
			largesize |= input_stream.GetUINT();
	   } else if (size==0) {
		  // box extends to end of file
	}
	   type = input_stream.GetUINT();

}

void CFullBox::ReadData(Byte_Stream &input_stream)
{
	UINT temp;

	version	= input_stream.GetByte();
	//BitField(temp,0,8);
	temp = input_stream.PeekUINT();
	flags	= BitField(temp,8,24);
	input_stream.Advance(3);
}

void CMediaDataBox::ReadData(Byte_Stream &input_stream,m_u32 size)
{
		data = (m_u8 *) malloc(size * sizeof(m_u8));
		if(data)
			memcpy(data,input_stream.GetBytePointer(),size);
}


void CMovieHeaderBox::ReadData(Byte_Stream &input_stream)
{
	int i;
	CFullBox::ReadData(input_stream);

	if (version==1) { // TODO: 64-bit values
			creation_time = input_stream.GetUINT();
			creation_time <<= 32;
			creation_time |= input_stream.GetUINT();
			modification_time = input_stream.GetUINT();
			modification_time <<= 32;
			modification_time |= input_stream.GetUINT();
			timescale = input_stream.GetUINT();
			duration = input_stream.GetUINT();
			duration <<= 32;
			duration |= input_stream.GetUINT();
	} else { // version==0, 32-bit vars
			creation_time = input_stream.GetUINT();
			modification_time = input_stream.GetUINT();
			timescale = input_stream.GetUINT();
			duration = input_stream.GetUINT();
	}
	rate = input_stream.GetUINT(); // typically 1.0
	volume = input_stream.GetWORD(); // typically, full volume
	reserved = input_stream.GetWORD(); // 0
	reservedar[0] = input_stream.GetUINT();
	reservedar[1] = input_stream.GetUINT();
		//template int(32)[9] matrix =
		//{ 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 };
		// Unity matrix
	for(i=0;i<9;i++)
		matirx[i] = input_stream.GetUINT();
	for(i=0;i<6;i++)
		pre_defined[i] = input_stream.GetUINT();;
	next_track_ID = input_stream.GetUINT();
}

void CTrackHeaderBox::ReadData(Byte_Stream &input_stream,long Len)
{
		int i;
		CFullBox::ReadData(input_stream);
		if(flags == 0) { // disabled track
			input_stream.Advance(Len - 4);
			return;
		}

		if (version==1) { // TODO: 64-bit values
			creation_time = input_stream.GetUINT();
			creation_time <<= 32;
			creation_time |= input_stream.GetUINT();
			modification_time = input_stream.GetUINT();
			modification_time <<= 32;
			modification_time |= input_stream.GetUINT();

			track_ID = input_stream.GetUINT();
			reserved = input_stream.GetUINT();
			duration = input_stream.GetUINT();
			duration <<= 32;
			duration |= input_stream.GetUINT();
		} else { // version==0, 32-bit vars
			creation_time = input_stream.GetUINT();
			modification_time = input_stream.GetUINT();
			track_ID = input_stream.GetUINT();
			reserved = input_stream.GetUINT();
			duration = input_stream.GetUINT();
		}
		reservedar[0] = input_stream.GetUINT();
		reservedar[1] = input_stream.GetUINT();
		layer = input_stream.GetWORD();
		alternate_group = input_stream.GetWORD();
		volume = input_stream.GetWORD(); // {if track_is_audio 0x0100 else 0};
		reserved1 = input_stream.GetWORD();
		for(i=0;i<9;i++)
			matirx[i] = input_stream.GetUINT();
		//matrix [9] =
		//{ 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 };
		// unity matrix
		width = input_stream.GetUINT();
		height = input_stream.GetUINT();
}

void CMediaHeaderBox::ReadData(Byte_Stream &input_stream)
{
		UINT temp =0;
		CFullBox::ReadData(input_stream);
		if (version==1) { // TODO: 64-bit values
			creation_time = input_stream.GetUINT();
			modification_time = input_stream.GetUINT();
			timescale = input_stream.GetUINT();
			duration = input_stream.GetUINT();
		} else { // version==0, 32-bit vars
			creation_time = input_stream.GetUINT();
			modification_time = input_stream.GetUINT();
			timescale = input_stream.GetUINT();
			duration = input_stream.GetUINT();
		}
		temp = input_stream.GetWORD();
		pad = BitField(temp,15,1);
		//TODO:
		//for(i=0;i<3;i++)
		//	language[i] = BitField(temp,i*5+1,5); // ISO-639-2/T language code
		pre_defined = input_stream.GetWORD();
}

void CHandlerBox::ReadData(Byte_Stream &input_stream,long len)
{
		int i;

		CFullBox::ReadData(input_stream);
		pre_defined  = input_stream.GetUINT();
		handler_type = input_stream.GetUINT(); /*?vide?Video track
												?soun?Audio track
												?hint?Hint track
												 */
		for(i=0;i<3;i++)
			reserved[i] = input_stream.GetUINT();
		//strncpy(name, (const char *)input_stream.GetBytePointer(),9);
		//i = strlen(name);
		len -= 24; // parsed 24 bytes
		if(len > 0) // skip remaining bytes
			input_stream.Advance(len);
}
m_u32 CHandlerBox::GetHandlerType()
{
	return handler_type;
}


void CDataReferenceBox::ReadData(Byte_Stream &input_stream, long Len)
{
		int i;
		CFullBox::ReadData(input_stream);
		entry_count = input_stream.GetUINT();
		//data_entry_list = (CDataEntryUrnBox *) malloc(sizeof(m_u32)*entry_count);
		for (i=0; i < entry_count; i++)
		{
			data_entry_list = new CDataEntryUrnBox(size,input_stream);
		};
}


void CTimeToSampleBox::ReadData(Byte_Stream &input_stream)
{
		int i;
		CFullBox::ReadData(input_stream);
		entry_count = input_stream.GetUINT();
		sample_count_list = (m_u32 *) malloc(sizeof(m_u32)*entry_count);
		sample_delta_list = (m_u32 *) malloc(sizeof(m_u32)*entry_count);
		for (i=0; i < entry_count; i++) {
			 sample_count_list[i] = input_stream.GetUINT();
			 sample_delta_list[i] = input_stream.GetUINT();
		}
}


void CCompositionOffsetBox::ReadData(Byte_Stream &input_stream)
{
		int i;
		CFullBox::ReadData(input_stream);
		entry_count = input_stream.GetUINT();
		sample_count_list = (m_u32 *) malloc(sizeof(m_u32)*entry_count);
		sample_offset_list = (m_u32 *) malloc(sizeof(m_u32)*entry_count);
		for (i=0; i < entry_count; i++) {
			 sample_count_list[i] = input_stream.GetUINT();
			 sample_offset_list[i] = input_stream.GetUINT();
		}
}
void CSampleEntry::ReadData(Byte_Stream &input_stream)
{
		CBox::ReadData(input_stream);
		input_stream.Advance(6);
		data_reference_index = input_stream.GetWORD();
}
void CVisualSampleEntry::ReadData(Byte_Stream &input_stream)
{
	CSampleEntry::ReadData(input_stream);
	pre_defined = input_stream.GetWORD() ;
	reserved = input_stream.GetWORD() ;
	pre_defined_list[0] = input_stream.GetUINT();
	pre_defined_list[1] = input_stream.GetUINT();
	pre_defined_list[2] = input_stream.GetUINT();
	width = input_stream.GetWORD() ;
	height = input_stream.GetWORD() ;
	horizresolution = input_stream.GetUINT();// template 0x00480000; // 72 dpi
	vertresolution  = input_stream.GetUINT();//template 0x00480000; // 72 dpi
	reserved1 = input_stream.GetUINT(); // const ?
	pre_defined  = input_stream.GetWORD() ; //1;
	memcpy(compressorname,input_stream.GetBytePointer(),32); // ?? string [32]
	input_stream.Advance(32);
	depth = input_stream.GetWORD() ; //template 0x0018;
	pre_defined1 = input_stream.GetWORD() ; //-1;
	if(!input_stream.EndOfStream())
	{
		long Len=0;
		unsigned int mid;
		Len = input_stream.GetUINT();
		mid = input_stream.GetUINT();
		if(mid == FOURCC('e','s','d','s') )
		{
			// TODO:parse ESD
			lConfigDataLen = Len - 8;
			pVideoDecConfigData = (m_u8 *) malloc(sizeof(m_u8)*lConfigDataLen);
			memcpy(pVideoDecConfigData,input_stream.GetBytePointer(),lConfigDataLen);
			input_stream.Advance(lConfigDataLen);
		}
		else
			input_stream.Retreat(8);

	}

}

// Audio Sequences

void CAudioSampleEntry::ReadData(Byte_Stream &input_stream)
{
	CSampleEntry::ReadData(input_stream);
	reserved[0] =  input_stream.GetUINT(); // 0
	reserved[1] =  input_stream.GetUINT();
	channelcount = input_stream.GetWORD() ;// template 2;
	samplesize = input_stream.GetWORD() ;// template 16;
	pre_defined = input_stream.GetWORD() ;// 0;
	reserved1= input_stream.GetWORD() ;//const 0
	//samplerate = input_stream.GetUINT(); //{timescale of media}<<16;
	samplerate = input_stream.GetWORD();
	input_stream.Advance(2);
#if 0
	if(!input_stream.EndOfStream())
	{
		long Len=0;
		unsigned int mid;
		Len = input_stream.GetUINT();
		mid = input_stream.GetUINT();
		if(mid == FOURCC('e','s','d','s') )
		{
			// TODO:parse ESD
			//ES.ReadData(input_stream);
		}
		else
			input_stream.Retreat(8);

	}
#endif

}

void CMP4AudioSampleEntry::ReadData(Byte_Stream &input_stream)
{
		CAudioSampleEntry::ReadData(input_stream);

		// TODO:parse ESD
		//ES.ReadData(input_stream);
}

void CSampleDescriptionBox::ReadData(Byte_Stream &input_stream,m_u32 index,m_bool bMP4File)
{	int i ;
		CFullBox::ReadData(input_stream);
		entry_count=  input_stream.GetUINT();
		for (i = 0 ; i < entry_count ; i++)
		{
		switch (index){
			case AUDIO: // for audio tracks
				AudioSampleEntry(input_stream);
				input_stream.Advance(size-44-8);
			break;
			case VIDEO: // for video tracks
				VisualSampleEntry(input_stream);
			break;
			case HINT: // Hint track, ignore for local file playback
			//HintSampleEntbry();
			break;
		}
		}
}


void CSampleSizeBox::ReadData(Byte_Stream &input_stream)
	{	int i ;
		CFullBox::ReadData(input_stream);
		sample_size = input_stream.GetUINT();
		sample_count = input_stream.GetUINT();
		if (sample_size==0)
		{
			entry_size_list = (m_u32 *) malloc(sizeof(m_u32)*sample_count);
			for (i=0; i < sample_count; i++) {
				entry_size_list[i]  = input_stream.GetUINT();
			}
		}
}

m_u32 CSampleSizeBox::GetSampleCount()
{
	return sample_count;
}
m_u32 CSampleSizeBox::GetSampleSize()
{
	return sample_size;
}
m_u32 CSampleSizeBox::GetEntrySize(m_u32 index)
{
	return entry_size_list[index];
}


void CSampleToChunkBox::ReadData(Byte_Stream &input_stream)
{	int i ;
		CFullBox::ReadData(input_stream);
		entry_count = input_stream.GetUINT();
		if(entry_count >= 0)
		{
			first_chunk_list = (m_u32 *) malloc(sizeof(m_u32)*entry_count );
			samples_per_chunk_list = (m_u32 *) malloc(sizeof(m_u32)*entry_count );
			sample_description_index_list = (m_u32 *) malloc(sizeof(m_u32)*entry_count );
			for (i=0; i < entry_count; i++)
			{
				first_chunk_list[i]					= input_stream.GetUINT();
				samples_per_chunk_list[i]			= input_stream.GetUINT();
				sample_description_index_list[i]	= input_stream.GetUINT();
			}
		}
}

m_u32 CSampleToChunkBox::GetEntryCount()
{
	return entry_count;
}

m_u32 CSampleToChunkBox::Getfirst_chunk(m_u32 index)
{
	return first_chunk_list[index];
}
m_u32 CSampleToChunkBox::Getsamples_per_chunk(m_u32 index)
{
	return samples_per_chunk_list[index];
}
m_u32 CSampleToChunkBox::Getsample_description_index(m_u32 index)
{
	return sample_description_index_list[index];
}

void CChunkOffsetBox::ReadData(Byte_Stream &input_stream)
{
	int i ;
	CFullBox::ReadData(input_stream);
	entry_count = input_stream.GetUINT();
	chunk_offset_list = (m_u32 *) malloc(sizeof(m_u32)*entry_count);
	for (i=0; i < entry_count; i++) {
		chunk_offset_list[i] = input_stream.GetUINT();
	}
}

m_u32 CChunkOffsetBox::GetEntryCount()
{
	return entry_count;
}

m_u32 CChunkOffsetBox::GetChunk_offset(m_u32 index)
{
	return chunk_offset_list[index];
}

⌨️ 快捷键说明

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