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>
This commit is contained in:
parent
6d4a686d45
commit
aad79e4323
@ -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,
|
|||||||
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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user