Esempio n. 1
0
static ssize_t Read( stream_t *p_stream, void *p_buf, size_t i_toread )
{
    stream_sys_t *p_sys = p_stream->p_sys;
    uint8_t *p_dst = p_buf;
    int i_total_read = 0;
    int i_ret;

    if ( !i_toread )
        return -1;

    /* Use data from previous reads */
    size_t i_fromremain = RemainRead( p_stream, p_dst, i_toread );
    i_total_read += i_fromremain;
    p_dst += i_fromremain;
    i_toread -= i_fromremain;

    while ( i_toread )
    {
        /* make use of the existing buffer, overwritten by decoder data later */
        int i_srcread = vlc_stream_Read( p_stream->s, p_dst, i_toread );
        if ( i_srcread > 0 )
        {
            ARIB_STD_B25_BUFFER putbuf = { p_dst, i_srcread };
            i_ret = p_sys->p_b25->put( p_sys->p_b25, &putbuf );
            if ( i_ret < 0 )
            {
                msg_Err( p_stream, "decoder put failed: %s",
                         GetErrorMessage( i_ret, b25_errors ) );
                return 0;
            }
        }
        else
        {
            if ( i_srcread < 0 )
                msg_Err( p_stream, "Can't read %lu bytes from source stream: %d", i_toread, i_srcread );
            return 0;
        }

        ARIB_STD_B25_BUFFER getbuf;
        i_ret = p_sys->p_b25->get( p_sys->p_b25, &getbuf );
        if ( i_ret < 0 )
        {
            msg_Err( p_stream, "decoder get failed: %s",
                     GetErrorMessage( i_ret, b25_errors ) );
            return 0;
        }

        if ( (size_t)getbuf.size > i_toread )
        {
            /* Hold remaining data for next call */
            RemainAdd( p_stream, getbuf.data + i_toread, getbuf.size - i_toread );
        }

        int consume = __MIN( (size_t)getbuf.size, i_toread );
        memcpy( p_dst, getbuf.data, consume );

        i_total_read += consume;
        p_dst += consume;
        i_toread -= consume;
    }

    return i_total_read;
}
Esempio n. 2
0
static int DecoderRead( stream_t *p_stream, uint8_t *p_dst, int i_toread )
{
    stream_sys_t *p_sys = p_stream->p_sys;
    ARIB_STD_B25_BUFFER getbuf = { NULL, 0 };
    int i_total_read = 0;
    int i_ret;

    if ( !p_dst || ! i_toread )
        return -1;

    /* Use data from previous reads */
    size_t i_fromremain = RemainRead( p_stream, p_dst, i_toread );
    i_toread -= i_fromremain;
    i_total_read += i_fromremain;

    while( i_toread )
    {

        do
        {
            getbuf.size = 0;

            i_ret = p_sys->p_b25->get( p_sys->p_b25, &getbuf );
            if ( i_ret < 0 )
                msg_Err( p_stream, "decoder get failed: %s",
                         GetErrorMessage( i_ret, b25_errors ) );

            /* If the decoders needs buffering or data is not ready, push some */
            if ( i_ret == 0 && getbuf.size == 0 )
            {
                /* make use of the existing buffer,
               overwritten by decoder data later */
                int i_srcread = stream_Read( p_stream->p_source, p_dst, i_toread );
                if ( i_srcread > 0 )
                {
                    ARIB_STD_B25_BUFFER putbuf = { p_dst, i_srcread };
                    i_ret = p_sys->p_b25->put( p_sys->p_b25, &putbuf );
                    if ( i_ret < 0 )
                        msg_Err( p_stream, "decoder put failed: %s",
                                 GetErrorMessage( i_ret, b25_errors ) );
                }
                else
                {
                    if ( i_srcread < 0 )
                        msg_Err( p_stream, "Can't read %d bytes from source stream: %d", i_toread, i_srcread );
                    i_ret = -1;
                }
            }
        }
        while ( i_ret == 0 && getbuf.size == 0 );

        if ( i_ret < 0 )
            return -1;

        memcpy( p_dst, getbuf.data, __MIN(getbuf.size, i_toread) );

        if ( getbuf.size > i_toread )
        {
            /* Hold remaining data for next call */
            RemainAdd( p_stream, getbuf.data + i_toread, getbuf.size - i_toread );
        }

        i_total_read += __MIN(getbuf.size, i_toread);
        p_dst += __MIN(getbuf.size, i_toread);
        i_toread -= __MIN(getbuf.size, i_toread);

    }

    return i_total_read;
}