[FFmpeg-devel] Bugreport: mpegts-demuxer gives wrong pts/dts with avchd files
Thorsten Jordan
tjordan
Thu Feb 28 14:58:27 CET 2008
M?ns Rullg?rd schrieb:
> Thorsten Jordan <tjordan at macrosystem.de> writes:
>
>> Hello,
>>
>> i just stumbled over misbehvaiour of the mpegts-demuxer of ffmpeg. I
>
> [...]
>
>> Who maintains the mpegts demuxer?
>
> That would be me. Please upload a sample to mphq.
>
Hello,
i debugged a bit more and deeper and found out more things.
Intro (again): What is the problem?
I have here AVCHD-files from a Camera (kind of transport-stream) that
store h.264 video (and AC3 audio) in PAFF mode - that is field after
field. Only every top field has PTS values, only I/P frames have DTS
values. When reading the file with libavformat, wrong values are given
for AVPacket's pts/dts, the pts of the top field of the second frame
(B-frame) is associated to the bottom field of the first frame (I-frame).
After some debugging i suppose this is not h.264/PAFF specific but could
happen with mpeg2 video as well.
Here is the reason: payload of ts packets is given to av_parser_parse()
in libavformat/utils.c line ca. 795 together with pts/dts that is
available for the data chunk. Then in libavcodec/parser.c, in
av_parser_parse() line ca. 125 the pts/dts values are stored. AFTER that
parser->parser_parse() is called - the format specific frame parser.
It will report a frame (here a field) as finished when the current data
chunk allows to find its end. The TS-packet payload here just starts
with a new frame/field. But there the pts/dts values of the NEXT
frame/field are already stored and attached in line 142 ff.
ISO 13818-1 states explicity that the pts is for the access unit that
starts after the pts is given.
A possible first-thought fix would be here to call the parser first and
then associate the pts afterwards - but it would be wrong as well. One
more complex but correct solution would be to give the pts/dts to the
parser itself and let it associate it with the material. Alternativly at
that part of the code a one-stage buffering would be needed, so the
buffered pts/dts (if existing) is associated to a completely parsed
frame/field and afterwards replaced by the newly given pts/dts.
An example file has already been uploaded ca. one week ago.
--
Mit freundlichen Gr??en, Thorsten
More information about the ffmpeg-devel
mailing list