static int aacd_opencoremp3_sync( AACDInfo *info, unsigned char *buffer, int buffer_size ) { AACDOpenCoreMP3 *oc = (AACDOpenCoreMP3*) info->ext; if (oc->pExt->pOutputBuffer) { ERROR_CODE err = pvmp3_frame_synch( oc->pExt, oc->pMem ); return err != NO_DECODING_ERROR ? -1 : 0; } return 0; }
static long aacd_opencoremp3_start( AACDInfo *info, unsigned char *buffer, unsigned long buffer_size) { AACD_TRACE( "start() buffer=%x size=%d", (*(unsigned long*)buffer), buffer_size ); AACDOpenCoreMP3 *oc = (AACDOpenCoreMP3*) info->ext; tPVMP3DecoderExternal *pExt = oc->pExt; // prepare the first samples buffer: //pExt->pOutputBuffer = malloc(4096 * sizeof(int16_t)); pExt->pOutputBuffer = aacd_prepare_samples( info, 4096 ); pExt->outputFrameSize = 4096; pExt->pInputBuffer = buffer; pExt->inputBufferMaxLength = buffer_size; pExt->inputBufferCurrentLength = buffer_size; pExt->inputBufferUsedLength = 0; pExt->crcEnabled = 0; pExt->equalizerType = flat; pvmp3_InitDecoder( oc->pExt, oc->pMem ); int32_t status; int frameDecoded = 0; int attempts = 16; int totalConsumed = 0; pExt->outputFrameSize = 0; /* pre-init search adts sync */ while (!frameDecoded && attempts--) { pExt->pInputBuffer = buffer; pExt->inputBufferMaxLength = buffer_size; pExt->inputBufferCurrentLength = buffer_size; pExt->inputBufferUsedLength = 0; pExt->outputFrameSize = 4096; status = pvmp3_framedecoder(pExt, oc->pMem); AACD_DEBUG( "start() Status[0]: %d - consumed %d bytes", status, pExt->inputBufferUsedLength ); totalConsumed += pExt->inputBufferUsedLength; if (status != NO_DECODING_ERROR) { AACD_ERROR( "start() frame decode error=%d", status ); if (!pExt->inputBufferUsedLength) { AACD_ERROR( "start() first frame cannot be decoded - trying to sync again" ); int move = buffer_size < 2048 ? (buffer_size >> 1) : 1024; buffer += move; buffer_size -= move; totalConsumed += move; pExt->pInputBuffer = buffer; pExt->inputBufferMaxLength = buffer_size; pExt->inputBufferCurrentLength = buffer_size; ERROR_CODE err = pvmp3_frame_synch( oc->pExt, oc->pMem ); if (err == SYNCH_LOST_ERROR) { AACD_ERROR( "start() cannot re-sync the stream after next %d bytes, status=%d", move, err ); } else if (err != NO_DECODING_ERROR) { AACD_ERROR( "start() cannot sync the stream status=%d", err ); break; } else { totalConsumed += pExt->inputBufferUsedLength; AACD_INFO( "start() sync was successful - used bytes=%d", totalConsumed ); } } buffer -= pExt->inputBufferUsedLength; buffer_size -= pExt->inputBufferUsedLength; }