vlc | branch: master | Francois Cartegnie <fcvlc...@free.fr> | Sun Nov 9 19:51:08 2014 +0100| [0d862d0b1c84ad6800636b57792339bad4a9e587] | committer: Francois Cartegnie
stream_filter: smooth: parse chunks using libmp4.h Gets rid of the checkless and expecting in-order data read functions. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=0d862d0b1c84ad6800636b57792339bad4a9e587 --- modules/stream_filter/Makefile.am | 7 ++- modules/stream_filter/smooth/downloader.c | 95 +++++++++++------------------ 2 files changed, 41 insertions(+), 61 deletions(-) diff --git a/modules/stream_filter/Makefile.am b/modules/stream_filter/Makefile.am index 3de529d..42c2053 100644 --- a/modules/stream_filter/Makefile.am +++ b/modules/stream_filter/Makefile.am @@ -99,9 +99,12 @@ libsmooth_plugin_la_SOURCES = \ stream_filter/smooth/smooth.c \ stream_filter/smooth/utils.c \ stream_filter/smooth/downloader.c \ - stream_filter/smooth/smooth.h - + stream_filter/smooth/smooth.h \ + demux/mp4/libmp4.c demux/mp4/libmp4.h libsmooth_plugin_la_CFLAGS = $(AM_CFLAGS) +if HAVE_ZLIB +libsmooth_plugin_la_LIBADD = -lz +endif stream_filter_LTLIBRARIES += libsmooth_plugin.la libhds_plugin_la_SOURCES = \ diff --git a/modules/stream_filter/smooth/downloader.c b/modules/stream_filter/smooth/downloader.c index 1216f20..e1efcdd 100644 --- a/modules/stream_filter/smooth/downloader.c +++ b/modules/stream_filter/smooth/downloader.c @@ -297,77 +297,54 @@ BandwidthAdaptation( stream_t *s, sms_stream_t *sms, static int get_new_chunks( stream_t *s, chunk_t *ck, sms_stream_t *sms ) { - stream_sys_t *p_sys = s->p_sys; - - uint8_t *slice = ck->data; - if( !slice ) + if( ck->size < 24 ) return VLC_EGENERIC; - uint8_t version, fragment_count; - uint32_t size, type, flags; - UUID_t uuid; - TfrfBoxDataFields_t *tfrf_df; - - 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 ); + stream_t *ck_s = stream_MemoryNew( s, ck->data, ck->size, true ); + if ( !ck_s ) + return VLC_EGENERIC; - for(;;) + MP4_Box_t root_box = { 0 }; + root_box.i_type = ATOM_root; + root_box.i_size = ck->size; + if ( MP4_ReadBoxContainerChildren( ck_s, &root_box, 0 ) != 1 ) { - SMS_GET4BYTES( size ); - assert( size > 1 ); - SMS_GETFOURCC( type ); - if( type == ATOM_mdat ) - { - msg_Err( s, "No uuid box found :-(" ); - return VLC_EGENERIC; - } - else if( type == ATOM_uuid ) - { - GetUUID( &uuid, slice); - if( !CmpUUID( &uuid, &TfrfBoxUUID ) ) - break; - } - slice += size - 8; - } - - slice += 16; - SMS_GET1BYTE( version ); - SMS_GET3BYTES( flags ); - SMS_GET1BYTE( fragment_count ); - - tfrf_df = calloc( fragment_count, sizeof( TfrfBoxDataFields_t ) ); - if( unlikely( tfrf_df == NULL ) ) + stream_Delete( ck_s ); return VLC_EGENERIC; + } +#ifndef NDEBUG + MP4_BoxDumpStructure( ck_s, &root_box ); +#endif - for( uint8_t i = 0; 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 ) { - SMS_GET4or8BYTES( tfrf_df[i].i_fragment_abs_time ); - SMS_GET4or8BYTES( tfrf_df[i].i_fragment_duration ); + if ( !CmpUUID( &uuid_box->i_uuid, &TfrfBoxUUID ) ) + break; + uuid_box = uuid_box->p_next; } - msg_Dbg( s, "read box: \"tfrf\" version %d, flags 0x%x, "\ - "fragment count %"PRIu8, version, flags, fragment_count ); - - for( uint8_t i = 0; i < fragment_count; i++ ) + if ( uuid_box ) { - uint64_t dur = tfrf_df[i].i_fragment_duration; - uint64_t stime = tfrf_df[i].i_fragment_abs_time; - msg_Dbg( s, "\"tfrf\" fragment duration %"PRIu64", "\ - "fragment abs time %"PRIu64, 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 ); + } + } - if( !chunk_Get( sms, stime + dur ) ) - chunk_AppendNew( sms, dur, stime ); + MP4_Box_t *p_box = root_box.p_first; + while( p_box ) + { + MP4_BoxFree( ck_s, p_box ); + p_box = p_box->p_next; } - free( tfrf_df ); + stream_Delete( ck_s ); return VLC_SUCCESS; } _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits