summaryrefslogtreecommitdiffstats
path: root/libavcodec/libdav1d.c
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2019-03-18 10:38:31 -0300
committerJames Almer <jamrial@gmail.com>2019-03-19 14:04:08 -0300
commit9e62e1a1104bb0d64e604051ffc25004ad748eaf (patch)
tree2c586809deea3c57fe271a944bb55bb5c924f37e /libavcodec/libdav1d.c
parent5cd60b6f2ed8a30341e8f98a38858c18505f6f75 (diff)
downloadffmpeg-streaming-9e62e1a1104bb0d64e604051ffc25004ad748eaf.zip
ffmpeg-streaming-9e62e1a1104bb0d64e604051ffc25004ad748eaf.tar.gz
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.c20
1 files changed, 4 insertions, 16 deletions
diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c
index d9079cb..30c6ecc 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;
OpenPOWER on IntegriCloud