[libdvdcss-devel] [PATCH 1/1] add dvdcss_open_stream
    Diego Biurrun 
    diego at biurrun.de
       
    Tue Oct 21 21:53:06 CEST 2014
    
    
  
On Fri, Oct 17, 2014 at 05:43:36PM +0200, Thomas Guillem wrote:
> open a DVD Device using external read/seek callbacks.
> ---
>  src/device.c        | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  src/dvdcss/dvdcss.h |  12 ++++++
>  src/libdvdcss.c     |  33 ++++++++++++++-
>  src/libdvdcss.h     |   3 ++
>  4 files changed, 161 insertions(+), 1 deletion(-)
This needs a NEWS entry.
> --- a/src/device.c
> +++ b/src/device.c
> @@ -200,6 +207,10 @@ void _dvdcss_check ( dvdcss_t dvdcss )
>  
> +    /* If stream is set, return */
> +    if( dvdcss->p_stream )
> +        return;
> +
>      /* If the device name is non-null, return */
>      if( dvdcss->psz_device[0] )
>      {
These two if-blocks could be merged.
> @@ -358,6 +369,22 @@ int _dvdcss_open ( dvdcss_t dvdcss )
>  
> +    /* if callback functions are initialized */
> +    if( dvdcss->p_stream )
> +    {
> +#if defined( WIN32 )
> +        /* Initialize readv temporary buffer */
> +        dvdcss->p_readv_buffer   = NULL;
> +        dvdcss->i_readv_buf_size = 0;
> +#endif
Why?  This initialization looks unnecessary and misplaced.
It's done in the '#if WIN32' block below and seems only relevant for the
WIN32, not the stream, case.  What am I missing?
> @@ -710,6 +737,33 @@ static int libc_seek( dvdcss_t dvdcss, int i_blocks )
>  
> +static int stream_seek( dvdcss_t dvdcss, int i_blocks )
> +{
> +    off_t   i_seek;
nit: odd spacing
> +    i_seek = (off_t)i_blocks * (off_t)DVDCSS_BLOCK_SIZE;
> +
> +    if( dvdcss->p_stream_cb->pf_seek( dvdcss->p_stream, i_seek ) != 0 )
> +    {
> +        print_error( dvdcss, "seek error" );
> +        dvdcss->i_pos = -1;
> +        return -1;
> +    }
> +
> +    dvdcss->i_pos = i_seek / DVDCSS_BLOCK_SIZE;
Just use i_blocks instead of recalculating the value of i_blocks.
> @@ -809,6 +863,43 @@ static int libc_read ( dvdcss_t dvdcss, void *p_buffer, int i_blocks )
>  
> +static int stream_read ( dvdcss_t dvdcss, void *p_buffer, int i_blocks )
> +{
> +    off_t i_size, i_ret;
> +
> +    if( !dvdcss->p_stream_cb->pf_read )
> +        return -1;
> +
> +    i_size = (off_t)i_blocks * (off_t)DVDCSS_BLOCK_SIZE;
same comment about the casts
> +    i_ret = dvdcss->p_stream_cb->pf_read( dvdcss->p_stream, p_buffer, i_size );
> +
> +    if( i_ret < 0 )
> +    {
> +        print_error( dvdcss, "read error" );
> +        dvdcss->i_pos = -1;
> +        return i_ret;
> +    }
> +
> +    /* Handle partial reads */
> +    if( i_ret != i_size )
> +    {
> +        int i_seek;
> +
> +        dvdcss->i_pos = -1;
> +        i_seek = stream_seek( dvdcss, i_ret / DVDCSS_BLOCK_SIZE );
> +
> +        /* We have to return now so that i_pos isn't clobbered */
> +        return i_ret / DVDCSS_BLOCK_SIZE;
> +    }
> +
> +    dvdcss->i_pos += i_ret / DVDCSS_BLOCK_SIZE;
> +    return i_ret / DVDCSS_BLOCK_SIZE;
> +}
This is so similar to libc_read, I wonder if the code duplication cannot be avoided.
> @@ -911,6 +1002,29 @@ static int libc_readv ( dvdcss_t dvdcss, struct iovec *p_iovec, int i_blocks )
>  
> +/*****************************************************************************
> + * stream_readv: vectored read
> + *****************************************************************************/
> +static int stream_readv ( dvdcss_t dvdcss, struct iovec *p_iovec, int i_blocks )
> +{
> +    int i_read;
> +
> +    if( !dvdcss->p_stream_cb->pf_readv )
> +        return -1;
> +    
trailing whitespace
> +    i_read = dvdcss->p_stream_cb->pf_readv( dvdcss->p_stream, p_iovec,
> +                                                i_blocks );
odd indentation
> --- a/src/dvdcss/dvdcss.h
> +++ b/src/dvdcss/dvdcss.h
> @@ -38,6 +40,14 @@ extern "C" {
>  
> +struct dvdcss_stream_cb
> +{
> +    int ( *pf_seek )  ( void *p_stream,  uint64_t i_pos);
Why uint64_t all of a sudden?  That signature does not match the functions
you assign IIRC.
> +    int ( *pf_read )  ( void *p_stream, void* buffer, int i_read);
void *buffer
> +    int ( *pf_readv ) ( void *p_stream, void *p_iovec, int i_blocks);
> +};
> +typedef struct dvdcss_stream_cb dvdcss_stream_cb;
For dvdcss_t we typedef a pointer.
> --- a/src/libdvdcss.c
> +++ b/src/libdvdcss.c
> @@ -136,6 +136,8 @@
>  
> +static dvdcss_t dvdcss_open_common ( char *psz_target, void *p_stream,
> +                                     dvdcss_stream_cb *p_stream_cb );
const char *
> @@ -152,6 +154,27 @@
>   */
>  LIBDVDCSS_EXPORT dvdcss_t dvdcss_open ( char *psz_target )
OK, I guess we need to fix that here first ..
> +/**
> + * \brief Open a DVD device using dvdcss_stream_cb
.
> @@ -164,6 +187,10 @@ LIBDVDCSS_EXPORT dvdcss_t dvdcss_open ( char *psz_target )
>  
> +    if( psz_target == NULL &&
> +      ( p_stream == NULL || p_stream_cb == NULL ) )
> +        return NULL;
> +
> @@ -180,13 +207,17 @@ LIBDVDCSS_EXPORT dvdcss_t dvdcss_open ( char *psz_target )
>      dvdcss->p_titles = NULL;
> -    dvdcss->psz_device = (char *)strdup( psz_target );
> +    dvdcss->psz_device = psz_target != NULL ?
> +                         (char *)strdup( psz_target ) : NULL;
You already performed this check a few lines above.
Diego
    
    
More information about the libdvdcss-devel
mailing list