FFMPEG Plugin: Fix video start_time generation.
- Ensure that start times are increased monotonically for video formats that contain B-frames, too, as expected by the BMediaDecoders. Previously start times were returned that seemed to go back in time for videos containing B-frames. Tested with resolutionchange.mpg (\see http://samples.ffmpeg.org/MPEG2) Note: Even though start times aren't going back in time anymore there are times where two consecutive start times are equal. This would need more research once this exposes a bug in a real application. Further more this might seem like a new bug, but before this commit the equal start times would have simply some different start time[s] in between. So at most this is the same bug just wearing new clothes :) - Documentation updated accordingly.
This commit is contained in:
@@ -701,18 +701,22 @@ StreamBase::GetNextChunk(const void** chunkBuffer,
|
|||||||
mediaHeader->destination = -1;
|
mediaHeader->destination = -1;
|
||||||
mediaHeader->time_source = -1;
|
mediaHeader->time_source = -1;
|
||||||
mediaHeader->size_used = fPacket.size;
|
mediaHeader->size_used = fPacket.size;
|
||||||
if (fPacket.pts != kNoPTSValue) {
|
|
||||||
//TRACE(" PTS: %lld (time_base.num: %d, .den: %d), stream DTS: %lld\n",
|
// FFmpeg recommends to use the decoding time stamps as primary source
|
||||||
//fPacket.pts, fStream->time_base.num, fStream->time_base.den,
|
// for presentation time stamps, especially for video formats that are
|
||||||
//fStream->cur_dts);
|
// using frame reordering. More over this way it is ensured that the
|
||||||
mediaHeader->start_time = _ConvertFromStreamTimeBase(fPacket.pts);
|
// returned start times are ordered in a monotonically increasing time
|
||||||
} else {
|
// series (even for videos that contain B-frames).
|
||||||
//TRACE(" PTS (stream): %lld (time_base.num: %d, .den: %d), stream DTS: %lld\n",
|
// \see http://git.videolan.org/?p=ffmpeg.git;a=blob;f=libavformat/avformat.h;h=1e8a6294890d580cd9ebc684eaf4ce57c8413bd8;hb=9153b33a742c4e2a85ff6230aea0e75f5a8b26c2#l1623
|
||||||
//lastStreamDTS, fStream->time_base.num, fStream->time_base.den,
|
bigtime_t presentationTimeStamp;
|
||||||
//fStream->cur_dts);
|
if (fPacket.dts != kNoPTSValue)
|
||||||
mediaHeader->start_time
|
presentationTimeStamp = fPacket.dts;
|
||||||
= _ConvertFromStreamTimeBase(lastStreamDTS);
|
else if (fPacket.pts != kNoPTSValue)
|
||||||
}
|
presentationTimeStamp = fPacket.pts;
|
||||||
|
else
|
||||||
|
presentationTimeStamp = lastStreamDTS;
|
||||||
|
|
||||||
|
mediaHeader->start_time = _ConvertFromStreamTimeBase(presentationTimeStamp);
|
||||||
mediaHeader->file_pos = fPacket.pos;
|
mediaHeader->file_pos = fPacket.pos;
|
||||||
mediaHeader->data_offset = 0;
|
mediaHeader->data_offset = 0;
|
||||||
switch (mediaHeader->type) {
|
switch (mediaHeader->type) {
|
||||||
|
|||||||
Reference in New Issue
Block a user