138 lines
3.8 KiB
C++
138 lines
3.8 KiB
C++
#include <avifile/moviehdr.hpp>
|
|
#include <avifile/lstchnk.hpp>
|
|
#include <avifile/subchnk.hpp>
|
|
#include <avifile/junkhdr.hpp>
|
|
|
|
bool AVIMovieHeader::read(File &inFile)
|
|
{
|
|
String audioDataChunkID("wb");
|
|
String compressedDIBChunkID("dc");
|
|
String uncompressedDIBChunkID("db");
|
|
String ivChunkID("iv");
|
|
String ixChunkID("ix");
|
|
String movieHeaderLiteral("xxxx");
|
|
String movieHeader;
|
|
String movieStream;
|
|
DWORD byteCount;
|
|
|
|
remove();
|
|
while(TRUE)
|
|
{
|
|
movieHeader.reserve(movieHeaderLiteral.length()+1);
|
|
inFile.read(movieHeader,movieHeaderLiteral.length());
|
|
movieHeader=movieHeader.extractAlpha();
|
|
movieStream=movieHeader.extractDigits();
|
|
if(audioDataChunkID==movieHeader)
|
|
{
|
|
MovieData movieData;
|
|
inFile.read(byteCount);
|
|
if(byteCount%2)byteCount++;
|
|
movieData.dataType(MovieData::Audio);
|
|
movieData.streamNumber(movieStream.toInt());
|
|
movieData.size(byteCount);
|
|
inFile.read((char*)((BYTE HUGE*)&movieData[0]),movieData.size());
|
|
insert(&movieData);
|
|
}
|
|
else if(compressedDIBChunkID==movieHeader)
|
|
{
|
|
MovieData movieData;
|
|
inFile.read(byteCount);
|
|
if(byteCount%2)byteCount++;
|
|
movieData.dataType(MovieData::DIBCompressed);
|
|
movieData.streamNumber(movieStream.toInt());
|
|
movieData.size(byteCount);
|
|
inFile.read((char*)((BYTE HUGE*)&movieData[0]),movieData.size());
|
|
insert(&movieData);
|
|
}
|
|
else if(uncompressedDIBChunkID==movieHeader)
|
|
{
|
|
MovieData movieData;
|
|
inFile.read(byteCount);
|
|
if(byteCount%2)byteCount++;
|
|
movieData.dataType(MovieData::DIBUnCompressed);
|
|
movieData.streamNumber(movieStream.toInt());
|
|
movieData.size(byteCount);
|
|
inFile.read((char*)((BYTE HUGE*)&movieData[0]),movieData.size());
|
|
insert(&movieData);
|
|
}
|
|
else if(ivChunkID==movieHeader)
|
|
{
|
|
MovieData movieData;
|
|
inFile.read(byteCount);
|
|
if(byteCount%2)byteCount++;
|
|
movieData.dataType(MovieData::IV);
|
|
movieData.streamNumber(movieStream.toInt());
|
|
movieData.size(byteCount);
|
|
inFile.read((char*)((BYTE HUGE*)&movieData[0]),movieData.size());
|
|
insert(&movieData);
|
|
}
|
|
else if(ixChunkID==movieHeader)
|
|
{
|
|
DWORD sizeHeader;
|
|
inFile.read(sizeHeader);
|
|
inFile+=sizeHeader;
|
|
}
|
|
else
|
|
{
|
|
AVIJunkHeader aviJunkHeader;
|
|
AVIListChunk aviListChunk;
|
|
|
|
inFile-=movieHeaderLiteral.length();
|
|
if(aviJunkHeader.read(inFile))continue;
|
|
else if(aviListChunk.read(inFile)&&AVIListChunk::Record==aviListChunk.chunkType())continue;
|
|
else break;
|
|
}
|
|
}
|
|
AVISubChunk aviSubChunk;
|
|
aviSubChunk.read(inFile);
|
|
if(AVISubChunk::Index==aviSubChunk.chunkType())
|
|
{
|
|
IndexChunk indexChunk;
|
|
inFile+=4;
|
|
for(short itemIndex=0;itemIndex<size();itemIndex++)indexChunk.read(inFile);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool AVIMovieHeader::write(File &outFile)
|
|
{
|
|
String streamHeader;
|
|
DWORD byteCount;
|
|
|
|
for(int index=0;index<size();index++)
|
|
{
|
|
MovieData &movieData=operator[](index);
|
|
switch(movieData.dataType())
|
|
{
|
|
case MovieData::Audio :
|
|
::sprintf(streamHeader,"%02dwb",movieData.streamNumber());
|
|
outFile.write(streamHeader);
|
|
outFile.write(movieData.size());
|
|
outFile.write((char*)&movieData[0],movieData.size());
|
|
break;
|
|
case MovieData::DIBCompressed :
|
|
::sprintf(streamHeader,"%02ddc",movieData.streamNumber());
|
|
outFile.write(streamHeader);
|
|
outFile.write(movieData.size());
|
|
outFile.write((char*)&movieData[0],movieData.size());
|
|
break;
|
|
case MovieData::DIBUnCompressed :
|
|
::sprintf(streamHeader,"%02ddb",movieData.streamNumber());
|
|
outFile.write(streamHeader);
|
|
outFile.write(movieData.size());
|
|
outFile.write((char*)&movieData[0],movieData.size());
|
|
break;
|
|
case MovieData::IV :
|
|
::sprintf(streamHeader,"%02div",movieData.streamNumber());
|
|
outFile.write(streamHeader);
|
|
outFile.write(movieData.size());
|
|
outFile.write((char*)&movieData[0],movieData.size());
|
|
break;
|
|
case MovieData::Unknown :
|
|
break;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|