From patchwork Fri Jan 25 08:39:13 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: libopenh264dec: Use a newer decoding entry point function X-Patchwork-Submitter: =?utf-8?q?Martin_Storsj=C3=B6?= X-Patchwork-Id: 64412 Message-Id: <20190125083913.76626-1-martin@martin.st> To: libav-devel@libav.org Date: Fri, 25 Jan 2019 10:39:13 +0200 From: =?utf-8?q?Martin_Storsj=C3=B6?= List-Id: libav development The "new" entry point actually has existed since OpenH264 1.4 in 2015, but with B-frames, this entry point is essential for actually getting the right frames returned and reordered. 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, but it's the recommended decoding entry point. --- libavcodec/libopenh264dec.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) 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) {