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

Hugo Beauzée-Luyssen hugo at beauzee.fr
Mon Sep 24 21:56:19 CEST 2012


On Mon, Sep 24, 2012 at 5:28 PM, Sergey Radionov <rsatom at gmail.com> wrote:
> 2012/9/14 Sergey Radionov <rsatom at gmail.com>:
>> ---
>>  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 ca62a21..6ab136f 100644
>> --- a/modules/demux/mjpeg.c
>> +++ b/modules/demux/mjpeg.c
>> @@ -191,33 +191,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
>>      {
>> @@ -344,6 +319,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 ) {
Please but the brace on a newline.
>> +                free( content_type );
>> +                goto error;
>> +            }
>> +        }
>> +        free( content_type );
>> +    }
>> +
>>      b_matched = CheckMimeHeader( p_demux, &i_size);
>>      if( b_matched )
>>      {
>> @@ -393,6 +384,7 @@ static int Open( vlc_object_t * p_this )
>>      return VLC_SUCCESS;
>>
>>  error:
>> +    free( p_sys->psz_separator );
>>      free( p_sys );
>>      return VLC_EGENERIC;
>>  }
>> @@ -516,6 +508,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 ) ) )
>> +        {
This could probably be merged in the previous if

>> +            break;
>> +        }
>>
>>          i++;
>>          i_size++;
>> --
>> 1.7.7.1.msysgit.0
>>
>
> Anybody?
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> http://mailman.videolan.org/listinfo/vlc-devel

Despite some cosmetic stuff, LGTM.

Regards,

-- 
Hugo Beauzée-Luyssen
mail: hugo at beauzee.fr
skype: beauze.h



More information about the vlc-devel mailing list