From: Petri H. <phi...@us...> - 2011-10-05 06:55:16
|
Torsten Jager wrote: > Addressing the long overdue lack of reordered dts/pts support. > > Part 1: a standalone fix for all streams that dont yet > provide such info. I've been using this code for months, just > added some cosmetics recently. (no comments yet) > Part 2: a backwards compatible base hack for real dts support. > Demuxers can be enhanced successively without breaking anything > else. > [...] > --- xine-lib-1.1.19/src/combined/ffmpeg/ff_video_decoder.c 2010-03-10 20:07:15.000000000 +0100 > +++ xine-lib-1.1.19/src/combined/ffmpeg/ff_video_decoder.c 2011-09-05 22:35:06.000000000 +0200 > @@ -1553,7 +1699,7 @@ static void ff_decode_data (video_decode > > /* decode */ > if (buf->pts) > - this->pts = buf->pts; > + this->pts = buf->pts + buf->ptsoffs; > > if (this->is_mpeg12) { > ff_handle_mpeg12_buffer(this, buf); > --- xine-lib-1.1.19/src/xine-engine/buffer.c 2010-03-09 23:17:05.000000000 +0100 > +++ xine-lib-1.1.19/src/xine-engine/buffer.c 2011-08-27 12:17:27.000000000 +0200 > @@ -99,6 +99,7 @@ static buf_element_t *buffer_pool_alloc > /* set sane values to the newly allocated buffer */ > buf->content = buf->mem; /* 99% of demuxers will want this */ > buf->pts = 0; > + buf->ptsoffs = 0; > buf->size = 0; > buf->decoder_flags = 0; > memset(buf->decoder_info, 0, sizeof(buf->decoder_info)); > --- xine-lib-1.1.19/src/xine-engine/buffer.h 2010-03-23 16:46:03.000000000 +0100 > +++ xine-lib-1.1.19/src/xine-engine/buffer.h 2011-08-27 12:21:04.000000000 +0200 > @@ -333,6 +334,11 @@ struct buf_element_s { > void *source; /* pointer to source of this buffer for */ > /* free_buffer */ > > + /* TJ. decoding timestamp support. > + backwards compatible use: .pts = pts, leave .ptsoffs = 0 > + full use: .pts = dts, .ptsoffs = pts - dts */ > + int64_t ptsoffs; > + > } ; Would it make sense to keep pts field semantics unchanged ? You can still calculate dts from ptsoffs: dts = ptsoffs - buf->pts; I believe this would be more backwards-compatible and result in simpler code ? This seems to be API/ABI change that can't be applied to 1.1.x tree. Quick grep shows that current code (demux_mpeg_*) uses buf->decoder_info[0] for this. But decoder_info[0] is also used for video step (with BUF_FLAG_FRAME_STEP). Maybe some unused decoder_info[] could be allocated for pts-dts. Ex.: ----- buffer.h /* decoder_info[4] = pts - dts */ #define BUF_FLAG_DTS 0x4000 ----- demux if (buf->pts && dts && dts < buf->pts) { buf->decoder_flags |= BUF_FLAG_DTS; buf->decoder_info[4] = buf->pts - dts; } ----- decode if (buf->decoder_flags & BUF_FLAG_DTS) { dts = buf->pts - buf->decoder_info[4]; } else { /* no dts */ } I think dts might be useful in HDMV SPU decoder too. It is used to signal the time when segments are valid and should replace cached ones. Without dts it is possible that new objects replace cached ones too early, causing incorrect output. - Petri |