diff mbox

[FFmpeg-devel] lavc/mediacodec: rescale pts before decoding for both hw and sw buffers

Message ID 20170703162150.24652-1-ffmpeg@tmm1.net
State Accepted
Commit aad79e4323bb03837cc6611b99b72c1cf1a7b6f6
Headers show

Commit Message

Aman Karmani July 3, 2017, 4:21 p.m. UTC
From: Aman Gupta <aman@tmm1.net>

Replicates the logic used in the wrap_hw_buffer path to wrap_sw_buffer
as well.

This 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.
---
 libavcodec/mediacodecdec_common.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

Comments

Matthieu Bouron July 3, 2017, 9:46 p.m. UTC | #1
On Mon, Jul 03, 2017 at 09:21:50AM -0700, Aman Gupta wrote:
> From: Aman Gupta <aman@tmm1.net>
> 
> Replicates the logic used in the wrap_hw_buffer path to wrap_sw_buffer
> as well.
> 
> This 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.
> ---
>  libavcodec/mediacodecdec_common.c | 12 +++++++++---
>  1 file changed, 9 insertions(+), 3 deletions(-)
> 
> diff --git a/libavcodec/mediacodecdec_common.c b/libavcodec/mediacodecdec_common.c
> index 1263188d34..316cdba9c1 100644
> --- a/libavcodec/mediacodecdec_common.c
> +++ b/libavcodec/mediacodecdec_common.c
> @@ -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));
>              }
>  
> -- 
> 2.11.0 (Apple Git-81)

Applied. Thanks.

[...]
diff mbox

Patch

diff --git a/libavcodec/mediacodecdec_common.c b/libavcodec/mediacodecdec_common.c
index 1263188d34..316cdba9c1 100644
--- a/libavcodec/mediacodecdec_common.c
+++ b/libavcodec/mediacodecdec_common.c
@@ -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));
             }