Commit f6803cfb authored by James Almer's avatar James Almer

avcodec/libdav1d: unref the frame on failure

Signed-off-by: 's avatarJames Almer <jamrial@gmail.com>
parent 38a41321
...@@ -231,7 +231,7 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame) ...@@ -231,7 +231,7 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
if (c->width != p->p.w || c->height != p->p.h) { if (c->width != p->p.w || c->height != p->p.h) {
res = ff_set_dimensions(c, p->p.w, p->p.h); res = ff_set_dimensions(c, p->p.w, p->p.h);
if (res < 0) if (res < 0)
return res; goto fail;
} }
switch (p->seq_hdr->chr) { switch (p->seq_hdr->chr) {
...@@ -272,13 +272,16 @@ FF_ENABLE_DEPRECATION_WARNINGS ...@@ -272,13 +272,16 @@ FF_ENABLE_DEPRECATION_WARNINGS
frame->pict_type = AV_PICTURE_TYPE_SP; frame->pict_type = AV_PICTURE_TYPE_SP;
break; break;
default: default:
return AVERROR_INVALIDDATA; res = AVERROR_INVALIDDATA;
goto fail;
} }
if (p->mastering_display) { if (p->mastering_display) {
AVMasteringDisplayMetadata *mastering = av_mastering_display_metadata_create_side_data(frame); AVMasteringDisplayMetadata *mastering = av_mastering_display_metadata_create_side_data(frame);
if (!mastering) if (!mastering) {
return AVERROR(ENOMEM); res = AVERROR(ENOMEM);
goto fail;
}
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
mastering->display_primaries[i][0] = av_make_q(p->mastering_display->primaries[i][0], 1 << 16); mastering->display_primaries[i][0] = av_make_q(p->mastering_display->primaries[i][0], 1 << 16);
...@@ -295,14 +298,19 @@ FF_ENABLE_DEPRECATION_WARNINGS ...@@ -295,14 +298,19 @@ FF_ENABLE_DEPRECATION_WARNINGS
} }
if (p->content_light) { if (p->content_light) {
AVContentLightMetadata *light = av_content_light_metadata_create_side_data(frame); AVContentLightMetadata *light = av_content_light_metadata_create_side_data(frame);
if (!light) if (!light) {
return AVERROR(ENOMEM); res = AVERROR(ENOMEM);
goto fail;
}
light->MaxCLL = p->content_light->max_content_light_level; light->MaxCLL = p->content_light->max_content_light_level;
light->MaxFALL = p->content_light->max_frame_average_light_level; light->MaxFALL = p->content_light->max_frame_average_light_level;
} }
return 0; res = 0;
fail:
if (res < 0)
av_frame_unref(frame);
return res;
} }
static av_cold int libdav1d_close(AVCodecContext *c) static av_cold int libdav1d_close(AVCodecContext *c)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment