summaryrefslogtreecommitdiffstats
path: root/HBAviMuxer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'HBAviMuxer.cpp')
-rw-r--r--HBAviMuxer.cpp338
1 files changed, 0 insertions, 338 deletions
diff --git a/HBAviMuxer.cpp b/HBAviMuxer.cpp
deleted file mode 100644
index cbe2f9578..000000000
--- a/HBAviMuxer.cpp
+++ /dev/null
@@ -1,338 +0,0 @@
-/* $Id: HBAviMuxer.cpp,v 1.24 2003/08/26 18:44:06 titer Exp $ */
-
-#include "HBCommon.h"
-#include "HBAviMuxer.h"
-#include "HBManager.h"
-#include "HBFifo.h"
-
-#define AVIF_HASINDEX 0x10
-#define AVIIF_KEYFRAME 0x10
-
-HBAviMuxer::HBAviMuxer( HBManager * manager, HBTitleInfo * titleInfo,
- HBAudioInfo * audio1Info, HBAudioInfo * audio2Info,
- char * fileName )
- : HBThread( "avimuxer" )
-{
- fManager = manager;
- fTitleInfo = titleInfo;
- fAudio1Info = audio1Info;
- fAudio2Info = audio2Info;
- fFileName = strdup( fileName );
-
- fRiffBytesCount = 2040;
- fMoviBytesCount = 4;
-}
-
-void HBAviMuxer::DoWork()
-{
- /* Open the destination file */
- if( !( fFile = fopen( fFileName, "w" ) ) )
- {
- Log( "HBAviMuxer: fopen failed" );
- fManager->Error();
- return;
- }
-
- /* Initializations */
- memset( &fMainHeader, 0, sizeof( AviMainHeader ) );
- memset( &fVideoStreamHeader, 0, sizeof( AviStreamHeader ) );
- memset( &fAudio1StreamHeader, 0, sizeof( AviStreamHeader ) );
- memset( &fAudio2StreamHeader, 0, sizeof( AviStreamHeader ) );
- memset( &fVideoStreamFormat, 0, sizeof( BitmapInfo ) );
- memset( &fAudio1StreamFormat, 0, sizeof( WaveFormatEx ) );
- memset( &fAudio2StreamFormat, 0, sizeof( WaveFormatEx ) );
-
- /* Alloc an 1 MB index (to be realloced later if needed) */
- fIndex = new HBBuffer( 1024 * 1024 );
- sprintf( (char*) fIndex->fData, "idx1" );
- fIndex->fSize = 8;
-
- /* Main loop */
- int video, audio1, audio2;
- while( !fDie )
- {
- /* Find the most filled fifo */
- video = fTitleInfo->fMpeg4Fifo->Size();
- audio1 = ( !fAudio1Info->fId ) ? 0 : fAudio1Info->fMp3Fifo->Size();
- audio2 = ( !fAudio2Info->fId ) ? 0 : fAudio2Info->fMp3Fifo->Size();
-
- /* Nothing to get - wait a bit and try again */
- if( !video && !audio1 && !audio2 )
- {
- snooze( 10000 );
- continue;
- }
-
- /* Got something - mux it */
- if( video >= MAX( audio1, audio2 ) )
- {
- AddVideoChunk();
- }
- else if( audio1 >= audio2 )
- {
- AddAudioChunk( 1 );
- }
- else
- {
- AddAudioChunk( 2 );
- }
- }
-
- /* Write the index */
- uint32_t size = fIndex->fSize - 8;
- memcpy( fIndex->fData + 4, &size, 4 );
- fseek( fFile, 0, SEEK_END );
- fwrite( fIndex->fData, fIndex->fSize, 1, fFile );
-
- /* Update the headers */
- fRiffBytesCount += fIndex->fSize;
- fMainHeader.Flags |= AVIF_HASINDEX;
- UpdateMainHeader();
-
- delete fIndex;
-
- fclose( fFile );
-}
-
-bool HBAviMuxer::AddVideoChunk()
-{
- HBBuffer * buffer = fTitleInfo->fMpeg4Fifo->Pop();
- if( !buffer )
- {
- return false;
- }
-
- fRiffBytesCount += 8 + EVEN( buffer->fSize );
- fMoviBytesCount += 8 + EVEN( buffer->fSize );
-
- fMainHeader.MicroSecPerFrame = 1000000 * (uint64_t) fTitleInfo->fScale /
- fTitleInfo->fRate;
- fMainHeader.TotalFrames++;
- fMainHeader.Width = fTitleInfo->fOutWidth;
- fMainHeader.Height = fTitleInfo->fOutHeight;
-
- fVideoStreamHeader.FourCC = FOURCC( "strh" );
- fVideoStreamHeader.BytesCount = sizeof( AviStreamHeader ) - 8;
- fVideoStreamHeader.Type = FOURCC( "vids" );
- fVideoStreamHeader.Handler = FOURCC( "DIVX" );
- fVideoStreamHeader.Scale = fTitleInfo->fScale;
- fVideoStreamHeader.Rate = fTitleInfo->fRate;
- fVideoStreamHeader.Length++;
-
- fVideoStreamFormat.FourCC = FOURCC( "strf" );
- fVideoStreamFormat.BytesCount = sizeof( BitmapInfo ) - 8;
- fVideoStreamFormat.Size = sizeof( BitmapInfo ) - 8;
- fVideoStreamFormat.Width = fTitleInfo->fOutWidth;
- fVideoStreamFormat.Height = fTitleInfo->fOutHeight;
- fVideoStreamFormat.Planes = 1;
- fVideoStreamFormat.BitCount = 24;
- fVideoStreamFormat.Compression = FOURCC( "DIVX" );;
-
- UpdateMainHeader();
-
- fseek( fFile, 0, SEEK_END );
-
- /* Update the index */
- if( fIndex->fSize + 16 > fIndex->fAllocSize )
- {
- /* Realloc if needed */
- Log( "HBAviMuxer::AddVideoChunk() : reallocing index (%d -> %d MB)",
- fIndex->fAllocSize / ( 1024 * 1024 ),
- 1 + fIndex->fAllocSize / ( 1024 * 1024 ) );
- fIndex->ReAlloc( fIndex->fAllocSize + 1024 * 1024 );
- }
-
- uint32_t flags = buffer->fKeyFrame ? AVIIF_KEYFRAME : 0;
- uint32_t offset = ftell( fFile ) - 2044;
- sprintf( (char*)fIndex->fData + fIndex->fSize, "00dc" );
-
- memcpy( fIndex->fData + fIndex->fSize + 4, &flags, 4 );
- memcpy( fIndex->fData + fIndex->fSize + 8, &offset, 4 );
- memcpy( fIndex->fData + fIndex->fSize + 12, &buffer->fSize, 4 );
- fIndex->fSize += 16;
-
- /* Write the chunk */
- fwrite( "00dc", 4, 1, fFile );
- fwrite( &buffer->fSize, 4, 1, fFile );
- fwrite( buffer->fData, buffer->fSize, 1, fFile );
-
- /* Chunks must be 2-bytes aligned */
- if( buffer->fSize & 1 )
- {
- fputc( 0, fFile );
- }
-
- delete buffer;
-
- return true;
-}
-
-bool HBAviMuxer::AddAudioChunk( int which )
-{
- HBAudioInfo * info;
- AviStreamHeader * streamHeader;
- WaveFormatEx * streamFormat;
-
- if( which == 1 )
- {
- info = fAudio1Info;
- streamHeader = &fAudio1StreamHeader;
- streamFormat = &fAudio1StreamFormat;
- }
- else
- {
- info = fAudio2Info;
- streamHeader = &fAudio2StreamHeader;
- streamFormat = &fAudio2StreamFormat;
- }
-
- HBBuffer * buffer = info->fMp3Fifo->Pop();
- if( !buffer )
- {
- return false;
- }
-
- fRiffBytesCount += 8 + EVEN( buffer->fSize );
- fMoviBytesCount += 8 + EVEN( buffer->fSize );
-
- streamHeader->FourCC = FOURCC( "strh" );
- streamHeader->BytesCount = sizeof( AviStreamHeader ) - 8;
- streamHeader->Type = FOURCC( "auds" );
- streamHeader->InitialFrames = 1;
- streamHeader->Scale = 1152;
- streamHeader->Rate = info->fOutSampleRate;
- streamHeader->Length++;
- streamHeader->Quality = 0xFFFFFFFF;
-
-
- streamFormat->FourCC = FOURCC( "strf" );
- streamFormat->BytesCount = sizeof( WaveFormatEx ) - 8;
- streamFormat->FormatTag = 0x55;
- streamFormat->Channels = 2;
- streamFormat->SamplesPerSec = info->fOutSampleRate;
- streamFormat->AvgBytesPerSec = info->fOutBitrate * 1024 / 8;
- streamFormat->BlockAlign = 1152;
-
- /* stolen from libavformat/wav.c */
- streamFormat->Size = 12;
- streamFormat->Id = 1;
- streamFormat->Flags = 2;
- streamFormat->BlockSize = 1152;
- streamFormat->FramesPerBlock = 1;
- streamFormat->CodecDelay = 1393;
-
- UpdateMainHeader();
-
- fseek( fFile, 0, SEEK_END );
-
- /* Update the index */
- if( fIndex->fSize + 16 > fIndex->fAllocSize )
- {
- /* Realloc if needed */
- Log( "HBAviMuxer::AddAudioChunk() : reallocing index (%d -> %d MB)",
- fIndex->fAllocSize / ( 1024 * 1024 ),
- 1 + fIndex->fAllocSize / ( 1024 * 1024 ) );
- fIndex->ReAlloc( fIndex->fAllocSize + 1024 * 1024 );
- }
-
- uint32_t flags = buffer->fKeyFrame ? AVIIF_KEYFRAME : 0;
- uint32_t offset = ftell( fFile ) - 2044;
- sprintf( (char*)fIndex->fData + fIndex->fSize, "%02dwb", which );
-
- memcpy( fIndex->fData + fIndex->fSize + 4, &flags, 4 );
- memcpy( fIndex->fData + fIndex->fSize + 8, &offset, 4 );
- memcpy( fIndex->fData + fIndex->fSize + 12, &buffer->fSize, 4 );
- fIndex->fSize += 16;
-
- /* Write the chunk */
- fprintf( fFile, "%02dwb", which );
- fwrite( &buffer->fSize, 4, 1, fFile );
- fwrite( buffer->fData, buffer->fSize, 1, fFile );
-
- /* Chunks must be 2-bytes aligned */
- if( buffer->fSize & 1 )
- {
- fputc( 0, fFile );
- }
-
- delete buffer;
-
- return true;
-}
-
-void HBAviMuxer::UpdateMainHeader()
-{
- fMainHeader.FourCC = FOURCC( "avih" );
- fMainHeader.BytesCount = sizeof( AviMainHeader ) - 8;
- fMainHeader.Streams = 2;
-
- fHdrlBytesCount = 4 + sizeof( AviMainHeader )
- + 12 + sizeof( AviStreamHeader ) + sizeof( BitmapInfo );
-
- if( fAudio1Info->fId )
- {
- fHdrlBytesCount += 12 + sizeof( AviStreamHeader ) + sizeof( WaveFormatEx );
- }
- if( fAudio2Info->fId )
- {
- fHdrlBytesCount += 12 + sizeof( AviStreamHeader ) + sizeof( WaveFormatEx );
- }
-
- fseek( fFile, 0, SEEK_SET );
- fwrite( "RIFF", 4, 1, fFile );
- fwrite( &fRiffBytesCount, 4, 1, fFile );
- fwrite( "AVI ", 4, 1, fFile );
- fwrite( "LIST", 4, 1, fFile );
- fwrite( &fHdrlBytesCount, 4, 1, fFile );
- fwrite( "hdrl", 4, 1, fFile );
-
- fwrite( &fMainHeader, sizeof( AviMainHeader ), 1, fFile );
-
- int strlSize;
- strlSize = 4 + sizeof( AviStreamHeader ) + sizeof( BitmapInfo );
- fwrite( "LIST", 4, 1, fFile );
- fwrite( &strlSize, 4, 1, fFile );
- fwrite( "strl", 4, 1, fFile );
- fwrite( &fVideoStreamHeader, sizeof( AviStreamHeader ), 1, fFile );
- fwrite( &fVideoStreamFormat, sizeof( fVideoStreamFormat ), 1, fFile );
-
- if( fAudio1Info->fId )
- {
- strlSize = 4 + sizeof( AviStreamHeader ) + sizeof( WaveFormatEx );
- fwrite( "LIST", 4, 1, fFile );
- fwrite( &strlSize, 4, 1, fFile );
- fwrite( "strl", 4, 1, fFile );
- fwrite( &fAudio1StreamHeader, sizeof( AviStreamHeader ), 1, fFile );
- fwrite( &fAudio1StreamFormat, sizeof( WaveFormatEx ), 1, fFile );
- }
-
- if( fAudio2Info->fId )
- {
- strlSize = 4 + sizeof( AviStreamHeader ) + sizeof( WaveFormatEx );
- fwrite( "LIST", 4, 1, fFile );
- fwrite( &strlSize, 4, 1, fFile );
- fwrite( "strl", 4, 1, fFile );
- fwrite( &fAudio2StreamHeader, sizeof( AviStreamHeader ), 1, fFile );
- fwrite( &fAudio2StreamFormat, sizeof( WaveFormatEx ), 1, fFile );
- }
-
- /* a JUNK chunk to fill the free space.
- size = 2048 -/
- 12 ("RIFFxxxxAVI ") -
- 8 (hdrl's "LIS1Txxxx") -
- fHdrlBytesCount -
- 8 ("JUNKxxxx") -
- 12 ("LISTxxxxmovi) */
- int junkSize = 2008 - fHdrlBytesCount;
- fwrite( "JUNK", 4, 1, fFile );
- fwrite( &junkSize, 4, 1, fFile );
- for( uint32_t i = 0; i < 2008 - fHdrlBytesCount; i++ )
- {
- fputc( 0, fFile );
- }
-
- /* movi list */
- fwrite( "LIST", 4, 1, fFile );
- fwrite( &fMoviBytesCount, 4, 1, fFile );
- fwrite( "movi", 4, 1, fFile );
-}