<br>ืิฯาฮษห, 11 ำลฮิัยาั 2012šว. ะฯฬฺุฯืมิลฬุ Sergey Radionov  ะษำมฬ:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">---<br>
šmodules/demux/mjpeg.c | š 53 ++++++++++++++++++++++++-------------------------<br>
š1 files changed, 26 insertions(+), 27 deletions(-)<br>
<br>
diff --git a/modules/demux/mjpeg.c b/modules/demux/mjpeg.c<br>
index a057db3..b6c7445 100644<br>
--- a/modules/demux/mjpeg.c<br>
+++ b/modules/demux/mjpeg.c<br>
@@ -193,33 +193,8 @@ static bool CheckMimeHeader( demux_t *p_demux, int *p_header_size )<br>
š š šif( strncmp( (char *)p_sys->p_peek, "--", 2 ) != 0<br>
š š š š š&& strncmp( (char *)p_sys->p_peek, "\r\n--", 4 ) != 0 )<br>
š š š{<br>
- š š š š/* Some broken stream may lack the first boundary */<br>
- š š š šif ( p_sys->psz_separator == NULL )<br>
- š š š š{<br>
- š š š š š šmsg_Warn( p_demux, "Malformed stream. Trying to work around");<br>
- š š š š š šchar *content_type = stream_ContentType( p_demux->s );<br>
- š š š š š šif ( content_type == NULL )<br>
- š š š š š š š šreturn false;<br>
- š š š š š šconst char* boundary = strstr( content_type, "boundary=--" );<br>
- š š š š š šif ( boundary != NULL )<br>
- š š š š š š{<br>
- š š š š š š š šp_sys->psz_separator = strdup( boundary + strlen( "boundary=--" ) );<br>
- š š š š š š š šmsg_Dbg( p_demux, "Video boundary extracted from Content-Type: %s", p_sys->psz_separator );<br>
- š š š š š š š šfree( content_type );<br>
- š š š š š š š š/* Skip to HTTP header parsing as there's no boundary to extract<br>
- š š š š š š š š * from the stream */<br>
- š š š š š š}<br>
- š š š š š šelse<br>
- š š š š š š{<br>
- š š š š š š š šfree( content_type );<br>
- š š š š š š š šreturn false;<br>
- š š š š š š}<br>
- š š š š}<br>
- š š š šelse<br>
- š š š š{<br>
- š š š š š š*p_header_size = 0;<br>
- š š š š š šreturn false;<br>
- š š š š}<br>
+ š š š š*p_header_size = 0;<br>
+ š š š šreturn false;<br>
š š š}<br>
š š šelse<br>
š š š{<br>
@@ -351,6 +326,22 @@ static int Open( vlc_object_t * p_this )<br>
š š š š šgoto error;<br>
š š š}<br>
<br>
+ š šchar *content_type = stream_ContentType( p_demux->s );<br>
+ š šif ( content_type )<br>
+ š š{<br>
+ š š š š//FIXME: this is not fully match to RFC<br>
+ š š š šchar* boundary = strstr( content_type, "boundary=" );<br>
+ š š š šif( boundary )<br>
+ š š š š{<br>
+ š š š š š šp_sys->psz_separator = strdup( boundary + strlen("boundary=") );<br>
+ š š š š š šif( !p_sys->psz_separator ) {<br>
+ š š š š š š š šfree( content_type );<br>
+ š š š š š š š šgoto error;<br>
+ š š š š š š}<br>
+ š š š š}<br>
+ š š š šfree( content_type );<br>
+ š š}<br>
+<br>
š š šb_matched = CheckMimeHeader( p_demux, &i_size);<br>
š š šif( b_matched )<br>
š š š{<br>
@@ -409,6 +400,7 @@ static int Open( vlc_object_t * p_this )<br>
š š šreturn VLC_SUCCESS;<br>
<br>
šerror:<br>
+ š šfree( p_sys->psz_separator );<br>
š š šfree( p_sys );<br>
š š šreturn VLC_EGENERIC;<br>
š}<br>
@@ -532,6 +524,13 @@ static int MimeDemux( demux_t *p_demux )<br>
š š š š š{<br>
š š š š š š šbreak;<br>
š š š š š}<br>
+ š š š š//sometimes in Content-Type the boundary is defined something like "--video boundary--"<br>
+ š š š šelse if( !strncmp( p_sys->psz_separator, "--", 2 ) &&<br>
+ š š š š š š š š !strncmp( p_sys->psz_separator, (char *)(p_sys->p_peek + i),<br>
+ š š š š š š š š strlen( p_sys->psz_separator ) ) )<br>
+ š š š š{<br>
+ š š š š š šbreak;<br>
+ š š š š}<br>
<br>
š š š š ši++;<br>
š š š š ši_size++;<br>
--<br>
1.7.7.1.msysgit.0<br>
<br>
</blockquote><div><br></div><div>Any comments please?š<span></span></div>