/** * A wrapper method which reads packets. * It only reads them from the internal pre-fetched buffer in AACDCommonInfo. */ static int aacd_ff_io_read_packet( void *opaque, uint8_t *buf, int buf_size) { AACD_TRACE( "io_read_packet() start" ); AACDFFmpegInfo *ff = (AACDFFmpegInfo*) opaque; AACDCommonInfo *cinfo = ff->cinfo; if (cinfo->bytesleft < buf_size) { // Let's cheat now: AACDArrayInfo *ainfo = (AACDArrayInfo*) cinfo; if (!aacda_read_buffer( ainfo )) { AACD_INFO( "io_read_packet() EOF detected" ); } } int len = buf_size < cinfo->bytesleft ? buf_size : cinfo->bytesleft; if (!len) { AACD_WARN( "read_packet(): no bytes left, returning 0" ); return 0; } memcpy( buf, cinfo->buffer, len ); cinfo->buffer += len; cinfo->bytesleft -= len; ff->bytesconsumed += len; AACD_TRACE( "io_read_packet() stop" ); return len; }
/* * Class: com_biophysics_radioplayer_ArrayDecoder * Method: nativeStart * Signature: (ILcom/biophysics/radioplayer/ArrayBufferReader;Lcom/biophysics/radioplayer/Decoder/Info;)I */ JNIEXPORT jint JNICALL Java_com_biophysics_radioplayer_ArrayDecoder_nativeStart (JNIEnv *env, jobject thiz, jint decoder, jobject jreader, jobject aacInfo) { AACD_TRACE( "start() start" ); AACDDecoder *dec = aacda_decoder( decoder ); if (!dec) { AACD_ERROR( "start() decoder [%d] not supported", decoder ); return 0; } AACDArrayInfo *ainfo = aacda_start( env, dec, jreader, aacInfo ); if (!ainfo) { AACD_ERROR( "start() cannot initialize decoder - out-of-memory error ?" ); return 0; } ainfo->env = env; AACD_TRACE( "start() calling read_buffer" ); unsigned char* buffer = aacda_read_buffer( ainfo ); unsigned long buffer_size = ainfo->cinfo.bytesleft; AACD_TRACE( "start() got %d bytes from read_buffer", buffer_size ); int pos = ainfo->decoder->sync( buffer, buffer_size ); AACD_TRACE( "start() sync returned %d", pos ); if (pos < 0) { AACD_ERROR( "start() failed - ADTS sync word not found" ); aacda_stop( ainfo ); return 0; } buffer += pos; buffer_size -= pos; AACD_TRACE( "start() calling decoder->start()" ); long err = ainfo->decoder->start( &ainfo->cinfo, ainfo->ext, buffer, buffer_size ); if (err < 0) { AACD_ERROR( "start() failed err=%d", err ); aacda_stop( ainfo ); return 0; } // remember pointers for first decode round: if (!ainfo->cinfo.input_ctrl) { ainfo->cinfo.buffer = buffer + err; ainfo->cinfo.bytesleft = buffer_size - err; } AACD_DEBUG( "start() bytesleft=%d", ainfo->cinfo.bytesleft ); aacd_start_info2java( env, &ainfo->cinfo, aacInfo ); ainfo->env = NULL; AACD_TRACE( "nativeStart() stop" ); return (jint) ainfo; }