lavc/mediacodec: rescale pts before decoding for both hw and sw buffers
authorAman Gupta <aman@tmm1.net>
Mon, 3 Jul 2017 16:21:50 +0000 (09:21 -0700)
committerMatthieu Bouron <matthieu.bouron@gmail.com>
Mon, 3 Jul 2017 21:39:06 +0000 (23:39 +0200)
Replicates the logic used in the wrap_hw_buffer path to wrap_sw_buffer
as well.

Fixes decoding issues observed on AMLogic devices with
OMX.amlogic.mpeg2.decoder.awesome, where the decoder would spit out a
constant stream of "mPtsRecoveryCount" errors and decoded frames were
returned in the incorrect order.

Signed-off-by: Matthieu Bouron <matthieu.bouron@gmail.com>
libavcodec/mediacodecdec_common.c

index f88b2cd..afa054f 100644 (file)
@@ -282,10 +282,16 @@ static int mediacodec_wrap_sw_buffer(AVCodecContext *avctx,
      * on the last avpacket received which is not in sync with the frame:
      *   * N avpackets can be pushed before 1 frame is actually returned
      *   * 0-sized avpackets are pushed to flush remaining frames at EOS */
-    frame->pts = info->presentationTimeUs;
+    if (avctx->pkt_timebase.num && avctx->pkt_timebase.den) {
+        frame->pts = av_rescale_q(info->presentationTimeUs,
+                                      av_make_q(1, 1000000),
+                                      avctx->pkt_timebase);
+    } else {
+        frame->pts = info->presentationTimeUs;
+    }
 #if FF_API_PKT_PTS
 FF_DISABLE_DEPRECATION_WARNINGS
-    frame->pkt_pts = info->presentationTimeUs;
+    frame->pkt_pts = frame->pts;
 FF_ENABLE_DEPRECATION_WARNINGS
 #endif
     frame->pkt_dts = AV_NOPTS_VALUE;
@@ -613,7 +619,7 @@ int ff_mediacodec_dec_decode(AVCodecContext *avctx, MediaCodecDecContext *s,
             memcpy(data, pkt->data + offset, size);
             offset += size;
 
-            if (s->surface && avctx->pkt_timebase.num && avctx->pkt_timebase.den) {
+            if (avctx->pkt_timebase.num && avctx->pkt_timebase.den) {
                 pts = av_rescale_q(pts, avctx->pkt_timebase, av_make_q(1, 1000000));
             }