Пример #1
0
int AacPcm::processData(MediaInfo *infos, ChunkList *chunk_list, bool *killswitch)
{
DWORD			BytesDecoded=0;
char			*bufout=0;
ChunkInfosI		*ci=0;
svc_fileReader	*reader=0;

	if(!FindBitrate && !chunk_list)
		ERROR_processData("chunk_list==NULL"); // is this case possible?

	if(!(reader=infos->getReader()))
		ERROR_processData("File doesn\'t exists");

	if(chunk_list)
	{
		if(!(ci=new ChunkInfosI()))
			ERROR_processData("Memory allocation error: ci");

		ci->addInfo("srate", Samplerate);
		ci->addInfo("bps", bps);
		ci->addInfo("nch", Channels);
	}

	if(!IsAAC) // MP4 file --------------------------------------------------------------------------
	{   
	unsigned __int32 buffer_size=0;
    int rc;

		if(newpos_ms>-1)
		{
		MP4Duration duration=MP4ConvertToTrackDuration(mp4File,track,newpos_ms,MP4_MSECS_TIME_SCALE);
            sampleId=MP4GetSampleIdFromTime(mp4File,track,duration,0);
			bytes_read=(DWORD)(((float)newpos_ms*file_info.bitrate)/(8*1000));
			reader->seek(bytes_read);  // updates slider
			newpos_ms=-1;
		}
		do
		{
			buffer=NULL;
			if(sampleId>=numSamples)
				ERROR_processData(0);

			rc=MP4ReadSample(mp4File, track, sampleId++, (unsigned __int8 **)&buffer, &buffer_size, NULL, NULL, NULL, NULL);
			if(rc==0 || buffer==NULL)
			{
				FREE_ARRAY(buffer);
				ERROR_processData("MP4ReadSample")
			}

			bufout=(char *)faacDecDecode(hDecoder,&frameInfo,buffer,buffer_size);
			BytesDecoded=frameInfo.samples*sizeof(short);
			FREE_ARRAY(buffer);
			// to update the slider
			bytes_read+=buffer_size;
			reader->seek(bytes_read);
		}while(!BytesDecoded && !frameInfo.error);
Пример #2
0
int AacPcm::processData(MediaInfo *infos, ChunkList *chunk_list, bool *killswitch)
{
DWORD		read,
			tmp,
			shorts_decoded=0;
long		result=0;
ChunkInfosI *ci = new ChunkInfosI();

	ci->addInfo("srate", dwSamprate); 
    ci->addInfo("bps", 16); 
	ci->addInfo("nch", dwChannels); 

	if(bytes_into_buffer<0)
		ERROR_processData(0);

svc_fileReader *reader = infos->getReader();
	if(!reader)
		ERROR_processData("File doesn\'t exists");

	do
	{
		if(bytes_consumed>0 && bytes_into_buffer>=0)
		{
			if(bytes_into_buffer)
				memcpy(buffer,buffer+bytes_consumed,bytes_into_buffer);

			if(bytes_read<lSize)
			{
				if(bytes_read+bytes_consumed<lSize)
					tmp=bytes_consumed;
				else
					tmp=lSize-bytes_read;
				read=reader->read((char *)buffer+bytes_into_buffer, tmp);
				if(read==tmp)
				{
					bytes_read+=read;
					bytes_into_buffer+=read;
				}
				else
					infos->status("Read failed!"); // continue until bytes_into_buffer<1
			}
			else
				if(bytes_into_buffer)
					memset(buffer+bytes_into_buffer, 0, bytes_consumed);
		}

		if(bytes_into_buffer<1)
			if(bytes_read<lSize)
				ERROR_processData("Buffer empty!")
			else
				return 0;

		result=faacDecDecode(hDecoder, buffer, &bytes_consumed, (short*)bufout, &shorts_decoded);
		bytes_into_buffer-=bytes_consumed;
	}while(!shorts_decoded || result==FAAD_OK_CHUPDATE);


	if(result==FAAD_FATAL_ERROR || result==FAAD_ERROR)
		ERROR_processData("FAAD_FATAL_ERROR or FAAD_ERROR");

	shorts_decoded*=sizeof(short);

    chunk_list->setChunk("PCM", bufout, shorts_decoded, ci);
//	fwrite(bufout,1,bytesDec,fil);

    if(!shorts_decoded)
		ERROR_processData(0);

    return 1;
}