summaryrefslogtreecommitdiff
path: root/libavcodec/parser.c
diff options
context:
space:
mode:
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>2012-11-27 21:10:12 +0100
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>2012-11-28 16:41:48 +0100
commit92947c6d72783a8b624c82af14a2cbebcd4f031c (patch)
tree92c2c69785c8ecd81926c4d54eb168057d6b3a1b /libavcodec/parser.c
parent8aa29f063c8d082bb01a3f36b804b902b884ef69 (diff)
Use err_out label for error-case cleanup.
Will simplify future changes (introducing proper locking around opening/closing parsers). Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de>
Diffstat (limited to 'libavcodec/parser.c')
-rw-r--r--libavcodec/parser.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/libavcodec/parser.c b/libavcodec/parser.c
index cd1bcbcee2..2e204e2c2a 100644
--- a/libavcodec/parser.c
+++ b/libavcodec/parser.c
@@ -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){