[vlc-devel] [PATCH] added handling of wrong MIME boundary separator to mjpeg demux

Sergey Radionov rsatom at gmail.com
Sun Sep 30 06:49:00 CEST 2012


---
 modules/demux/mjpeg.c | 53 ++++++++++++++++++++++++---------------------------
 1 file changed, 25 insertions(+), 28 deletions(-)

diff --git a/modules/demux/mjpeg.c b/modules/demux/mjpeg.c
index cf9d659..b8c5ec4 100644
--- a/modules/demux/mjpeg.c
+++ b/modules/demux/mjpeg.c
@@ -189,33 +189,8 @@ static bool CheckMimeHeader( demux_t *p_demux, int *p_header_size )
     if( strncmp( (char *)p_sys->p_peek, "--", 2 ) != 0
         && strncmp( (char *)p_sys->p_peek, "\r\n--", 4 ) != 0 )
     {
-        /* Some broken stream may lack the first boundary */
-        if ( p_sys->psz_separator == NULL )
-        {
-            msg_Warn( p_demux, "Malformed stream. Trying to work around");
-            char *content_type = stream_ContentType( p_demux->s );
-            if ( content_type == NULL )
-                return false;
-            const char* boundary = strstr( content_type, "boundary=--" );
-            if ( boundary != NULL )
-            {
-                p_sys->psz_separator = strdup( boundary + strlen( "boundary=--" ) );
-                msg_Dbg( p_demux, "Video boundary extracted from Content-Type: %s", p_sys->psz_separator );
-                free( content_type );
-                /* Skip to HTTP header parsing as there's no boundary to extract
-                 * from the stream */
-            }
-            else
-            {
-                free( content_type );
-                return false;
-            }
-        }
-        else
-        {
-            *p_header_size = 0;
-            return false;
-        }
+        *p_header_size = 0;
+        return false;
     }
     else
     {
@@ -340,6 +315,23 @@ static int Open( vlc_object_t * p_this )
     p_sys->psz_separator = NULL;
     p_sys->i_frame_size_estimate = 15 * 1024;
 
+    char *content_type = stream_ContentType( p_demux->s );
+    if ( content_type )
+    {
+        //FIXME: this is not fully match to RFC
+        char* boundary = strstr( content_type, "boundary=" );
+        if( boundary )
+        {
+            p_sys->psz_separator = strdup( boundary + strlen("boundary=") );
+            if( !p_sys->psz_separator )
+            {
+                free( content_type );
+                goto error;
+            }
+        }
+        free( content_type );
+    }
+
     b_matched = CheckMimeHeader( p_demux, &i_size);
     if( b_matched )
     {
@@ -389,6 +381,7 @@ static int Open( vlc_object_t * p_this )
     return VLC_SUCCESS;
 
 error:
+    free( p_sys->psz_separator );
     free( p_sys );
     return VLC_EGENERIC;
 }
@@ -507,8 +500,12 @@ static int MimeDemux( demux_t *p_demux )
             }
         }
 
+        //sometimes in Content-Type the boundary is defined something like "--video boundary--"
         if( !strncmp( p_sys->psz_separator, (char *)(p_sys->p_peek + i + 2),
-                      strlen( p_sys->psz_separator ) ) )
+                      strlen( p_sys->psz_separator ) ) ||
+            ( !strncmp( p_sys->psz_separator, "--", 2 ) &&
+              !strncmp( p_sys->psz_separator, (char *)(p_sys->p_peek + i),
+                        strlen( p_sys->psz_separator ) ) ) )
         {
             break;
         }
-- 
1.7.11.msysgit.1




More information about the vlc-devel mailing list