diff mbox series

[FFmpeg-devel,2/6] avcodec/vp56: Cleanup generically in case of init failure

Message ID AM7PR03MB6660F13B6D25B43127A56F298F309@AM7PR03MB6660.eurprd03.prod.outlook.com
State Accepted
Commit 55379dac539f7cabf8a825848585fc8c619dfd70
Headers show
Series [FFmpeg-devel,1/6] avcodec/vp6: Check initializing VP6A context | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished
andriy/make_ppc success Make finished
andriy/make_fate_ppc success Make fate finished

Commit Message

Andreas Rheinhardt Feb. 11, 2022, 8:50 a.m. UTC
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavcodec/vp5.c  | 1 +
 libavcodec/vp56.c | 4 +---
 libavcodec/vp56.h | 4 ++++
 libavcodec/vp6.c  | 2 ++
 4 files changed, 8 insertions(+), 3 deletions(-)
diff mbox series

Patch

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 */