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