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