コード例 #1
0
/**
 * 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;
}
コード例 #2
0
/*
 * 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;
}