📄 caviparser.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 + -