[vlc-devel] [PATCH] added handling of wrong MIME boundary separator to mjpeg demux
Sergey Radionov
rsatom at gmail.com
Mon Sep 10 15:46:12 CEST 2012
2012/9/10 Rémi Denis-Courmont <remi at remlab.net>:
> Le mardi 4 septembre 2012 12:25:04, Sergey Radionov a écrit :
>> ---
>> modules/demux/mjpeg.c | 53
>> ++++++++++++++++++++++++------------------------- 1 files changed, 26
>> insertions(+), 27 deletions(-)
>>
>> diff --git a/modules/demux/mjpeg.c b/modules/demux/mjpeg.c
>> index a057db3..ca43fe0 100644
>> --- a/modules/demux/mjpeg.c
>> +++ b/modules/demux/mjpeg.c
>> @@ -193,33 +193,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
>> {
>> @@ -345,6 +320,22 @@ 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 );
>> + }
>> +
>
> That should probably be done AFTER the MXPEG check, no?
I am really don't know. Do you think it should?
>
>> if( IsMxpeg( p_demux->s ) && !p_demux->b_force )
>> {
>> // let avformat handle this case
>> @@ -409,6 +400,7 @@ static int Open( vlc_object_t * p_this )
>> return VLC_SUCCESS;
>>
>> error:
>> + free( p_sys->psz_separator );
>> free( p_sys );
>> return VLC_EGENERIC;
>> }
>> @@ -532,6 +524,13 @@ static int MimeDemux( demux_t *p_demux )
>> {
>> break;
>> }
>> + //sometimes in Content-Type the boundary is defined something like
>> "--video boundary--" + else if( !strncmp( p_sys->psz_separator,
>> "--", 2 ) &&
>> + !strncmp( p_sys->psz_separator, (char *)(p_sys->p_peek +
>> i), + strlen( p_sys->psz_separator ) ) )
>> + {
>> + break;
>> + }
>>
>> i++;
>> i_size++;
>
> --
> Rémi Denis-Courmont
> http://www.remlab.net/
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> http://mailman.videolan.org/listinfo/vlc-devel
More information about the vlc-devel
mailing list