diff options
author | Aman Gupta <aman@tmm1.net> | 2017-07-03 19:21:50 +0300 |
---|---|---|
committer | Matthieu Bouron <matthieu.bouron@gmail.com> | 2017-07-04 00:39:06 +0300 |
commit | aad79e4323bb03837cc6611b99b72c1cf1a7b6f6 (patch) | |
tree | 85d741e536fca60d345a2a6ce5ad9a02233d1dec | |
parent | 6d4a686d45218fd9ac312fd3f3056680ce169d40 (diff) |
lavc/mediacodec: rescale pts before decoding for both hw and sw buffers
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>
-rw-r--r-- | libavcodec/mediacodecdec_common.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/libavcodec/mediacodecdec_common.c b/libavcodec/mediacodecdec_common.c index f88b2cde54..afa054f83e 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)); } |