[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