Files
Work/avifile/MOVIEHDR.CPP
2024-08-07 09:12:07 -04:00

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;
}