[vlc-devel] [PATCH] Smooth Streaming: fix manifest parsing (FourCC)

Frédéric Yhuel yhuelf at gmail.com
Fri Oct 5 19:19:56 CEST 2012


This patch fixes playback for this VOD stream:
http://mediadl.microsoft.com/mediadl/IISNET/SmoothMedia/Learn/795/Bill_Staples_Cineform.ism/Manifest
---
 modules/stream_filter/smooth/downloader.c |    4 +++-
 modules/stream_filter/smooth/smooth.c     |    3 +++
 modules/stream_filter/smooth/smooth.h     |    1 +
 3 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/modules/stream_filter/smooth/downloader.c b/modules/stream_filter/smooth/downloader.c
index 33cd09e..b5222d4 100644
--- a/modules/stream_filter/smooth/downloader.c
+++ b/modules/stream_filter/smooth/downloader.c
@@ -276,6 +276,7 @@ static int build_smoo_box( stream_t *s, uint8_t *smoo_box )
 {
     stream_sys_t *p_sys = s->p_sys;
     sms_stream_t *sms = NULL;
+    uint32_t FourCC;
 
     /* smoo */
     memset( smoo_box, 0, SMOO_SIZE );
@@ -327,7 +328,8 @@ static int build_smoo_box( stream_t *s, uint8_t *smoo_box )
 
         quality_level_t * qlvl = get_qlevel( sms, sms->download_qlvl );
 
-        ((uint32_t *)stra_box)[16] = bswap32( qlvl->FourCC );
+        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 );
diff --git a/modules/stream_filter/smooth/smooth.c b/modules/stream_filter/smooth/smooth.c
index 01281cc..3e7d9a5 100644
--- a/modules/stream_filter/smooth/smooth.c
+++ b/modules/stream_filter/smooth/smooth.c
@@ -203,6 +203,9 @@ static int parse_Manifest( stream_t *s )
                             stream_name = strdup( value );
                         if( !strcmp( name, "TimeScale" ) )
                             sms->timescale = strtoull( value, NULL, 10 );
+                        if( !strcmp( name, "FourCC" ) )
+                            sms->default_FourCC =
+                                VLC_FOURCC( value[0], value[1], value[2], value[3] );
 
                         if( !strcmp( name, "Chunks" ) )
                         {
diff --git a/modules/stream_filter/smooth/smooth.h b/modules/stream_filter/smooth/smooth.h
index 32adda6..04d2079 100644
--- a/modules/stream_filter/smooth/smooth.h
+++ b/modules/stream_filter/smooth/smooth.h
@@ -73,6 +73,7 @@ typedef struct sms_stream_s
 {
     vlc_array_t    *qlevels;       /* list of available Quality Levels */
     vlc_array_t    *chunks;        /* list of chunks */
+    uint32_t       default_FourCC;
     unsigned       vod_chunks_nb;  /* total num of chunks of the VOD stream */
     unsigned       timescale;
     unsigned       qlevel_nb;      /* number of quality levels */
-- 
1.7.9.5



More information about the vlc-devel mailing list