diff -urN mp4alsRM20/src/AlsImf/ImfFileStream.cpp mp4alsRM20-shntool/src/AlsImf/ImfFileStream.cpp --- mp4alsRM20/src/AlsImf/ImfFileStream.cpp 2007-05-23 23:24:38.000000000 -0400 +++ mp4alsRM20-shntool/src/AlsImf/ImfFileStream.cpp 2008-02-19 17:17:18.000000000 -0500 @@ -150,16 +150,24 @@ } try { - // Open a file. - m_fp = FOPEN64( pFilename, "rb" ); - if ( m_fp == NULL ) throw E_OPEN_STREAM; - - // Seek to Offset. - if ( Offset != 0 ) { - if ( FSEEK64( m_fp, Offset, S_BEGIN ) != 0 ) throw E_SEEK_STREAM; - if ( FTELL64( m_fp ) != Offset ) throw E_SEEK_STREAM; + if (!strcmp(pFilename," ")) { + if (Offset != 0) + throw E_SEEK_STREAM; + m_fp = stdin; + m_Offset = Offset; + } + else { + // Open a file. + m_fp = FOPEN64( pFilename, "rb" ); + if ( m_fp == NULL ) throw E_OPEN_STREAM; + + // Seek to Offset. + if ( Offset != 0 ) { + if ( FSEEK64( m_fp, Offset, S_BEGIN ) != 0 ) throw E_SEEK_STREAM; + if ( FTELL64( m_fp ) != Offset ) throw E_SEEK_STREAM; + } + m_Offset = Offset; } - m_Offset = Offset; } catch( IMF_UINT32 ErrCode ) { // Clean up. @@ -296,24 +304,33 @@ } try { - // Open a file. - if ( Mode & FW_OPEN_EXISTING ) { - // Try to open an existing file. - m_fp = FOPEN64( pFilename, "r+b" ); + if (!strcmp(pFilename," ")) { + if (Offset != 0) + throw E_SEEK_STREAM; + m_fp = stdout; + m_Offset = Offset; + m_Mode = Mode; } - if ( m_fp == NULL ) { + else { + // Open a file. + if ( Mode & FW_OPEN_EXISTING ) { + // Try to open an existing file. + m_fp = FOPEN64( pFilename, "r+b" ); + } + if ( m_fp == NULL ) { // Create a new file. - m_fp = FOPEN64( pFilename, "wb" ); - if ( m_fp == NULL ) throw E_OPEN_STREAM; - } + m_fp = FOPEN64( pFilename, "wb" ); + if ( m_fp == NULL ) throw E_OPEN_STREAM; + } - // Seek to Offset. - if ( Offset != 0 ) { - if ( FSEEK64( m_fp, Offset, S_BEGIN ) != 0 ) throw E_SEEK_STREAM; - if ( FTELL64( m_fp ) != Offset ) throw E_SEEK_STREAM; + // Seek to Offset. + if ( Offset != 0 ) { + if ( FSEEK64( m_fp, Offset, S_BEGIN ) != 0 ) throw E_SEEK_STREAM; + if ( FTELL64( m_fp ) != Offset ) throw E_SEEK_STREAM; + } + m_Offset = Offset; + m_Mode = Mode; } - m_Offset = Offset; - m_Mode = Mode; } catch( IMF_UINT32 ErrCode ) { // Clean up. diff -urN mp4alsRM20/src/encoder.cpp mp4alsRM20-shntool/src/encoder.cpp --- mp4alsRM20/src/encoder.cpp 2007-07-15 21:05:32.000000000 -0400 +++ mp4alsRM20-shntool/src/encoder.cpp 2008-02-19 19:01:58.000000000 -0500 @@ -378,7 +378,7 @@ if ( RawAudio ) throw 0; // RAW // Try wave format - HeaderSize = GetWaveFormatPCM( fpInput, &wf, &Samples ); + HeaderSize = GetWaveFormatPCM( fpInput, &wf, &Samples, ainfo ); if ( HeaderSize >= 0 ) throw 1; // WAVE // Try aiff format @@ -402,9 +402,11 @@ FileType = static_cast( ft ); } - fseek(fpInput, 0L, SEEK_END); - FileLen = ftell(fpInput); - rewind(fpInput); + if (strcmp(ainfo->FileName," ")) { + fseek(fpInput, 0L, SEEK_END); + FileLen = ftell(fpInput); + rewind(fpInput); + } if ( ( FileType == 1 ) || ( FileType == 3 ) || ( FileType == 4 ) || ( FileType == 5 ) ) { @@ -426,6 +428,10 @@ // Invalid FormatTag return -1; } + + if (!strcmp(ainfo->FileName," ")) { + FileLen = HeaderSize + DataLen; + } } else if (FileType == 2) { @@ -516,7 +522,7 @@ /////////////////////////////////////////////////////////////////////////////////////////////////// // Generate and write header -ALS_INT64 CLpacEncoder::WriteHeader(ENCINFO *encinfo) +ALS_INT64 CLpacEncoder::WriteHeader(ENCINFO *encinfo,AUDIOINFO *ainfo) { BYTE audiotyp, tmp = 0; long i, j, rest; @@ -808,8 +814,13 @@ fseek( fpInput, HeaderSize, SEEK_CUR ); } else { // copy audio file header (if present) - fread( buff, 1, static_cast( HeaderSize ), fpInput ); - if ( fwrite( buff, 1, static_cast( HeaderSize ), fpOutput ) != static_cast( HeaderSize ) ) return ( frames = -2 ); + if (ainfo && !strcmp(ainfo->FileName," ")) { + if ( fwrite( ainfo->Header, 1, static_cast( HeaderSize ), fpOutput ) != static_cast( HeaderSize ) ) return ( frames = -2 ); + } + else { + fread( buff, 1, static_cast( HeaderSize ), fpInput ); + if ( fwrite( buff, 1, static_cast( HeaderSize ), fpOutput ) != static_cast( HeaderSize ) ) return ( frames = -2 ); + } } // get current position and write dummy bytes for trailer (if present) @@ -884,12 +895,12 @@ /////////////////////////////////////////////////////////////////////////////////////////////////// // Generate and write header, encoded audio, and trailing non-audio data -short CLpacEncoder::EncodeAll() +short CLpacEncoder::EncodeAll(AUDIOINFO *ainfo) { long f; ENCINFO encinfo; - if ((frames = WriteHeader(&encinfo)) < 0) + if ((frames = WriteHeader(&encinfo,ainfo)) < 0) return static_cast( frames ); for (f = 0; f < frames; f++) diff -urN mp4alsRM20/src/encoder.h mp4alsRM20-shntool/src/encoder.h --- mp4alsRM20/src/encoder.h 2007-07-15 21:04:06.000000000 -0400 +++ mp4alsRM20-shntool/src/encoder.h 2008-02-19 19:01:18.000000000 -0500 @@ -206,9 +206,9 @@ short SpecifyAudioInfo(AUDIOINFO *ainfo); short OpenOutputFile( const char *name, bool mp4, bool oafi ) { mp4file = mp4; oafi_flag = oafi; CloseOutput = ( OpenFileWriter( name, &fpOutput ) == 0 ); return CloseOutput ? 0 : 1; } short SetOutputFile( HALSSTREAM hStream, bool mp4, bool oafi ) { mp4file = mp4; oafi_flag = oafi; fpOutput = hStream; CloseOutput = false; return 0; } - ALS_INT64 WriteHeader(ENCINFO *encinfo); + ALS_INT64 WriteHeader(ENCINFO *encinfo, AUDIOINFO *ainfo = NULL); ALS_INT64 WriteTrailer(); - short EncodeAll(); + short EncodeAll(AUDIOINFO *ainfo = NULL); long SetFrameLength(long N); short SetOrder(short P); diff -urN mp4alsRM20/src/mp4als.cpp mp4alsRM20-shntool/src/mp4als.cpp --- mp4alsRM20/src/mp4als.cpp 2008-01-24 20:33:54.000000000 -0500 +++ mp4alsRM20-shntool/src/mp4als.cpp 2008-02-19 19:01:34.000000000 -0500 @@ -356,6 +356,7 @@ fprintf(stderr, "\nUnable to open file %s for reading!\n", infile); exit(1); } + ainfo.FileName = infile; // Raw input file if (encoder.SetRawAudio(CheckOption(argc, argv, "-R"))) @@ -556,7 +557,7 @@ // Encoding /////////////////////////////////////////////////////////////////////////////// if (!verbose) { - result = encoder.EncodeAll(); + result = encoder.EncodeAll(&ainfo); } else { @@ -564,7 +565,7 @@ ALS_INT64 frames, f; // Generate and write header - if ((frames = encoder.WriteHeader(&encinfo)) < 0) + if ((frames = encoder.WriteHeader(&encinfo,&ainfo)) < 0) result = (short)frames; if (frames < 1000) diff -urN mp4alsRM20/src/wave.cpp mp4alsRM20-shntool/src/wave.cpp --- mp4alsRM20/src/wave.cpp 2007-05-23 13:43:46.000000000 -0400 +++ mp4alsRM20-shntool/src/wave.cpp 2008-02-19 19:05:01.000000000 -0500 @@ -59,7 +59,7 @@ #include "wave.h" #include "stream.h" -ALS_INT64 GetWaveFormatPCM(HALSSTREAM wav, WAVEFORMATPCM *wf, ALS_INT64 *samples) +ALS_INT64 GetWaveFormatPCM(HALSSTREAM wav, WAVEFORMATPCM *wf, ALS_INT64 *samples, AUDIOINFO *ainfo) { char RiffChunkRef[4] = {'R', 'I', 'F', 'F'}; char WaveChunkRef[4] = {'W', 'A', 'V', 'E'}; @@ -67,63 +67,89 @@ char DataChunkRef[4] = {'d', 'a', 't', 'a'}; //char RiffChunk[4], WaveChunk[4], FormChunk[4], DataChunk[4]; - char RiffChunk[4], WaveChunk[4]; - char ChunkBuf[4]; + unsigned char *RiffChunk, *WaveChunk; + unsigned char *ChunkBuf; ALS_INT64 RiffLen, FormLen, DataLen, ChunkLen, ChunkLenSum, i; + int pos = 0; // Read file header // 'RIFF' + RiffChunk = ainfo->Header + pos; fread(RiffChunk, 1, 4, wav); + pos += 4; if (memcmp(RiffChunk, RiffChunkRef, 4) != 0) return(-1); - RiffLen = ReadULongLSBfirst(wav); + RiffLen = ReadULongLSBfirstBuf(wav,ainfo->Header + pos); + pos += 4; // 'WAVE' + WaveChunk = ainfo->Header + pos; fread(WaveChunk, 1, 4, wav); + pos += 4; if (memcmp(WaveChunk, WaveChunkRef, 4) != 0) return(-2); // 'fmt ' //fread(FormChunk, 1, 4, wav); ChunkLenSum = FormLen = 0; + ChunkBuf = ainfo->Header + pos; fread(ChunkBuf, 1, 4, wav); + pos += 4; while(memcmp(ChunkBuf, DataChunkRef, 4) != 0) { if (memcmp(ChunkBuf, FormChunkRef, 4) != 0) { //unknown chank befor fmt - ChunkLen = ReadULongLSBfirst(wav); - for(i=0;iHeader + pos); + pos += 4; + for(i=0;iHeader + pos; fread(ChunkBuf, 1, 1, wav); + pos += 1; + } ChunkLenSum += (ChunkLen + 8); + ChunkBuf = ainfo->Header + pos; fread(ChunkBuf, 1, 4, wav); + pos += 4; } else { - FormLen = ReadULongLSBfirst(wav); + FormLen = ReadULongLSBfirstBuf(wav,ainfo->Header + pos); + pos += 4; // WAVEFORMATPCM - wf->FormatTag = ReadUShortLSBfirst(wav); - wf->Channels = ReadUShortLSBfirst(wav); - wf->SamplesPerSec = ReadULongLSBfirst(wav); - wf->AvgBytesPerSec = ReadULongLSBfirst(wav); - wf->BlockAlign = ReadUShortLSBfirst(wav); - wf->BitsPerSample = ReadUShortLSBfirst(wav); + wf->FormatTag = ReadUShortLSBfirstBuf(wav,ainfo->Header + pos); + pos += 2; + wf->Channels = ReadUShortLSBfirstBuf(wav,ainfo->Header + pos); + pos += 2; + wf->SamplesPerSec = ReadULongLSBfirstBuf(wav,ainfo->Header + pos); + pos += 4; + wf->AvgBytesPerSec = ReadULongLSBfirstBuf(wav,ainfo->Header + pos); + pos += 4; + wf->BlockAlign = ReadUShortLSBfirstBuf(wav,ainfo->Header + pos); + pos += 2; + wf->BitsPerSample = ReadUShortLSBfirstBuf(wav,ainfo->Header + pos); + pos += 2; if ((wf->FormatTag != 1) && (wf->FormatTag != 3)) return(-4); if (FormLen > 16) fseek(wav, FormLen - 16, SEEK_CUR); + ChunkBuf = ainfo->Header + pos; fread(ChunkBuf, 1, 4, wav); + pos += 4; } } // 'data' //fread(DataChunk, 1, 4, wav); - DataLen = ReadULongLSBfirst(wav); + DataLen = ReadULongLSBfirstBuf(wav,ainfo->Header + pos); + pos += 4; if (memcmp(ChunkBuf, DataChunkRef, 4) != 0) // Additional unknown chunk { fseek(wav, DataLen, SEEK_CUR); FormLen += DataLen + 8; // Add size of unknown chunk fread(ChunkBuf, 1, 4, wav); - DataLen = ReadULongLSBfirst(wav); + pos += 4; + DataLen = ReadULongLSBfirstBuf(wav,ainfo->Header + pos); + pos += 4; if (memcmp(ChunkBuf, DataChunkRef, 4) != 0) return(-5); } @@ -181,6 +207,13 @@ fwrite(tmp, 1, 2, fp); } +unsigned short ReadUShortLSBfirstBuf(HALSSTREAM fp,unsigned char *tmp) +{ + fread(tmp, 1, 2, fp); + + return(((unsigned short)tmp[1] << 8) + (unsigned short)tmp[0]); +} + unsigned short ReadUShortLSBfirst(HALSSTREAM fp) { unsigned char tmp[2]; @@ -223,6 +256,14 @@ fwrite(tmp, 1, 4, fp); } +unsigned long ReadULongLSBfirstBuf(HALSSTREAM fp,unsigned char *tmp) +{ + fread(tmp, 1, 4, fp); + + return(((unsigned long)tmp[3] << 24) + ((unsigned long)tmp[2] << 16) + + ((unsigned long)tmp[1] << 8) + (unsigned long)tmp[0]); +} + unsigned long ReadULongLSBfirst(HALSSTREAM fp) { unsigned char tmp[4]; diff -urN mp4alsRM20/src/wave.h mp4alsRM20-shntool/src/wave.h --- mp4alsRM20/src/wave.h 2007-05-23 13:43:22.000000000 -0400 +++ mp4alsRM20-shntool/src/wave.h 2008-02-19 18:43:55.000000000 -0500 @@ -142,6 +142,8 @@ unsigned long Freq; // Sample Rate in Hz ALS_INT64 HeaderSize; // Header Size in Bytes ALS_INT64 TrailerSize; // Trailer Size in Bytes + unsigned char Header[4096]; // Header contents + char* FileName; // File name } AUDIOINFO; typedef struct @@ -160,7 +162,7 @@ } ENCINFO; // Functions -ALS_INT64 GetWaveFormatPCM(HALSSTREAM wav,WAVEFORMATPCM *wf, ALS_INT64 *samples); +ALS_INT64 GetWaveFormatPCM(HALSSTREAM wav,WAVEFORMATPCM *wf, ALS_INT64 *samples, AUDIOINFO *ainfo); short WriteWaveHeaderPCM(HALSSTREAM wav, WAVEFORMATPCM *wf, ULONG *samples); ALS_INT64 GetAiffFormat(HALSSTREAM aif, AIFFCOMMON *ac, ALS_INT64 *Offset, ALS_INT64 *BlockSize, ULONG *samplerate); ALS_INT64 GetWave64FormatPCM(HALSSTREAM wav, WAVEFORMATPCM* wf, ALS_INT64* samples); @@ -169,10 +171,12 @@ void WriteUShortLSBfirst(unsigned short x, HALSSTREAM fp); void WriteUShortMSBfirst(unsigned short x, HALSSTREAM fp); unsigned short ReadUShortLSBfirst(HALSSTREAM fp); +unsigned short ReadUShortLSBfirstBuf(HALSSTREAM fp,unsigned char *tmp); unsigned short ReadUShortMSBfirst(HALSSTREAM fp); void WriteULongLSBfirst(unsigned long x, HALSSTREAM fp); void WriteULongMSBfirst(unsigned long x, HALSSTREAM fp); unsigned long ReadULongLSBfirst(HALSSTREAM fp); +unsigned long ReadULongLSBfirstBuf(HALSSTREAM fp,unsigned char *tmp); unsigned long ReadULongMSBfirst(HALSSTREAM fp); void WriteUINT64LSBfirst(ALS_UINT64 x, HALSSTREAM fp); void WriteUINT64MSBfirst(ALS_UINT64 x, HALSSTREAM fp);