Re: [PATCH] mplex A/V precedence order
[email protected] Sun, 07 Mar 2010 16:15:37 +0100
| Newsgroups | gmane.comp.video.mjpeg.devel |
|---|---|
| Message-ID | <[email protected]> |
less is more ... sorry, new patch with less lines. > Hi, > > The multiplex strategy in mplex will add all non-video packages at > the end of a GOP. While i don't know about other formats (VCD and > so on), in case of DVD all video information is put at the > beginning of a VOBU and the remaining streams are sent to the end > of a VOBU, regardless of their timestamps This behaviour may cause > a buffer underrun in standalone players. > I cannot give concrete example for a real-live failure, but looking > at produced A/V streams (and code) gives me a strange feeling. > > The simple patch attached should cover this problem: It runs > backwards through the vector of elementary streams so that the > video stream will not gain too much precedence over the other > streams. > > Roland > > ------------------------------------------------------------------------------ Download Intel® Parallel Studio Eval Try the new software tools for yourself. Speed compiling, find bugs proactively, and fine-tune applications for parallel performance. See why Intel Parallel Studio got high marks during beta. http://p.sf.net/sfu/intel-sw-dev _______________________________________________ Mjpeg-developer mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/mjpeg-developer
multiplexor.diff
(text/plain, 1.2 KB)
--- mplex/multiplexor.cpp 2008-05-10 12:56:04.000000000 +0200
+++ mplex.new/multiplexor.cpp 2010-03-06 07:15:06.000000000 +0100
@@ -1255,8 +1267,19 @@
//
ElementaryStream *despatch = 0;
clockticks earliest = 0;
- for( str = estreams.begin(); str < estreams.end(); ++str )
+ // hmm... the original code gives video precedence over all other streams
+ // regardless of their DTS timestamp. This forces all non-video streams
+ // to be appended after a GOP ends. That behaviour may cause an underrun
+ // in the decoder's buffer
+ // original code:
+ //
+ // for( str = estreams.begin(); str < estreams.end(); ++str )
+ //
+ // solution: simply go backwards through the stream vector
+ str =estreams.end();
+ do
{
+ --str;
#ifdef STREAM_LOGGING
if( (*str)->MuxCompleted() )
mjpeg_debug( "%02x: complete", (*str)->stream_id );
@@ -1271,6 +1294,7 @@
);
#endif
+
if( (*str)->MuxPossible(current_SCR) &&
( !video_first || (*str)->Kind() == ElementaryStream::video )
)
@@ -1281,7 +1305,7 @@
earliest = (*str)->RequiredDTS();
}
}
- }
+ } while (str != estreams.begin());
if( underrun_ignore > 0 )
--underrun_ignore;