[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