<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=KOI8-R" http-equiv="Content-Type">
  <title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
Levente Kovacs wrote:
<blockquote cite="mid20061006112541.7641964f.lkovacs@xperts.hu"
 type="cite">
  <pre wrap="">On Fri, 06 Oct 2006 12:10:37 +0300
Maxim Petrov <a class="moz-txt-link-rfc2396E" href="mailto:max@code-it-now.com">&lt;max@code-it-now.com&gt;</a> wrote:

  </pre>
  <blockquote type="cite">
    <pre wrap="">I have example of MPEG4 ES file (<a class="moz-txt-link-freetext" href="http://82.207.113.45/test.m4v">http://82.207.113.45/test.m4v</a>) which 
could not be correct parsed by "MPEG4VideoStreamParser"
I invesigated that in that stream "VIDEO_OBJECT_LAYER" code appears 
(randomly) after VOP and before next VOP.
I'm not sure if that's buggy stream or not, but ffmpeg decodes that 
stream without complains.
Could you please look at that file?
    </pre>
  </blockquote>
  <pre wrap=""><!---->
&gt;From what source did you capture thi file? I think this is not randomly, but after P_VOP before the first I_VOP in a new GVOP. Just an idea, did not looked in to the file.

  </pre>
</blockquote>
Stream like that send MangoDSP devices.. not sure about what's model
was sending exactly that stream.<br>
Yes, seems you are right.. VOL does not appear randomly, just before
next I_VOP.<br>
<br>
It looks like:<br>
<br>
parsing VisualObjectSequence<br>
profile_and_level_indication: 03<br>
parsing VisualObject<br>
visual_object_type: 0x1<br>
saw a video_object_start_code: 0x00000101<br>
parsing VideoObjectLayer<br>
vop_time_increment_resolution: 30<br>
fixed_vop_time_increment: 1<br>
fixed_vop_rate: 1; 'frame' (really tick) rate: 30.000000<br>
parsing GroupOfVideoObjectPlane<br>
time_code: 0x00040, hours 0, minutes 0, marker_bit 1, seconds 0<br>
<br>
#parsing VideoObjectPlane<br>
vop_coding_type: 0(I), modulo_time_base: 0, vop_time_increment: 0<br>
#parsing VideoObjectPlane<br>
vop_coding_type: 1(P), modulo_time_base: 0, vop_time_increment: 1<br>
#parsing VideoObjectPlane<br>
vop_coding_type: 1(P), modulo_time_base: 0, vop_time_increment: 2<br>
#parsing VideoObjectPlane<br>
vop_coding_type: 1(P), modulo_time_base: 0, vop_time_increment: 3<br>
#parsing VideoObjectPlane<br>
vop_coding_type: 1(P), modulo_time_base: 0, vop_time_increment: 4<br>
#parsing VideoObjectPlane<br>
vop_coding_type: 1(P), modulo_time_base: 0, vop_time_increment: 5<br>
#parsing VideoObjectPlane<br>
vop_coding_type: 1(P), modulo_time_base: 0, vop_time_increment: 6<br>
#parsing VideoObjectPlane<br>
vop_coding_type: 1(P), modulo_time_base: 0, vop_time_increment: 7<br>
#parsing VideoObjectPlane<br>
vop_coding_type: 1(P), modulo_time_base: 0, vop_time_increment: 8<br>
#parsing VideoObjectPlane<br>
vop_coding_type: 1(P), modulo_time_base: 0, vop_time_increment: 9<br>
<font color="#ff0000">MPEG4VideoStreamParser::parseVideoObjectPlane():
Saw unexpected code 0x120šš &lt;---- VOL start code here<br>
ššš šš šš šš šš šš šš šš šš šš šš šš šš šš šš šš šš šš šš šš šš šš šš
šš šš šš šš šš šš šš šš šš šš šš šš šš šš šš šš šš ššš But liveMedia
thinks that's VOP <br>
</font>#parsing VideoObjectPlane<br>
MPEG4VideoStreamParser::parseVideoObjectPlane(): marker bit not set!<br>
vop_coding_type: 0(I), modulo_time_base: 0, vop_time_increment: 1<br>
#parsing VideoObjectPlane<br>
vop_coding_type: 0(I), modulo_time_base: 0, vop_time_increment: 10<br>
....<br>
<br>
I've added little path to MPEG4VideoStreamFramer.cpp:<br>
<br>
@@ -634,7 +634,15 @@<br>
šš default: {<br>
šššš if (isVideoObjectStartCode(next4Bytes)) {<br>
šššššš setParseState(PARSING_VIDEO_OBJECT_LAYER);<br>
-ššš } else {<br>
+ššš } else if (isVideoObjectLayerStartCode(next4Bytes)){<br>
+ššššš // copy all bytes that we see, up until we reach a
VOP_START_CODE:<br>
+ššššš u_int32_t next4Bytes = get4Bytes();<br>
+ššššš while (next4Bytes != VOP_START_CODE) {<br>
+ššššššššššš saveToNextCode(next4Bytes);<br>
+ššššš }<br>
+ššššš setParseState(PARSING_VIDEO_OBJECT_PLANE);<br>
+ššš } else<br>
+ššš {<br>
šššššš usingSource()-&gt;envir() &lt;&lt;
"MPEG4VideoStreamParser::parseVideoObjectPlane(): Saw unexpected code "<br>
šššššššššššššššššššššššššššš &lt;&lt; (void*)next4Bytes &lt;&lt; "\n";<br>
šššššš setParseState(PARSING_VIDEO_OBJECT_PLANE); // the safest way to
recover...<br>
<br>
Works fine for me. But not sure if it will work fine for other streams.<br>
<pre class="moz-signature" cols="72">-- 
Bye, Maxim.
</pre>
</body>
</html>