aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2022-02-11 08:22:47 +0100
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2022-02-13 12:26:12 +0100
commit55379dac539f7cabf8a825848585fc8c619dfd70 (patch)
tree848f523b69da337e0e9ca9fa3229444d3159a887 /libavcodec
parent90e5eef73125d973df5610dc840a8a513a3b7915 (diff)
downloadffmpeg-55379dac539f7cabf8a825848585fc8c619dfd70.tar.gz
avcodec/vp56: Cleanup generically in case of init failure
Reviewed-by: Peter Ross <pross@xvid.org> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/vp5.c1
-rw-r--r--libavcodec/vp56.c4
-rw-r--r--libavcodec/vp56.h4
-rw-r--r--libavcodec/vp6.c2
4 files changed, 8 insertions, 3 deletions
diff --git a/libavcodec/vp5.c b/libavcodec/vp5.c
index f68c62527b..a3c3da7ba6 100644
--- a/libavcodec/vp5.c
+++ b/libavcodec/vp5.c
@@ -306,4 +306,5 @@ const AVCodec ff_vp5_decoder = {
.close = ff_vp56_free,
.decode = ff_vp56_decode_frame,
.capabilities = AV_CODEC_CAP_DR1,
+ .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
};
diff --git a/libavcodec/vp56.c b/libavcodec/vp56.c
index 695f37e972..d4184f59b4 100644
--- a/libavcodec/vp56.c
+++ b/libavcodec/vp56.c
@@ -800,10 +800,8 @@ av_cold int ff_vp56_init_context(AVCodecContext *avctx, VP56Context *s,
for (i = 0; i < FF_ARRAY_ELEMS(s->frames); i++) {
s->frames[i] = av_frame_alloc();
- if (!s->frames[i]) {
- ff_vp56_free(avctx);
+ if (!s->frames[i])
return AVERROR(ENOMEM);
- }
}
s->edge_emu_buffer_alloc = NULL;
diff --git a/libavcodec/vp56.h b/libavcodec/vp56.h
index 46090f25c9..0a9eebc7ea 100644
--- a/libavcodec/vp56.h
+++ b/libavcodec/vp56.h
@@ -217,6 +217,10 @@ struct vp56_context {
int ff_vp56_init(AVCodecContext *avctx, int flip, int has_alpha);
+/**
+ * Initializes an VP56Context. Expects its caller to clean up
+ * in case of error.
+ */
int ff_vp56_init_context(AVCodecContext *avctx, VP56Context *s,
int flip, int has_alpha);
int ff_vp56_free(AVCodecContext *avctx);
diff --git a/libavcodec/vp6.c b/libavcodec/vp6.c
index 95ed5eba0f..6bcbbce47b 100644
--- a/libavcodec/vp6.c
+++ b/libavcodec/vp6.c
@@ -720,6 +720,7 @@ const AVCodec ff_vp6_decoder = {
.close = vp6_decode_free,
.decode = ff_vp56_decode_frame,
.capabilities = AV_CODEC_CAP_DR1,
+ .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
};
/* flash version, not flipped upside-down */
@@ -733,6 +734,7 @@ const AVCodec ff_vp6f_decoder = {
.close = vp6_decode_free,
.decode = ff_vp56_decode_frame,
.capabilities = AV_CODEC_CAP_DR1,
+ .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
};
/* flash version, not flipped upside-down, with alpha channel */