vlc_block_helper: simplify using byte and offset accounting
authorFrancois Cartegnie <fcvlcdev@free.fr>
Wed, 8 Feb 2017 14:07:57 +0000 (15:07 +0100)
committerFrancois Cartegnie <fcvlcdev@free.fr>
Wed, 8 Feb 2017 18:07:00 +0000 (19:07 +0100)
also removes unused helpers

include/vlc_block_helper.h
modules/packetizer/dirac.c
modules/packetizer/packetizer_helper.h

index 9adc798..0e9e6bf 100644 (file)
@@ -1,8 +1,7 @@
 /*****************************************************************************
  * vlc_block_helper.h: Helper functions for data blocks management.
  *****************************************************************************
- * Copyright (C) 2003 VLC authors and VideoLAN
- * $Id$
+ * Copyright (C) 2003-2017 VLC authors and VideoLAN
  *
  * Authors: Gildas Bazin <gbazin@netcourrier.com>
  *
@@ -31,7 +30,9 @@ typedef struct block_bytestream_t
     block_t *p_chain;  /**< byte stream head block */
     block_t **pp_last; /**< tail ppointer for appends */
     block_t *p_block;  /**< byte stream read pointer block */
-    size_t   i_offset; /**< byte stream read pointer offset within block */
+    size_t   i_block_offset; /**< byte stream read pointer offset within block */
+    size_t   i_base_offset; /**< block base offset (previous blocks total size) */
+    size_t   i_total;  /**< total bytes over all linked blocks */
 } block_bytestream_t;
 
 /*****************************************************************************
@@ -41,7 +42,9 @@ static inline void block_BytestreamInit( block_bytestream_t *p_bytestream )
 {
     p_bytestream->p_chain = p_bytestream->p_block = NULL;
     p_bytestream->pp_last = &p_bytestream->p_chain;
-    p_bytestream->i_offset = 0;
+    p_bytestream->i_block_offset = 0;
+    p_bytestream->i_base_offset = 0;
+    p_bytestream->i_total = 0;
 }
 
 static inline void block_BytestreamRelease( block_bytestream_t *p_bytestream )
@@ -69,17 +72,20 @@ static inline void block_BytestreamFlush( block_bytestream_t *p_bytestream )
     {
         block_t *p_next = block->p_next;
 
+        p_bytestream->i_total -= block->i_buffer;
+        p_bytestream->i_base_offset -= block->i_buffer;
         block_Release( block );
         block = p_next;
     }
 
-    while( block != NULL && block->i_buffer == p_bytestream->i_offset )
+    while( block != NULL && block->i_buffer == p_bytestream->i_block_offset )
     {
         block_t *p_next = block->p_next;
 
+        p_bytestream->i_total -= block->i_buffer;
         block_Release( block );
         block = p_next;
-        p_bytestream->i_offset = 0;
+        p_bytestream->i_block_offset = 0;
     }
 
     p_bytestream->p_chain = p_bytestream->p_block = block;
@@ -92,6 +98,14 @@ static inline void block_BytestreamPush( block_bytestream_t *p_bytestream,
 {
     block_ChainLastAppend( &p_bytestream->pp_last, p_block );
     if( !p_bytestream->p_block ) p_bytestream->p_block = p_block;
+    for( ; p_block; p_block = p_block->p_next )
+        p_bytestream->i_total += p_block->i_buffer;
+}
+
+static inline size_t block_BytestreamRemaining( const block_bytestream_t *p_bytestream )
+{
+    return ( p_bytestream->i_total > p_bytestream->i_base_offset + p_bytestream->i_block_offset ) ?
+             p_bytestream->i_total - p_bytestream->i_base_offset - p_bytestream->i_block_offset : 0;
 }
 
 VLC_USED
@@ -108,9 +122,10 @@ static inline block_t *block_BytestreamPop( block_bytestream_t *p_bytestream )
     }
     else if( !p_block->p_next )
     {
-        p_block->p_buffer += p_bytestream->i_offset;
-        p_block->i_buffer -= p_bytestream->i_offset;
-        p_bytestream->i_offset = 0;
+        p_block->p_buffer += p_bytestream->i_block_offset;
+        p_block->i_buffer -= p_bytestream->i_block_offset;
+        p_bytestream->i_block_offset = 0;
+        p_bytestream->i_total = 0;
         p_bytestream->p_chain = p_bytestream->p_block = NULL;
         p_bytestream->pp_last = &p_bytestream->p_chain;
         return p_block;
@@ -123,190 +138,32 @@ static inline block_t *block_BytestreamPop( block_bytestream_t *p_bytestream )
     p_block = p_block->p_next;
     p_block_old->p_next = NULL;
     p_bytestream->pp_last = &p_block_old->p_next;
+    p_bytestream->i_total -= p_block->i_buffer;
 
     return p_block;
 }
 
-static inline int block_SkipByte( block_bytestream_t *p_bytestream )
-{
-    /* Most common case first */
-    if( likely( p_bytestream->p_block->i_buffer - p_bytestream->i_offset ) )
-    {
-        p_bytestream->i_offset++;
-        return VLC_SUCCESS;
-    }
-    else
-    {
-        block_t *p_block;
-
-        /* Less common case which is also slower */
-        for( p_block = p_bytestream->p_block->p_next;
-             p_block != NULL; p_block = p_block->p_next )
-        {
-            if( p_block->i_buffer )
-            {
-                p_bytestream->i_offset = 1;
-                p_bytestream->p_block = p_block;
-                return VLC_SUCCESS;
-            }
-        }
-    }
-
-    /* Not enough data, bail out */
-    return VLC_EGENERIC;
-}
-
-static inline int block_PeekByte( block_bytestream_t *p_bytestream,
-                                  uint8_t *p_data )
-{
-    /* Most common case first */
-    if( likely( p_bytestream->p_block->i_buffer - p_bytestream->i_offset ) )
-    {
-        *p_data = p_bytestream->p_block->p_buffer[p_bytestream->i_offset];
-        return VLC_SUCCESS;
-    }
-    else
-    {
-        block_t *p_block;
-
-        /* Less common case which is also slower */
-        for( p_block = p_bytestream->p_block->p_next;
-             p_block != NULL; p_block = p_block->p_next )
-        {
-            if( p_block->i_buffer )
-            {
-                *p_data = p_block->p_buffer[0];
-                return VLC_SUCCESS;
-            }
-        }
-    }
-
-    /* Not enough data, bail out */
-    return VLC_EGENERIC;
-}
-
-static inline int block_GetByte( block_bytestream_t *p_bytestream,
-                                 uint8_t *p_data )
-{
-    /* Most common case first */
-    if( likely( p_bytestream->p_block->i_buffer - p_bytestream->i_offset ) )
-    {
-        *p_data = p_bytestream->p_block->p_buffer[p_bytestream->i_offset];
-        p_bytestream->i_offset++;
-        return VLC_SUCCESS;
-    }
-    else
-    {
-        block_t *p_block;
-
-        /* Less common case which is also slower */
-        for( p_block = p_bytestream->p_block->p_next;
-             p_block != NULL; p_block = p_block->p_next )
-        {
-            if( p_block->i_buffer )
-            {
-                *p_data = p_block->p_buffer[0];
-                p_bytestream->i_offset = 1;
-                p_bytestream->p_block = p_block;
-                return VLC_SUCCESS;
-            }
-        }
-    }
-
-    /* Not enough data, bail out */
-    return VLC_EGENERIC;
-}
-
 static inline int block_WaitBytes( block_bytestream_t *p_bytestream,
                                    size_t i_data )
 {
-    block_t *p_block;
-    size_t i_offset, i_copy, i_size;
-
-    /* Check we have that much data */
-    i_offset = p_bytestream->i_offset;
-    i_size = i_data;
-    for( p_block = p_bytestream->p_block;
-         p_block != NULL; p_block = p_block->p_next )
-    {
-        i_copy = __MIN( i_size, p_block->i_buffer - i_offset );
-        i_size -= i_copy;
-        i_offset = 0;
-
-        if( !i_size ) break;
-    }
-
-    if( i_size )
-    {
-        /* Not enough data, bail out */
-        return VLC_EGENERIC;
-    }
-    return VLC_SUCCESS;
-}
-
-static inline int block_SkipBytes( block_bytestream_t *p_bytestream,
-                                   size_t i_data )
-{
-    block_t *p_block;
-    size_t i_offset, i_copy;
-
-    /* Check we have that much data */
-    i_offset = p_bytestream->i_offset;
-    i_copy = 0;
-    for( p_block = p_bytestream->p_block;
-         p_block != NULL; p_block = p_block->p_next )
-    {
-        i_copy = __MIN( i_data, p_block->i_buffer - i_offset );
-        i_data -= i_copy;
-
-        if( !i_data ) break;
-
-        i_offset = 0;
-    }
-
-    if( i_data )
-    {
-        /* Not enough data, bail out */
-        return VLC_EGENERIC;
-    }
-
-    p_bytestream->p_block = p_block;
-    p_bytestream->i_offset = i_offset + i_copy;
-    return VLC_SUCCESS;
+    if( block_BytestreamRemaining( p_bytestream ) >= i_data )
+        return VLC_SUCCESS;
+    return VLC_EGENERIC;
 }
 
 static inline int block_PeekBytes( block_bytestream_t *p_bytestream,
                                    uint8_t *p_data, size_t i_data )
 {
-    block_t *p_block;
-    size_t i_offset, i_copy, i_size;
-
-    /* Check we have that much data */
-    i_offset = p_bytestream->i_offset;
-    i_size = i_data;
-    for( p_block = p_bytestream->p_block;
-         p_block != NULL; p_block = p_block->p_next )
-    {
-        i_copy = __MIN( i_size, p_block->i_buffer - i_offset );
-        i_size -= i_copy;
-        i_offset = 0;
-
-        if( !i_size ) break;
-    }
-
-    if( i_size )
-    {
-        /* Not enough data, bail out */
+    if( block_BytestreamRemaining( p_bytestream ) < i_data )
         return VLC_EGENERIC;
-    }
 
     /* Copy the data */
-    i_offset = p_bytestream->i_offset;
-    i_size = i_data;
-    for( p_block = p_bytestream->p_block;
+    size_t i_offset = p_bytestream->i_block_offset;
+    size_t i_size = i_data;
+    for( block_t *p_block = p_bytestream->p_block;
          p_block != NULL; p_block = p_block->p_next )
     {
-        i_copy = __MIN( i_size, p_block->i_buffer - i_offset );
+        size_t i_copy = __MIN( i_size, p_block->i_buffer - i_offset );
         i_size -= i_copy;
 
         if( i_copy )
@@ -326,84 +183,66 @@ static inline int block_PeekBytes( block_bytestream_t *p_bytestream,
 static inline int block_GetBytes( block_bytestream_t *p_bytestream,
                                   uint8_t *p_data, size_t i_data )
 {
-    block_t *p_block;
-    size_t i_offset, i_copy, i_size;
-
-    /* Check we have that much data */
-    i_offset = p_bytestream->i_offset;
-    i_size = i_data;
-    for( p_block = p_bytestream->p_block;
-         p_block != NULL; p_block = p_block->p_next )
-    {
-        i_copy = __MIN( i_size, p_block->i_buffer - i_offset );
-        i_size -= i_copy;
-        i_offset = 0;
-
-        if( !i_size ) break;
-    }
-
-    if( i_size )
-    {
-        /* Not enough data, bail out */
+    if( block_BytestreamRemaining( p_bytestream ) < i_data )
         return VLC_EGENERIC;
-    }
 
     /* Copy the data */
-    i_offset = p_bytestream->i_offset;
-    i_size = i_data;
-    i_copy = 0;
+    size_t i_offset = p_bytestream->i_block_offset;
+    size_t i_size = i_data;
+    size_t i_copy = 0;
+    block_t *p_block;
     for( p_block = p_bytestream->p_block;
          p_block != NULL; p_block = p_block->p_next )
     {
         i_copy = __MIN( i_size, p_block->i_buffer - i_offset );
         i_size -= i_copy;
 
-        if( i_copy )
+        if( i_copy && p_data != NULL )
         {
             memcpy( p_data, p_block->p_buffer + i_offset, i_copy );
             p_data += i_copy;
         }
 
-        if( !i_size ) break;
+        if( i_size == 0 )
+            break;
 
+        p_bytestream->i_base_offset += p_block->i_buffer;
         i_offset = 0;
     }
 
     p_bytestream->p_block = p_block;
-    p_bytestream->i_offset = i_offset + i_copy;
+    p_bytestream->i_block_offset = i_offset + i_copy;
 
     return VLC_SUCCESS;
 }
 
-static inline int block_PeekOffsetBytes( block_bytestream_t *p_bytestream,
-    size_t i_peek_offset, uint8_t *p_data, size_t i_data )
+static inline int block_SkipBytes( block_bytestream_t *p_bytestream,
+                                   size_t i_data )
 {
-    block_t *p_block;
-    size_t i_offset, i_copy, i_size;
-
-    /* Check we have that much data */
-    i_offset = p_bytestream->i_offset;
-    i_size = i_data + i_peek_offset;
-    for( p_block = p_bytestream->p_block;
-         p_block != NULL; p_block = p_block->p_next )
-    {
-        i_copy = __MIN( i_size, p_block->i_buffer - i_offset );
-        i_size -= i_copy;
-        i_offset = 0;
+    return block_GetBytes( p_bytestream, NULL, i_data );
+}
 
-        if( !i_size ) break;
-    }
+static inline int block_SkipByte( block_bytestream_t *p_bytestream )
+{
+    return block_GetBytes( p_bytestream, NULL, 1 );
+}
 
-    if( i_size )
+static inline int block_PeekOffsetBytes( block_bytestream_t *p_bytestream,
+    size_t i_peek_offset, uint8_t *p_data, size_t i_data )
+{
+    /* Check we have that much data, ignoring read offset */
+    if( p_bytestream->i_total < i_peek_offset ||
+        p_bytestream->i_total - i_peek_offset < i_data )
     {
         /* Not enough data, bail out */
         return VLC_EGENERIC;
     }
 
     /* Find the right place */
-    i_offset = p_bytestream->i_offset;
-    i_size = i_peek_offset;
-    i_copy = 0;
+    size_t i_offset = p_bytestream->i_block_offset;
+    size_t i_size = i_peek_offset;
+    size_t i_copy = 0;
+    block_t *p_block;
     for( p_block = p_bytestream->p_block;
          p_block != NULL; p_block = p_block->p_next )
     {
@@ -445,12 +284,12 @@ static inline int block_FindStartcodeFromOffset(
     block_startcode_helper_t p_startcode_helper )
 {
     block_t *p_block, *p_block_backup = 0;
-    int i_size = 0;
+    ssize_t i_size = 0;
     size_t i_offset, i_offset_backup = 0;
     int i_caller_offset_backup = 0, i_match;
 
     /* Find the right place */
-    i_size = *pi_offset + p_bytestream->i_offset;
+    i_size = *pi_offset + p_bytestream->i_block_offset;
     for( p_block = p_bytestream->p_block;
          p_block != NULL; p_block = p_block->p_next )
     {
index f950535..d18e1e5 100644 (file)
@@ -302,7 +302,7 @@ static void dirac_RecoverTimestamps ( decoder_t *p_dec, size_t i_length )
     block_t *p_block = p_sys->bytestream.p_block;
 
     /* Find the block with first non-flushed data */
-    size_t i_offset = p_sys->bytestream.i_offset;
+    size_t i_offset = p_sys->bytestream.i_block_offset;
     for(; p_block != NULL; p_block = p_block->p_next )
     {
         if( i_offset < p_block->i_buffer )
index 00e98d8..171ca5c 100644 (file)
@@ -169,7 +169,7 @@ static inline block_t *packetizer_Packetize( packetizer_t *p_pack, block_t **pp_
                  * the data extend up to the end */
                 block_ChainProperties( p_pack->bytestream.p_chain,
                                        NULL, &p_pack->i_offset, NULL );
-                p_pack->i_offset -= p_pack->bytestream .i_offset;
+                p_pack->i_offset -= p_pack->bytestream.i_block_offset;
 
                 if( p_pack->i_offset <= (size_t)p_pack->i_startcode )
                     return NULL;