diff options
author | James Almer <jamrial@gmail.com> | 2019-03-18 16:38:31 +0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2019-03-19 20:04:08 +0300 |
commit | 9e62e1a1104bb0d64e604051ffc25004ad748eaf (patch) | |
tree | 2c586809deea3c57fe271a944bb55bb5c924f37e /libavcodec/libdav1d.c | |
parent | 5cd60b6f2ed8a30341e8f98a38858c18505f6f75 (diff) |
avcodec/libdav1d: use a reference to the allocated buffer instead of wrapping the Dav1dPicture
Removes an av_malloc() per frame.
Reviewed-by: BBB
Reviewed-by: nevcairiel
Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavcodec/libdav1d.c')
-rw-r--r-- | libavcodec/libdav1d.c | 20 |
1 files changed, 4 insertions, 16 deletions
diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c index d9079cbbef..30c6eccfef 100644 --- a/libavcodec/libdav1d.c +++ b/libavcodec/libdav1d.c @@ -149,18 +149,11 @@ static void libdav1d_data_free(const uint8_t *data, void *opaque) { av_buffer_unref(&buf); } -static void libdav1d_frame_free(void *opaque, uint8_t *data) { - Dav1dPicture *p = opaque; - - dav1d_picture_unref(p); - av_free(p); -} - static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame) { Libdav1dContext *dav1d = c->priv_data; Dav1dData *data = &dav1d->data; - Dav1dPicture *p; + Dav1dPicture pic = { 0 }, *p = &pic; int res; if (!data->sz) { @@ -194,10 +187,6 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame) return res; } - p = av_mallocz(sizeof(*p)); - if (!p) - return AVERROR(ENOMEM); - res = dav1d_get_picture(dav1d->c, p); if (res < 0) { if (res == AVERROR(EINVAL)) @@ -205,17 +194,15 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame) else if (res == AVERROR(EAGAIN) && c->internal->draining) res = AVERROR_EOF; - av_free(p); return res; } av_assert0(p->data[0] != NULL); - frame->buf[0] = av_buffer_create(NULL, 0, libdav1d_frame_free, - p, AV_BUFFER_FLAG_READONLY); + // This requires the custom allocator above + frame->buf[0] = av_buffer_ref(p->allocator_data); if (!frame->buf[0]) { dav1d_picture_unref(p); - av_free(p); return AVERROR(ENOMEM); } @@ -310,6 +297,7 @@ FF_ENABLE_DEPRECATION_WARNINGS res = 0; fail: + dav1d_picture_unref(p); if (res < 0) av_frame_unref(frame); return res; |