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

📄 caviparser.cpp

📁 最近在学习directshow, Directshow实务精选的源代码
💻 CPP
字号:
//
// CAviParser.cpp
//

/*-----------------------------------------------------*\
			HQ Tech, Make Technology Easy!       
 More information, please go to http://hqtech.nease.net.
/*-----------------------------------------------------*/

#include "stdafx.h"
#include "CAviParser.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
CAviParser::CAviParser() : m_pos(0), m_len(0), 
m_idx1(NULL), m_pFile(NULL), m_idx1Pos(0)
{
	m_strm.strf = NULL;  // Init
	m_strm.indx = NULL;
}

CAviParser::~CAviParser()
{
	Release();
}

void CAviParser::Release(void)
{
	if (m_strm.strf)
	{
		delete[] m_strm.strf;
		m_strm.strf = NULL;
	}
	if (m_strm.indx)
	{
		delete[] m_strm.indx;
		m_strm.indx = NULL;
	}
	if (m_idx1)
	{
		delete[] m_idx1;
		m_idx1 = NULL;
	}
	if (m_pFile)
	{
		fclose(m_pFile);
		m_pFile = NULL;
	}
}

HRESULT CAviParser::Read(void* pData, LONG len)
{
	if (fseek(m_pFile, (long) m_pos, SEEK_SET) == 0)
	{
		fread(pData, sizeof(char), len, m_pFile);
		m_pos += len;
		return S_OK;
	}
	return E_FAIL;
}

BOOL CAviParser::SetAviFile(const char * inFile)
{
	Release();

	strcpy(mFileName, inFile);
	m_pFile = fopen(inFile, "rb");
	if (m_pFile)
	{
		fseek(m_pFile, 0, SEEK_END);
		m_len = ftell(m_pFile);
		return TRUE;
	}
	return FALSE;
}

BOOL CAviParser::Parse(void)
{
	Seek(0);
	DWORD dw[3];
	if (S_OK != TRead(dw) || dw[0] != FCC('RIFF') || 
		(dw[2] != FCC('AVI ') && dw[2] != FCC('AVIX')))
	{
		return E_FAIL;
	}

	Seek(0);
	HRESULT hr = Parse(0, GetLength());
	return SUCCEEDED(hr);
}

HRESULT CAviParser::Parse(DWORD parentid, UINT64 end)
{
	HRESULT hr = S_OK;

	while (S_OK == hr && GetPos() < end)
	{
		UINT64 pos = GetPos();

		DWORD id = 0, size;
		if (S_OK != TRead(id) || id == 0)
			return E_FAIL;

		if (id == FCC('RIFF') || id == FCC('LIST'))
		{
			if (S_OK != TRead(size) || S_OK != TRead(id))
				return E_FAIL;

			size += (size&1) + 8;

			TRACE(_T("CAviParser::Parse(..): LIST '%c%c%c%c'\n"), 
				TCHAR((id>>0)&0xff), 
				TCHAR((id>>8)&0xff), 
				TCHAR((id>>16)&0xff),
				TCHAR((id>>24)&0xff));

			if (id == FCC('movi'))
			{
				TRACE(_T("\nMovie LIST...\n"));
			}
			else
			{
				hr = Parse(id, pos + size);
			}
		}
		else
		{
			if (S_OK != TRead(size))
				return E_FAIL;

			TRACE(_T("CAviParser::Parse(..): '%c%c%c%c'\n"), 
				TCHAR((id>>0)&0xff), 
				TCHAR((id>>8)&0xff), 
				TCHAR((id>>16)&0xff),
				TCHAR((id>>24)&0xff));

			if (parentid == FCC('INFO') && size > 0)
			{
				switch(id)
				{
				case FCC('IARL'): 
				case FCC('IART'): 
				case FCC('ICMS'): 
				case FCC('ICMT'): 
				case FCC('ICOP'): 
				case FCC('ICRD'): 
				case FCC('ICRP'): 
				case FCC('IDIM'): 
				case FCC('IDPI'): 
				case FCC('IENG'): 
				case FCC('IGNR'): 
				case FCC('IKEY'): 
				case FCC('ILGT'): 
				case FCC('IMED'): 
				case FCC('INAM'): 
				case FCC('IPLT'): 
				case FCC('IPRD'): 
				case FCC('ISBJ'): 
				case FCC('ISFT'): 
				case FCC('ISHP'): 
				case FCC('ISRC'): 
				case FCC('ISRF'): 
				case FCC('ITCH'): 
					{
						CString str;
						if (S_OK != Read(str.GetBufferSetLength(size), size)) 
						{
							return E_FAIL;
						}
						break;
					}
				}
			}

			switch (id)
			{
			case FCC('avih'):   // avi main header
				m_avih.fcc = FCC('avih');
				m_avih.cb  = size;
				if (S_OK != Read((BYTE*)&m_avih + 8, size)) 
				{
					return E_FAIL;
				}
				break;

			case FCC('strh'):   // stream header
				m_strm.strh.fcc = FCC('strh');
				m_strm.strh.cb  = size;
				if (S_OK != Read((BYTE*)&m_strm.strh + 8, size))
				{
					return E_FAIL;
				}
				break;

			case FCC('strn'):   // stream name
				if (S_OK != Read(m_strm.strn.GetBufferSetLength(size), size)) 
				{
					return E_FAIL;
				}
				break;

			case FCC('strf'):   // stream format
				if (m_strm.strf)
				{
					delete[] m_strm.strf;
					m_strm.strf = NULL;
				}
				m_strm.strf = new BYTE[size];
				if (S_OK != Read(m_strm.strf, size)) 
				{
					return E_FAIL;
				}
				break;

			case FCC('indx'):   // stream index
				if (!m_strm.indx)
				{
					m_strm.indx = (AVISUPERINDEX*) new BYTE[size + 8];
				}
				m_strm.indx->fcc = FCC('indx');
				m_strm.indx->cb  = size;
				if (S_OK != Read((BYTE*)(AVISUPERINDEX*)m_strm.indx + 8, size)) 
				{
					return E_FAIL;
				}
				ASSERT(m_strm.indx->wLongsPerEntry == 4 && 
					m_strm.indx->bIndexType == AVI_INDEX_OF_INDEXES);
				break;

			case FCC('dmlh'):
				if (S_OK != TRead(m_dmlh)) 
				{
					return E_FAIL;
				}
				break;

			case FCC('vprp'):
			//	if (S_OK != TRead(m_vprp)) return E_FAIL;
				break;

			case FCC('idx1'):    // Optional index
				ASSERT(m_idx1 == NULL);
				m_idx1 = (AVIOLDINDEX*) new BYTE[size + 8];
				m_idx1->fcc = FCC('idx1');
				m_idx1->cb  = size;
				// Save the offset of this index,
				// including the initial 8 bytes
				m_idx1Pos   = m_pos - 8; 
				if (S_OK != Read((BYTE*)(AVIOLDINDEX*)m_idx1 + 8, size)) 
				{
					return E_FAIL;
				}
				break;
			}

			size += (size&1) + 8;
		}

		Seek(pos + size);
	}

	return hr;
}

⌨️ 快捷键说明

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