aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2019-01-25 10:28:46 +0200
committerMartin Storsjö <martin@martin.st>2019-01-26 21:13:03 +0200
commiteec93e57096aa4804862d62760442380c70d489b (patch)
tree95077a144622c1401886e45859b3babf202cb9bd
parent28a8b5413b64b831dfb8650208bccd8b78360484 (diff)
downloadffmpeg-eec93e57096aa4804862d62760442380c70d489b.tar.gz
libopenh264dec: Use a newer decoding entry point function
The "new" entry point actually has existed since OpenH264 1.4 in 2015 and is the the recommended decoding entry point. The name of this function, DecodeFrameNoDelay, is rather backwards considering that it doesn't return the latest decoded frame immediately, but actually does proper delaying and reordering of frames. Signed-off-by: Martin Storsjö <martin@martin.st>
-rw-r--r--libavcodec/libopenh264dec.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/libavcodec/libopenh264dec.c b/libavcodec/libopenh264dec.c
index 60e4b028ec..6adf984112 100644
--- a/libavcodec/libopenh264dec.c
+++ b/libavcodec/libopenh264dec.c
@@ -109,10 +109,18 @@ static int svc_decode_frame(AVCodecContext *avctx, void *data,
#endif
} else {
info.uiInBsTimeStamp = avpkt->pts;
+#if OPENH264_VER_AT_LEAST(1, 4)
+ // Contrary to the name, DecodeFrameNoDelay actually does buffering
+ // and reordering of frames, and is the recommended decoding entry
+ // point since 1.4. This is essential for successfully decoding
+ // B-frames.
+ state = (*s->decoder)->DecodeFrameNoDelay(s->decoder, avpkt->data, avpkt->size, ptrs, &info);
+#else
state = (*s->decoder)->DecodeFrame2(s->decoder, avpkt->data, avpkt->size, ptrs, &info);
+#endif
}
if (state != dsErrorFree) {
- av_log(avctx, AV_LOG_ERROR, "DecodeFrame2 failed\n");
+ av_log(avctx, AV_LOG_ERROR, "DecodeFrame failed\n");
return AVERROR_UNKNOWN;
}
if (info.iBufferStatus != 1) {