stream_filter: smooth: merge trackid fix with chunk read
authorFrancois Cartegnie <fcvlcdev@free.fr>
Sun, 9 Nov 2014 15:51:16 +0000 (16:51 +0100)
committerFrancois Cartegnie <fcvlcdev@free.fr>
Mon, 10 Nov 2014 11:58:32 +0000 (12:58 +0100)
And drop all unused and useless code

modules/stream_filter/smooth/downloader.c
modules/stream_filter/smooth/smooth.c
modules/stream_filter/smooth/smooth.h

index e1efcdd..8c83133 100644 (file)
@@ -135,39 +135,6 @@ static chunk_t * chunk_Get( sms_stream_t *sms, const uint64_t start_time )
     return p_chunk;
 }
 
-static unsigned set_track_id( chunk_t *chunk, const unsigned tid )
-{
-    uint32_t size, type;
-    if( !chunk->data || chunk->size < 32 )
-        return 0;
-    uint8_t *slice = chunk->data;
-    if( !slice )
-        return 0;
-
-    SMS_GET4BYTES( size );
-    SMS_GETFOURCC( type );
-    assert( type == ATOM_moof );
-
-    SMS_GET4BYTES( size );
-    SMS_GETFOURCC( type );
-    assert( type == ATOM_mfhd );
-    slice += size - 8;
-
-    SMS_GET4BYTES( size );
-    SMS_GETFOURCC( type );
-    assert( type == ATOM_traf );
-
-    SMS_GET4BYTES( size );
-    SMS_GETFOURCC( type );
-    if( type != ATOM_tfhd )
-        return 0;
-
-    unsigned ret = bswap32( ((uint32_t *)slice)[1] );
-    ((uint32_t *)slice)[1] = bswap32( tid );
-
-    return ret;
-}
-
 static int sms_Download( stream_t *s, chunk_t *chunk, char *url )
 {
     stream_t *p_ts = stream_UrlNew( s, url );
@@ -295,7 +262,7 @@ BandwidthAdaptation( stream_t *s, sms_stream_t *sms,
 }
 #endif
 
-static int get_new_chunks( stream_t *s, chunk_t *ck, sms_stream_t *sms )
+static int parse_chunk( stream_t *s, chunk_t *ck, sms_stream_t *sms )
 {
     if( ck->size < 24 )
         return VLC_EGENERIC;
@@ -316,25 +283,33 @@ static int get_new_chunks( stream_t *s, chunk_t *ck, sms_stream_t *sms )
     MP4_BoxDumpStructure( ck_s, &root_box );
 #endif
 
-    const MP4_Box_t *uuid_box = MP4_BoxGet( &root_box, "moof/traf/uuid" );
-    while( uuid_box && uuid_box->i_type == ATOM_uuid )
-    {
-        if ( !CmpUUID( &uuid_box->i_uuid, &TfrfBoxUUID ) )
-            break;
-        uuid_box = uuid_box->p_next;
-    }
+    /* Do track ID fixup */
+    const MP4_Box_t *tfhd_box = MP4_BoxGet( &root_box, "moof/traf/tfhd" );
+    if ( tfhd_box )
+        SetDWBE( &ck->data[tfhd_box->i_pos + 8 + 4], sms->id );
 
-    if ( uuid_box )
+    if ( s->p_sys->b_live )
     {
-        const MP4_Box_data_tfrf_t *p_tfrfdata = uuid_box->data.p_tfrf;
-        for ( uint8_t i=0; i<p_tfrfdata->i_fragment_count; i++ )
+        const MP4_Box_t *uuid_box = MP4_BoxGet( &root_box, "moof/traf/uuid" );
+        while( uuid_box && uuid_box->i_type == ATOM_uuid )
+        {
+            if ( !CmpUUID( &uuid_box->i_uuid, &TfrfBoxUUID ) )
+                break;
+            uuid_box = uuid_box->p_next;
+        }
+
+        if ( uuid_box )
         {
-            uint64_t dur = p_tfrfdata->p_tfrf_data_fields[i].i_fragment_duration;
-            uint64_t stime = p_tfrfdata->p_tfrf_data_fields[i].i_fragment_abs_time;
-            msg_Dbg( s, "\"tfrf\" fragment duration %"PRIu64", "
-                        "fragment abs time %"PRIu64, dur, stime );
-            if( !chunk_Get( sms, stime + dur ) )
-                chunk_AppendNew( sms, dur, stime );
+            const MP4_Box_data_tfrf_t *p_tfrfdata = uuid_box->data.p_tfrf;
+            for ( uint8_t i=0; i<p_tfrfdata->i_fragment_count; i++ )
+            {
+                uint64_t dur = p_tfrfdata->p_tfrf_data_fields[i].i_fragment_duration;
+                uint64_t stime = p_tfrfdata->p_tfrf_data_fields[i].i_fragment_abs_time;
+                msg_Dbg( s, "\"tfrf\" fragment duration %"PRIu64", "
+                            "fragment abs time %"PRIu64, dur, stime );
+                if( !chunk_Get( sms, stime + dur ) )
+                    chunk_AppendNew( sms, dur, stime );
+            }
         }
     }
 
@@ -506,17 +481,7 @@ static int Download( stream_t *s, sms_stream_t *sms )
     }
     duration = mdate() - duration;
 
-    unsigned real_id = set_track_id( chunk, sms->id );
-    if( real_id == 0)
-    {
-        msg_Err( s, "tfhd box not found or invalid chunk" );
-        return VLC_EGENERIC;
-    }
-
-    if( p_sys->b_live )
-    {
-        get_new_chunks( s, chunk, sms );
-    }
+    parse_chunk( s, chunk, sms );
 
     msg_Info( s, "downloaded chunk @%"PRIu64" from stream %s at quality %u",
                  chunk->start_time, sms->name, sms->current_qlvl->Bitrate );
index 93e7887..3b56cf1 100644 (file)
@@ -761,12 +761,6 @@ static unsigned int sms_Read( stream_t *s, uint8_t *p_read, unsigned int i_read
             const char *verb = p_read == NULL ? "skipping" : "reading";
             msg_Dbg( s, "%s chunk time %"PRIu64" (%u bytes), type %i",
                         verb, chunk->start_time, i_read, chunk->type );
-            /* check integrity */
-            uint32_t type;
-            uint8_t *slice = chunk->data;
-            SMS_GET4BYTES( type );
-            SMS_GETFOURCC( type );
-            assert( type == ATOM_moof || type == ATOM_uuid );
         }
 
         uint64_t len = 0;
index 98a06fa..06f7236 100644 (file)
@@ -141,37 +141,6 @@ struct stream_sys_t
     bool        b_close;     /* set by Close() */
 };
 
-#define SMS_GET4BYTES( dst ) do { \
-    dst = U32_AT( slice ); \
-    slice += 4; \
-  } while(0)
-
-#define SMS_GET1BYTE( dst ) do { \
-    dst = *slice; \
-    slice += 1; \
-  } while(0)
-
-#define SMS_GET3BYTES( dst ) do { \
-    dst = Get24bBE( slice ); \
-    slice += 3; \
-  } while(0)
-
-#define SMS_GET8BYTES( dst ) do { \
-    dst = U64_AT( slice ); \
-    slice += 8; \
-  } while(0)
-
-#define SMS_GET4or8BYTES( dst ) \
-    if( (version) == 0 ) \
-        SMS_GET4BYTES( dst ); \
-    else \
-        SMS_GET8BYTES( dst ); \
-
-#define SMS_GETFOURCC( dst ) do { \
-    memcpy( &dst, slice, 4 ); \
-    slice += 4; \
-  } while(0)
-
 #define SMS_GET_SELECTED_ST( cat ) \
     sms_get_stream_by_cat( p_sys, cat )