summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2023-02-28 12:53:35 +0100
committerAnton Khirnov <anton@khirnov.net>2023-03-10 13:00:53 +0100
commit942fb48c38b9a26c4fe2b282cc11f9c22c68bf1f (patch)
tree38a95b0f03881c2766c4ce72f05f7ba1561157e6
parent62a241e505abfa96b4329875ecc76aaa1d57519e (diff)
lavc/libvpxenc: handle queue desync more gracefully
If the packets returned by libvpx and our internal frame properties queue get desynchronized for some reason (should not happen, but it is not clear libvpx API guarantees this), we will keep adding to the queue indefinitely and never remove anything. Change the code to drain the queue even if timestamps do not match.
-rw-r--r--libavcodec/libvpxenc.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c
index 79cd863093..3d7b809b2f 100644
--- a/libavcodec/libvpxenc.c
+++ b/libavcodec/libvpxenc.c
@@ -401,11 +401,16 @@ static int frame_data_apply(AVCodecContext *avctx, AVFifo *fifo, AVPacket *pkt)
{
FrameData fd;
uint8_t *data;
+ int ret = 0;
+
if (av_fifo_peek(fifo, &fd, 1, 0) < 0)
return 0;
- if (fd.pts != pkt->pts)
- return 0;
- av_fifo_drain2(fifo, 1);
+ if (fd.pts != pkt->pts) {
+ av_log(avctx, AV_LOG_WARNING,
+ "Mismatching timestamps: libvpx %"PRId64" queued %"PRId64"; "
+ "this is a bug, please report it\n", pkt->pts, fd.pts);
+ goto skip;
+ }
#if FF_API_REORDERED_OPAQUE
FF_DISABLE_DEPRECATION_WARNINGS
@@ -419,20 +424,22 @@ FF_ENABLE_DEPRECATION_WARNINGS
pkt->opaque_ref = fd.frame_opaque_ref;
fd.frame_opaque_ref = NULL;
}
- av_buffer_unref(&fd.frame_opaque_ref);
if (fd.hdr10_plus) {
data = av_packet_new_side_data(pkt, AV_PKT_DATA_DYNAMIC_HDR10_PLUS, fd.hdr10_plus->size);
if (!data) {
- av_buffer_unref(&fd.hdr10_plus);
- return AVERROR(ENOMEM);
+ ret = AVERROR(ENOMEM);
+ goto skip;
}
memcpy(data, fd.hdr10_plus->data, fd.hdr10_plus->size);
- av_buffer_unref(&fd.hdr10_plus);
}
- return 0;
+skip:
+ av_fifo_drain2(fifo, 1);
+ frame_data_uninit(&fd);
+
+ return ret;
}
static av_cold int codecctl_int(AVCodecContext *avctx,