[vlc-devel] [PATCH] added handling of wrong MIME boundary separator to mjpeg demux
Sergey Radionov
rsatom at gmail.com
Fri Sep 7 14:08:04 CEST 2012
2012/9/4 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 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 );
> + }
> +
> 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++;
> --
> 1.7.7.1.msysgit.0
>
any comment please?
More information about the vlc-devel
mailing list