Commit aad79e43 authored by Aman Gupta's avatar Aman Gupta Committed by Matthieu Bouron

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: 's avatarMatthieu Bouron <matthieu.bouron@gmail.com>
parent 6d4a686d
...@@ -282,10 +282,16 @@ static int mediacodec_wrap_sw_buffer(AVCodecContext *avctx, ...@@ -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: * on the last avpacket received which is not in sync with the frame:
* * N avpackets can be pushed before 1 frame is actually returned * * N avpackets can be pushed before 1 frame is actually returned
* * 0-sized avpackets are pushed to flush remaining frames at EOS */ * * 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 #if FF_API_PKT_PTS
FF_DISABLE_DEPRECATION_WARNINGS FF_DISABLE_DEPRECATION_WARNINGS
frame->pkt_pts = info->presentationTimeUs; frame->pkt_pts = frame->pts;
FF_ENABLE_DEPRECATION_WARNINGS FF_ENABLE_DEPRECATION_WARNINGS
#endif #endif
frame->pkt_dts = AV_NOPTS_VALUE; frame->pkt_dts = AV_NOPTS_VALUE;
...@@ -613,7 +619,7 @@ int ff_mediacodec_dec_decode(AVCodecContext *avctx, MediaCodecDecContext *s, ...@@ -613,7 +619,7 @@ int ff_mediacodec_dec_decode(AVCodecContext *avctx, MediaCodecDecContext *s,
memcpy(data, pkt->data + offset, size); memcpy(data, pkt->data + offset, size);
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)); pts = av_rescale_q(pts, avctx->pkt_timebase, av_make_q(1, 1000000));
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment