vlc | branch: master | Francois Cartegnie <[email protected]> | Tue Oct 28 19:15:26 2014 +0100| [1b820cdae4971a971f5a55ad0bf7e6d9bc974b45] | committer: Francois Cartegnie
stream_filter: smooth: handle quality custom attributes > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=1b820cdae4971a971f5a55ad0bf7e6d9bc974b45 --- modules/stream_filter/smooth/smooth.c | 42 ++++++++++++++++++++++++++++++--- modules/stream_filter/smooth/smooth.h | 7 ++++++ modules/stream_filter/smooth/utils.c | 2 ++ 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/modules/stream_filter/smooth/smooth.c b/modules/stream_filter/smooth/smooth.c index 6e61aba..62fe468 100644 --- a/modules/stream_filter/smooth/smooth.c +++ b/modules/stream_filter/smooth/smooth.c @@ -145,6 +145,7 @@ static int parse_Manifest( stream_t *s ) uint8_t *WaveFormatEx; sms_stream_t *sms = NULL; quality_level_t *ql = NULL; + custom_attrs_t *cp = NULL; int64_t start_time = 0, duration = 0; int64_t computed_start_time = 0, computed_duration = 0; unsigned next_track_id = 1; @@ -230,6 +231,25 @@ static int parse_Manifest( stream_t *s ) sms->name = strdup( "text" ); } } + else if ( !strcmp( node, "CustomAttributes" ) ) + { + if (!sms || !ql || cp) + break; + cp = (custom_attrs_t *) calloc( 1, sizeof(*cp) ); + } + else if ( !strcmp( node, "Attribute" ) ) + { + if (!sms || !ql || !cp) + break; + while( (name = xml_ReaderNextAttr( vlc_reader, &value )) ) + { + if( !strcmp( name, "Name" ) && !cp->psz_key ) + cp->psz_key = strdup( value ); + else + if( !strcmp( name, "Value" ) && !cp->psz_value ) + cp->psz_value = strdup( value ); + } + } else if( !strcmp( node, "QualityLevel" ) ) { if ( !sms ) @@ -355,10 +375,26 @@ static int parse_Manifest( stream_t *s ) break; case XML_READER_ENDELEM: - if( strcmp( node, "StreamIndex" ) ) + if ( !strcmp( node, "CustomAttributes" ) ) + { + if ( cp ) + { + ARRAY_APPEND(ql->custom_attrs, cp); + cp = NULL; + } + } + else if ( !strcmp( node, "Attribute" ) ) + { + if( !cp->psz_key || !cp->psz_value ) + { + free( cp->psz_key ); + free( cp->psz_value ); + FREENULL( cp ); + } + } + else if( strcmp( node, "StreamIndex" ) ) break; - - if ( sms ) + else if ( sms ) { vlc_array_append( p_sys->sms_streams, sms ); diff --git a/modules/stream_filter/smooth/smooth.h b/modules/stream_filter/smooth/smooth.h index 5a546d8..c4121b1 100644 --- a/modules/stream_filter/smooth/smooth.h +++ b/modules/stream_filter/smooth/smooth.h @@ -52,6 +52,12 @@ typedef struct chunk_s uint8_t *data; } chunk_t; +typedef struct +{ + char *psz_key; + char *psz_value; +} custom_attrs_t; + typedef struct quality_level_s { int Index; @@ -66,6 +72,7 @@ typedef struct quality_level_s unsigned nBlockAlign; unsigned id; char *CodecPrivateData; /* hex encoded string */ + DECL_ARRAY(custom_attrs_t *) custom_attrs; } quality_level_t; diff --git a/modules/stream_filter/smooth/utils.c b/modules/stream_filter/smooth/utils.c index 3b17138..594483f 100644 --- a/modules/stream_filter/smooth/utils.c +++ b/modules/stream_filter/smooth/utils.c @@ -70,12 +70,14 @@ quality_level_t * ql_New( void ) if( unlikely( !ql ) ) return NULL; ql->Index = -1; + ARRAY_INIT(ql->custom_attrs); return ql; } void ql_Free( quality_level_t *qlevel ) { free( qlevel->CodecPrivateData ); + ARRAY_RESET(qlevel->custom_attrs); free( qlevel ); qlevel = NULL; } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
