From: Jan Schmidt Date: Fri, 4 Jul 2014 05:13:32 +0000 (+1000) Subject: decoder: mpeg2: respect any input PTS provided for a frame. X-Git-Tag: 0.5.9~33 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fupstream%2Fgstreamer-vaapi.git;a=commitdiff_plain;h=22dc8c42514e1d5d3f89d064e52b252f01fce54b decoder: mpeg2: respect any input PTS provided for a frame. The timestamp generator in gstvaapidecoder_mpeg2.c always interpolated frame timestamps within a GOP, even when it's been fed input PTS for every frame. That leads to incorrect output timestamps in some situations - for example live playback where input timestamps have been scaled based on arrival time from the network and don't exactly match the framerate. https://bugzilla.gnome.org/show_bug.cgi?id=732719 --- diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_mpeg2.c b/gst-libs/gst/vaapi/gstvaapidecoder_mpeg2.c index 3f30f0b..c3ab7a6 100644 --- a/gst-libs/gst/vaapi/gstvaapidecoder_mpeg2.c +++ b/gst-libs/gst/vaapi/gstvaapidecoder_mpeg2.c @@ -130,7 +130,9 @@ pts_eval(PTSGenerator *tsg, GstClockTime pic_pts, guint pic_tsn) if (!GST_CLOCK_TIME_IS_VALID(tsg->gop_pts)) tsg->gop_pts = 0; - pts = tsg->gop_pts + pts_get_duration(tsg, tsg->ovl_tsn * 1024 + pic_tsn); + pts = pic_pts; + if (!GST_CLOCK_TIME_IS_VALID (pts)) + pts = tsg->gop_pts + pts_get_duration(tsg, tsg->ovl_tsn * 1024 + pic_tsn); if (!GST_CLOCK_TIME_IS_VALID(tsg->max_pts) || tsg->max_pts < pts) tsg->max_pts = pts; @@ -142,6 +144,7 @@ pts_eval(PTSGenerator *tsg, GstClockTime pic_pts, guint pic_tsn) tsg->ovl_tsn++; } tsg->lst_tsn = pic_tsn; + return pts; }