@ -605,6 +605,7 @@ static int parse_manifest_segmenturlnode(AVFormatContext *s, struct representati
char * media_val = NULL ;
char * range_val = NULL ;
int max_url_size = c ? c - > max_url_size : MAX_URL_SIZE ;
int err ;
if ( ! av_strcasecmp ( fragmenturl_node - > name , ( const char * ) " Initialization " ) ) {
initialization_val = xmlGetProp ( fragmenturl_node , " sourceURL " ) ;
@ -648,7 +649,11 @@ static int parse_manifest_segmenturlnode(AVFormatContext *s, struct representati
av_free ( seg ) ;
return AVERROR ( ENOMEM ) ;
}
dynarray_add ( & rep - > fragments , & rep - > n_fragments , seg ) ;
err = av_dynarray_add_nofree ( & rep - > fragments , & rep - > n_fragments , seg ) ;
if ( err < 0 ) {
free_fragment ( & seg ) ;
return err ;
}
}
}
@ -660,6 +665,7 @@ static int parse_manifest_segmenttimeline(AVFormatContext *s, struct representat
{
xmlAttrPtr attr = NULL ;
char * val = NULL ;
int err ;
if ( ! av_strcasecmp ( fragment_timeline_node - > name , ( const char * ) " S " ) ) {
struct timeline * tml = av_mallocz ( sizeof ( struct timeline ) ) ;
@ -685,7 +691,11 @@ static int parse_manifest_segmenttimeline(AVFormatContext *s, struct representat
attr = attr - > next ;
xmlFree ( val ) ;
}
dynarray_add ( & rep - > timelines , & rep - > n_timelines , tml ) ;
err = av_dynarray_add_nofree ( & rep - > timelines , & rep - > n_timelines , tml ) ;
if ( err < 0 ) {
av_free ( tml ) ;
return err ;
}
}
return 0 ;
@ -975,13 +985,15 @@ static int parse_manifest_representation(AVFormatContext *s, const char *url,
seg = av_mallocz ( sizeof ( struct fragment ) ) ;
if ( ! seg )
goto enomem ;
seg - > url = get_content_url ( baseurl_nodes , 4 , c - > max_url_size , rep_id_val , rep_bandwidth_val , NULL ) ;
if ( ! seg - > url ) {
ret = av_dynarray_add_nofree ( & rep - > fragments , & rep - > n_fragments , seg ) ;
if ( ret < 0 ) {
av_free ( seg ) ;
goto enom em ;
goto fr ee;
}
seg - > url = get_content_url ( baseurl_nodes , 4 , c - > max_url_size , rep_id_val , rep_bandwidth_val , NULL ) ;
if ( ! seg - > url )
goto enomem ;
seg - > size = - 1 ;
dynarray_add ( & rep - > fragments , & rep - > n_fragments , seg ) ;
} else if ( representation_segmentlist_node ) {
// TODO: https://www.brendanlong.com/the-structure-of-an-mpeg-dash-mpd.html
// http://www-itec.uni-klu.ac.at/dash/ddash/mpdGenerator.php?fragmentlength=15&type=full
@ -1051,18 +1063,20 @@ static int parse_manifest_representation(AVFormatContext *s, const char *url,
switch ( type ) {
case AVMEDIA_TYPE_VIDEO :
dynarray_add ( & c - > videos , & c - > n_videos , rep ) ;
ret = av_ dynarray_add_nofree ( & c - > videos , & c - > n_videos , rep ) ;
break ;
case AVMEDIA_TYPE_AUDIO :
dynarray_add ( & c - > audios , & c - > n_audios , rep ) ;
ret = av_ dynarray_add_nofree ( & c - > audios , & c - > n_audios , rep ) ;
break ;
case AVMEDIA_TYPE_SUBTITLE :
dynarray_add ( & c - > subtitles , & c - > n_subtitles , rep ) ;
ret = av_ dynarray_add_nofree ( & c - > subtitles , & c - > n_subtitles , rep ) ;
break ;
default :
av_log ( s , AV_LOG_WARNING , " Unsupported the stream type %d \n " , type ) ;
break ;
}
if ( ret < 0 )
goto free ;
}
}