diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c index 2d5fccec71..507aaa1a96 100644 --- a/libavcodec/libdav1d.c +++ b/libavcodec/libdav1d.c @@ -40,6 +40,9 @@ typedef struct Libdav1dContext { AVClass *class; Dav1dContext *c; + /* This packet coincides with AVCodecInternal.in_pkt + * and is not owned by us. */ + AVPacket *pkt; AVBufferPool *pool; int pool_size; @@ -214,6 +217,8 @@ static av_cold int libdav1d_init(AVCodecContext *c) #endif int res; + dav1d->pkt = c->internal->in_pkt; + av_log(c, AV_LOG_INFO, "libdav1d %s\n", dav1d_version()); dav1d_default_settings(&s); @@ -292,25 +297,26 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame) int res; if (!data->sz) { - AVPacket pkt = { 0 }; + AVPacket *const pkt = dav1d->pkt; - res = ff_decode_get_packet(c, &pkt); + res = ff_decode_get_packet(c, pkt); if (res < 0 && res != AVERROR_EOF) return res; - if (pkt.size) { - res = dav1d_data_wrap(data, pkt.data, pkt.size, libdav1d_data_free, pkt.buf); + if (pkt->size) { + res = dav1d_data_wrap(data, pkt->data, pkt->size, + libdav1d_data_free, pkt->buf); if (res < 0) { - av_packet_unref(&pkt); + av_packet_unref(pkt); return res; } - data->m.timestamp = pkt.pts; - data->m.offset = pkt.pos; - data->m.duration = pkt.duration; + data->m.timestamp = pkt->pts; + data->m.offset = pkt->pos; + data->m.duration = pkt->duration; - pkt.buf = NULL; - av_packet_unref(&pkt); + pkt->buf = NULL; + av_packet_unref(pkt); if (c->reordered_opaque != AV_NOPTS_VALUE) { uint8_t *reordered_opaque = av_malloc(sizeof(c->reordered_opaque)); @@ -329,7 +335,7 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame) } } } else if (res >= 0) { - av_packet_unref(&pkt); + av_packet_unref(pkt); return AVERROR(EAGAIN); } }