Use err_out label for error-case cleanup.
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>
Tue, 27 Nov 2012 20:10:12 +0000 (21:10 +0100)
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>
Wed, 28 Nov 2012 15:41:48 +0000 (16:41 +0100)
Will simplify future changes (introducing proper
locking around opening/closing parsers).

Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de>
libavcodec/parser.c

index cd1bcbc..2e204e2 100644 (file)
@@ -40,7 +40,7 @@ void av_register_codec_parser(AVCodecParser *parser)
 
 AVCodecParserContext *av_parser_init(int codec_id)
 {
-    AVCodecParserContext *s;
+    AVCodecParserContext *s = NULL;
     AVCodecParser *parser;
     int ret;
 
@@ -59,22 +59,17 @@ AVCodecParserContext *av_parser_init(int codec_id)
  found:
     s = av_mallocz(sizeof(AVCodecParserContext));
     if (!s)
-        return NULL;
+        goto err_out;
     s->parser = parser;
     s->priv_data = av_mallocz(parser->priv_data_size);
-    if (!s->priv_data) {
-        av_free(s);
-        return NULL;
-    }
+    if (!s->priv_data)
+        goto err_out;
     s->fetch_timestamp=1;
     s->pict_type = AV_PICTURE_TYPE_I;
     if (parser->parser_init) {
         ret = parser->parser_init(s);
-        if (ret != 0) {
-            av_free(s->priv_data);
-            av_free(s);
-            return NULL;
-        }
+        if (ret != 0)
+            goto err_out;
     }
     s->key_frame = -1;
     s->convergence_duration = 0;
@@ -82,6 +77,12 @@ AVCodecParserContext *av_parser_init(int codec_id)
     s->dts_ref_dts_delta    = INT_MIN;
     s->pts_dts_delta        = INT_MIN;
     return s;
+
+err_out:
+    if (s)
+        av_freep(&s->priv_data);
+    av_free(s);
+    return NULL;
 }
 
 void ff_fetch_timestamp(AVCodecParserContext *s, int off, int remove){