vlc | branch: master | Francois Cartegnie <fcvlc...@free.fr> | Thu May 1 14:41:39 2014 +0200| [839d173030838a61351331438dbbfc6bb7fa7487] | committer: Francois Cartegnie
stream_filter: smooth: some streamindex have no fragments (fix #11377) SteamIndex for Chapters have no stream, then no qlevels > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=839d173030838a61351331438dbbfc6bb7fa7487 --- modules/stream_filter/smooth/downloader.c | 50 ++++++++++--------- modules/stream_filter/smooth/smooth.c | 76 ++++++++++++++++++++++------- modules/stream_filter/smooth/utils.c | 3 +- 3 files changed, 88 insertions(+), 41 deletions(-) diff --git a/modules/stream_filter/smooth/downloader.c b/modules/stream_filter/smooth/downloader.c index a1291ef..4e43b5b 100644 --- a/modules/stream_filter/smooth/downloader.c +++ b/modules/stream_filter/smooth/downloader.c @@ -328,25 +328,28 @@ static int build_smoo_box( stream_t *s, uint8_t *smoo_box ) quality_level_t * qlvl = get_qlevel( sms, sms->download_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 */ - assert( strlen( qlvl->CodecPrivateData ) < 512 ); - stra_box[101] = strlen( qlvl->CodecPrivateData ) / 2; - uint8_t *binary_cpd = decode_string_hex_to_binary( qlvl->CodecPrivateData ); - memcpy( stra_box + 102, binary_cpd, stra_box[101] ); - free( binary_cpd ); + 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 */ + assert( strlen( qlvl->CodecPrivateData ) < 512 ); + stra_box[101] = strlen( qlvl->CodecPrivateData ) / 2; + uint8_t *binary_cpd = decode_string_hex_to_binary( qlvl->CodecPrivateData ); + memcpy( stra_box + 102, binary_cpd, stra_box[101] ); + free( binary_cpd ); + } } return VLC_SUCCESS; @@ -598,7 +601,7 @@ void* sms_Thread( void *p_this ) for( int i = 0; i < 3; i++ ) { sms = SMS_GET_SELECTED_ST( index_to_es_cat( i ) ); - if( sms ) + if( sms && vlc_array_count( sms->chunks ) ) { chunk = vlc_array_item_at_index( sms->chunks, 0 ); p_sys->download.lead[i] = chunk->start_time + p_sys->timescale / 1000; @@ -676,8 +679,11 @@ void* sms_Thread( void *p_this ) vlc_mutex_unlock( &p_sys->download.lock_wait ); sms = SMS_GET_SELECTED_ST( next_track( s ) ); - if( Download( s, sms ) != VLC_SUCCESS ) - goto cancel; + if ( vlc_array_count( sms->chunks ) ) + { + if( Download( s, sms ) != VLC_SUCCESS ) + goto cancel; + } } cancel: diff --git a/modules/stream_filter/smooth/smooth.c b/modules/stream_filter/smooth/smooth.c index 0199035..cf268fe 100644 --- a/modules/stream_filter/smooth/smooth.c +++ b/modules/stream_filter/smooth/smooth.c @@ -172,12 +172,15 @@ static int parse_Manifest( stream_t *s ) p_sys->timescale = TIMESCALE; } - if( !strcmp( node, "StreamIndex" ) ) { sms = sms_New(); if( unlikely( !sms ) ) + { + xml_ReaderDelete( vlc_reader ); + xml_Delete( vlc_xml ); return VLC_ENOMEM; + } sms->id = next_track_id; next_track_id++; @@ -225,15 +228,21 @@ static int parse_Manifest( stream_t *s ) else if( sms->type == SPU_ES ) sms->name = strdup( "text" ); } - - vlc_array_append( p_sys->sms_streams, sms ); } if( !strcmp( node, "QualityLevel" ) ) { + if ( !sms ) + break; + ql = ql_New(); if( !ql ) + { + sms_Free( sms ); + xml_ReaderDelete( vlc_reader ); + xml_Delete( vlc_xml ); return VLC_ENOMEM; + } ql->id = next_qid; next_qid++; while( (name = xml_ReaderNextAttr( vlc_reader, &value )) ) @@ -275,11 +284,21 @@ static int parse_Manifest( stream_t *s ) if( !strcmp( name, "BitsPerSample" ) ) ql->BitsPerSample = strtoul( value, NULL, 10 ); } + vlc_array_append( sms->qlevels, ql ); } + if ( !strcmp( node, "Content" ) && sms && !sms->url_template ) + { + /* empty(@Url) && ./Content == manifest embedded content */ + sms_Free( sms ); + sms = NULL; + } + if( !strcmp( node, "c" ) ) { + if ( !sms ) + break; loop_count++; start_time = duration = -1; while( (name = xml_ReaderNextAttr( vlc_reader, &value )) ) @@ -327,6 +346,9 @@ static int parse_Manifest( stream_t *s ) if( unlikely( chunk_New( sms, computed_duration, computed_start_time ) == NULL ) ) { + sms_Free( sms ); + xml_ReaderDelete( vlc_reader ); + xml_Delete( vlc_xml ); return VLC_ENOMEM; } if( b_weird && start_time != -1 ) @@ -338,17 +360,29 @@ static int parse_Manifest( stream_t *s ) if( strcmp( node, "StreamIndex" ) ) break; - computed_start_time = 0; - computed_duration = 0; - loop_count = 0; - if( b_weird && !chunk_New( sms, computed_duration, computed_start_time ) ) - return VLC_ENOMEM; + if ( sms ) + { + vlc_array_append( p_sys->sms_streams, sms ); - b_weird = false; - next_qid = 1; + computed_start_time = 0; + computed_duration = 0; + loop_count = 0; + if( b_weird && !chunk_New( sms, computed_duration, computed_start_time ) ) + { + sms_Free( sms ); + xml_ReaderDelete( vlc_reader ); + xml_Delete( vlc_xml ); + return VLC_ENOMEM; + } - if( sms->qlevel_nb == 0 ) - sms->qlevel_nb = vlc_array_count( sms->qlevels ); + b_weird = false; + next_qid = 1; + + if( sms->qlevel_nb == 0 ) + sms->qlevel_nb = vlc_array_count( sms->qlevels ); + + sms = NULL; + } break; case XML_READER_NONE: @@ -356,6 +390,9 @@ static int parse_Manifest( stream_t *s ) case XML_READER_TEXT: break; default: + sms_Free( sms ); + xml_ReaderDelete( vlc_reader ); + xml_Delete( vlc_xml ); return VLC_EGENERIC; } } @@ -437,14 +474,17 @@ static int Open( vlc_object_t *p_this ) { wanted = qlvl = NULL; sms = vlc_array_item_at_index( p_sys->sms_streams, i ); - wanted = vlc_array_item_at_index( sms->qlevels, 0 ); - for( unsigned i=1; i < sms->qlevel_nb; i++ ) + if ( vlc_array_count( sms->qlevels ) ) { - qlvl = vlc_array_item_at_index( sms->qlevels, i ); - if( qlvl->Bitrate < wanted->Bitrate ) - wanted = qlvl; + wanted = vlc_array_item_at_index( sms->qlevels, 0 ); + for( unsigned i=1; i < sms->qlevel_nb; i++ ) + { + qlvl = vlc_array_item_at_index( sms->qlevels, i ); + if( qlvl->Bitrate < wanted->Bitrate ) + wanted = qlvl; + } + sms->download_qlvl = wanted->id; } - sms->download_qlvl = wanted->id; } vlc_mutex_init( &p_sys->download.lock_wait ); diff --git a/modules/stream_filter/smooth/utils.c b/modules/stream_filter/smooth/utils.c index 5c180dc..9329102 100644 --- a/modules/stream_filter/smooth/utils.c +++ b/modules/stream_filter/smooth/utils.c @@ -115,6 +115,8 @@ sms_stream_t * sms_New( void ) void sms_Free( sms_stream_t *sms ) { + if ( !sms ) + return; if( sms->qlevels ) { for( int n = 0; n < vlc_array_count( sms->qlevels ); n++ ) @@ -138,7 +140,6 @@ void sms_Free( sms_stream_t *sms ) free( sms->name ); free( sms->url_template ); free( sms ); - sms = NULL; } quality_level_t *get_qlevel( sms_stream_t *sms, const unsigned qid ) _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits