[vlc-commits] stream_filter: smooth: dynamically create smoo box

Francois Cartegnie git at videolan.org
Mon Nov 10 12:59:22 CET 2014


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Sun Nov  9 19:27:07 2014 +0100| [e1bedc114606456826ccbb9e3a7349896ac360e6] | committer: Francois Cartegnie

stream_filter: smooth: dynamically create smoo box

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=e1bedc114606456826ccbb9e3a7349896ac360e6
---

 modules/stream_filter/smooth/downloader.c |  130 ++++++++++++++---------------
 1 file changed, 61 insertions(+), 69 deletions(-)

diff --git a/modules/stream_filter/smooth/downloader.c b/modules/stream_filter/smooth/downloader.c
index 39079de..84d2306 100644
--- a/modules/stream_filter/smooth/downloader.c
+++ b/modules/stream_filter/smooth/downloader.c
@@ -373,21 +373,27 @@ static int get_new_chunks( stream_t *s, chunk_t *ck, sms_stream_t *sms )
 }
 
 #define STRA_SIZE 334
-#define SMOO_SIZE (STRA_SIZE * 3 + 24) /* 1026 */
+//#define SMOO_SIZE (STRA_SIZE * 3 + 24) /* 1026 */
 
 /* SmooBox is a very simple MP4 box, used only to pass information
  * to the demux layer. As this box is not aimed to travel accross networks,
  * simplicity of the design is better than compactness */
-static int build_smoo_box( stream_t *s, uint8_t *smoo_box )
+static int build_smoo_box( stream_t *s, chunk_t *p_chunk )
 {
     stream_sys_t *p_sys = s->p_sys;
-    sms_stream_t *sms = NULL;
     uint32_t FourCC;
 
     /* smoo */
-    memset( smoo_box, 0, SMOO_SIZE );
-    smoo_box[2] = (SMOO_SIZE & 0xff00)>>8;
-    smoo_box[3] = SMOO_SIZE & 0xff;
+    assert(p_sys->sms_selected.i_size);
+    size_t i_size = p_sys->sms_selected.i_size * STRA_SIZE + 24;
+    p_chunk->data = calloc( 1, i_size );
+    if ( !p_chunk->data )
+        return VLC_EGENERIC;
+    p_chunk->size = i_size;
+    uint8_t *smoo_box = p_chunk->data;
+
+    smoo_box[2] = (i_size & 0xff00)>>8;
+    smoo_box[3] = i_size & 0xff;
     smoo_box[4] = 'u';
     smoo_box[5] = 'u';
     smoo_box[6] = 'i';
@@ -399,64 +405,56 @@ static int build_smoo_box( stream_t *s, uint8_t *smoo_box )
     ((uint32_t *)smoo_box)[4] = bswap32( 0xa6a51b57 );
     ((uint32_t *)smoo_box)[5] = bswap32( 0x59a1a92c );
 
-    uint8_t *stra_box;
-    for( int i = 0; i < 3; i++ )
-    {
-        sms = NULL;
-        int cat = UNKNOWN_ES;
-        stra_box = smoo_box + i * STRA_SIZE;
-
-        stra_box[26] = (STRA_SIZE & 0xff00)>>8;
-        stra_box[27] = STRA_SIZE & 0xff;
-        stra_box[28] = 'u';
-        stra_box[29] = 'u';
-        stra_box[30] = 'i';
-        stra_box[31] = 'd';
-
-        /* UUID is b03ef770-33bd-4bac-96c7-bf25f97e2447 */
-        ((uint32_t *)stra_box)[8] = bswap32( 0xb03ef770 );
-        ((uint32_t *)stra_box)[9] = bswap32( 0x33bd4bac );
-        ((uint32_t *)stra_box)[10] = bswap32( 0x96c7bf25 );
-        ((uint32_t *)stra_box)[11] = bswap32( 0xf97e2447 );
-
-        cat = index_to_es_cat( i );
-        stra_box[48] = cat;
-        sms = SMS_GET_SELECTED_ST( cat );
-
-        stra_box[49] = 0; /* reserved */
-        if( sms == NULL )
+    int i = 0;
+    FOREACH_ARRAY( sms_stream_t *sms, p_sys->sms_selected );
+    uint8_t *stra_box = smoo_box + i++ * STRA_SIZE;
+
+    stra_box[26] = (STRA_SIZE & 0xff00)>>8;
+    stra_box[27] = STRA_SIZE & 0xff;
+    stra_box[28] = 'u';
+    stra_box[29] = 'u';
+    stra_box[30] = 'i';
+    stra_box[31] = 'd';
+
+    /* UUID is b03ef770-33bd-4bac-96c7-bf25f97e2447 */
+    ((uint32_t *)stra_box)[8] = bswap32( 0xb03ef770 );
+    ((uint32_t *)stra_box)[9] = bswap32( 0x33bd4bac );
+    ((uint32_t *)stra_box)[10] = bswap32( 0x96c7bf25 );
+    ((uint32_t *)stra_box)[11] = bswap32( 0xf97e2447 );
+
+    stra_box[48] = sms->type;
+    stra_box[49] = 0; /* reserved */
+    stra_box[50] = (sms->id & 0xff00)>>8;
+    stra_box[51] = sms->id & 0xff;
+
+    ((uint32_t *)stra_box)[13] = bswap32( sms->timescale );
+    ((uint64_t *)stra_box)[7] = bswap64( p_sys->vod_duration );
+
+    const quality_level_t *qlvl = sms->current_qlvl;
+    if ( qlvl )
+    {
+        FourCC = qlvl->FourCC ? qlvl->FourCC : sms->default_FourCC;
+        ((uint32_t *)stra_box)[16] = bswap32( FourCC );
+        ((uint32_t *)stra_box)[17] = bswap32( qlvl->Bitrate );
+        ((uint32_t *)stra_box)[18] = bswap32( qlvl->MaxWidth );
+        ((uint32_t *)stra_box)[19] = bswap32( qlvl->MaxHeight );
+        ((uint32_t *)stra_box)[20] = bswap32( qlvl->SamplingRate );
+        ((uint32_t *)stra_box)[21] = bswap32( qlvl->Channels );
+        ((uint32_t *)stra_box)[22] = bswap32( qlvl->BitsPerSample );
+        ((uint32_t *)stra_box)[23] = bswap32( qlvl->AudioTag );
+        ((uint16_t *)stra_box)[48] = bswap16( qlvl->nBlockAlign );
+
+        if( !qlvl->CodecPrivateData )
             continue;
-        stra_box[50] = (sms->id & 0xff00)>>8;
-        stra_box[51] = sms->id & 0xff;
-
-        ((uint32_t *)stra_box)[13] = bswap32( sms->timescale );
-        ((uint64_t *)stra_box)[7] = bswap64( p_sys->vod_duration );
-
-        const quality_level_t *qlvl = sms->current_qlvl;
-        if ( qlvl )
-        {
-            FourCC = qlvl->FourCC ? qlvl->FourCC : sms->default_FourCC;
-            ((uint32_t *)stra_box)[16] = bswap32( FourCC );
-            ((uint32_t *)stra_box)[17] = bswap32( qlvl->Bitrate );
-            ((uint32_t *)stra_box)[18] = bswap32( qlvl->MaxWidth );
-            ((uint32_t *)stra_box)[19] = bswap32( qlvl->MaxHeight );
-            ((uint32_t *)stra_box)[20] = bswap32( qlvl->SamplingRate );
-            ((uint32_t *)stra_box)[21] = bswap32( qlvl->Channels );
-            ((uint32_t *)stra_box)[22] = bswap32( qlvl->BitsPerSample );
-            ((uint32_t *)stra_box)[23] = bswap32( qlvl->AudioTag );
-            ((uint16_t *)stra_box)[48] = bswap16( qlvl->nBlockAlign );
-
-            if( !qlvl->CodecPrivateData )
-                continue;
-            stra_box[98] = stra_box[99] = stra_box[100] = 0; /* reserved */
-            stra_box[101] = strlen( qlvl->CodecPrivateData ) / 2;
-            if ( stra_box[101] > STRA_SIZE - 102 )
-                stra_box[101] = STRA_SIZE - 102;
-            uint8_t *binary_cpd = decode_string_hex_to_binary( qlvl->CodecPrivateData );
-            memcpy( stra_box + 102, binary_cpd, stra_box[101] );
-            free( binary_cpd );
-        }
+        stra_box[98] = stra_box[99] = stra_box[100] = 0; /* reserved */
+        stra_box[101] = strlen( qlvl->CodecPrivateData ) / 2;
+        if ( stra_box[101] > STRA_SIZE - 102 )
+            stra_box[101] = STRA_SIZE - 102;
+        uint8_t *binary_cpd = decode_string_hex_to_binary( qlvl->CodecPrivateData );
+        memcpy( stra_box + 102, binary_cpd, stra_box[101] );
+        free( binary_cpd );
     }
+    FOREACH_END();
 
     return VLC_SUCCESS;
 }
@@ -467,15 +465,9 @@ static chunk_t *build_init_chunk( stream_t *s )
     if( unlikely( ret == NULL ) )
         goto build_init_chunk_error;
 
-    ret->size = SMOO_SIZE;
-    ret->data = malloc( SMOO_SIZE );
-    if( !ret->data )
-        goto build_init_chunk_error;
-
-    if( build_smoo_box( s, ret->data ) == VLC_SUCCESS)
+    if( build_smoo_box( s, ret ) == VLC_SUCCESS )
         return ret;
 
-    free( ret->data );
 build_init_chunk_error:
     free( ret );
     msg_Err( s, "build_init_chunk failed" );



More information about the vlc-commits mailing list