123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- #include "adts_vlb.h"
- #include "giofile.h"
- #include "in2.h"
- extern In_Module mod;
- ADTS_VLB::ADTS_VLB() : decoder(0), needsync(1)
- {}
- int ADTS_VLB::Initialize(bool forceMono, bool reverseStereo, bool allowSurround, int maxBits, bool allowRG, bool _useFloat, bool _useCRC)
- {
- return 0;
- }
- bool ADTS_VLB::Open(ifc_mpeg_stream_reader *file)
- {
- waServiceFactory *factory = mod.service->service_getServiceByGuid(obj_vlbDecoderGUID);
- if (factory)
- decoder = (obj_vlbDecoder *)factory->getInterface();
- if (decoder)
- {
- int status = decoder->Open((DataIOControl *)(CGioFile *)file);
- if (status == 0)
- return true;
- }
- return false;
- }
- void ADTS_VLB::Close()
- {
- if (decoder)
- {
- waServiceFactory *factory = mod.service->service_getServiceByGuid(obj_vlbDecoderGUID);
- if (factory)
- factory->releaseInterface(decoder);
- }
- decoder = 0;
- }
- void ADTS_VLB::GetOutputParameters(size_t *numBits, int *numChannels, int *sampleRate)
- {
- *sampleRate = params.sampling_frequency;
- *numChannels = params.num_channels;
- *numBits = 16;
- }
- void ADTS_VLB::CalculateFrameSize( int *frameSize )
- {
- *frameSize = 576 * 2 * params.num_channels;
- if ( *frameSize > 576 * 2 * 2 )
- *frameSize = 576 * 2 * 2;
- }
- void ADTS_VLB::Flush(ifc_mpeg_stream_reader *file)
- {
- decoder->Flush();
- decoder->Close();
- decoder->Open((DataIOControl *)(CGioFile *)file);
- needsync = 1;
- }
- size_t ADTS_VLB::GetCurrentBitrate()
- {
- return params.bitrate / 1000;
- }
- size_t ADTS_VLB::GetDecoderDelay()
- {
- return 0; // not really sure
- }
- int ADTS_VLB::Sync(ifc_mpeg_stream_reader *file, unsigned __int8 *output, size_t outputSize, size_t *outputWritten, size_t *bitrate)
- {
- int status = decoder->Synchronize(¶ms);
- if (!status)
- {
- needsync = 0;
- return SUCCESS;
- }
- if (file->MPEGStream_EOF())
- return ENDOFFILE;
- return NEEDMOREDATA;
- }
- int ADTS_VLB::Decode(ifc_mpeg_stream_reader *file, unsigned __int8 *output, size_t outputSize, size_t *outputWritten, size_t *bitrate, size_t *endCut)
- {
- if (*outputWritten = decoder->Read(output, outputSize))
- {
- // TODO: benski> verify that params is valid here
- *bitrate = params.bitrate / 1000;
- return adts::SUCCESS;
- }
- if (needsync)
- {
- int status = decoder->Synchronize(¶ms);
- if (!status)
- {
- needsync = 0;
- }
- else if (file->MPEGStream_EOF())
- {
- return adts::ENDOFFILE;
- }
- }
- if (!needsync)
- {
- int status = decoder->DecodeFrame(¶ms);
- if (status > ERR_NO_ERROR && status != ERR_END_OF_FILE)
- {
- needsync = 1;
- return adts::FAILURE;
- }
- else
- {
- if (status == ERR_END_OF_FILE)
- {
- if (file->MPEGStream_EOF())
- {
- return adts::ENDOFFILE;
- }
- else
- {
- *bitrate = params.bitrate / 1000;
- return adts::NEEDMOREDATA;
- }
- }
- *bitrate = params.bitrate / 1000;
- return adts::SUCCESS;
- }
- }
- return adts::SUCCESS;
- }
- int ADTS_VLB::GetLayer()
- {
- return 4;
- }
- void ADTS_VLB::Release()
- {
- delete this;
- }
|