Commit 40b74abf authored by Andreas Rheinhardt's avatar Andreas Rheinhardt Committed by Mark Thompson

h264_redundant_pps: Fix memleak in case of errors

Now the fragment is uninitialized and the input packet freed in case of
errors.
Signed-off-by: 's avatarAndreas Rheinhardt <andreas.rheinhardt@googlemail.com>
Signed-off-by: 's avatarMark Thompson <sw@jkqxz.net>
parent 72482363
...@@ -80,7 +80,7 @@ static int h264_redundant_pps_filter(AVBSFContext *bsf, AVPacket *out) ...@@ -80,7 +80,7 @@ static int h264_redundant_pps_filter(AVBSFContext *bsf, AVPacket *out)
err = ff_cbs_read_packet(ctx->input, au, in); err = ff_cbs_read_packet(ctx->input, au, in);
if (err < 0) if (err < 0)
return err; goto fail;
au_has_sps = 0; au_has_sps = 0;
for (i = 0; i < au->nb_units; i++) { for (i = 0; i < au->nb_units; i++) {
...@@ -89,11 +89,15 @@ static int h264_redundant_pps_filter(AVBSFContext *bsf, AVPacket *out) ...@@ -89,11 +89,15 @@ static int h264_redundant_pps_filter(AVBSFContext *bsf, AVPacket *out)
if (nal->type == H264_NAL_SPS) if (nal->type == H264_NAL_SPS)
au_has_sps = 1; au_has_sps = 1;
if (nal->type == H264_NAL_PPS) { if (nal->type == H264_NAL_PPS) {
h264_redundant_pps_fixup_pps(ctx, nal->content); err = h264_redundant_pps_fixup_pps(ctx, nal->content);
if (err < 0)
goto fail;
if (!au_has_sps) { if (!au_has_sps) {
av_log(bsf, AV_LOG_VERBOSE, "Deleting redundant PPS " av_log(bsf, AV_LOG_VERBOSE, "Deleting redundant PPS "
"at %"PRId64".\n", in->pts); "at %"PRId64".\n", in->pts);
ff_cbs_delete_unit(ctx->input, au, i); err = ff_cbs_delete_unit(ctx->input, au, i);
if (err < 0)
goto fail;
} }
} }
if (nal->type == H264_NAL_SLICE || if (nal->type == H264_NAL_SLICE ||
...@@ -105,17 +109,21 @@ static int h264_redundant_pps_filter(AVBSFContext *bsf, AVPacket *out) ...@@ -105,17 +109,21 @@ static int h264_redundant_pps_filter(AVBSFContext *bsf, AVPacket *out)
err = ff_cbs_write_packet(ctx->output, out, au); err = ff_cbs_write_packet(ctx->output, out, au);
if (err < 0) if (err < 0)
return err; goto fail;
ff_cbs_fragment_uninit(ctx->output, au);
err = av_packet_copy_props(out, in); err = av_packet_copy_props(out, in);
if (err < 0) if (err < 0)
return err; goto fail;
err = 0;
fail:
ff_cbs_fragment_uninit(ctx->output, au);
av_packet_free(&in); av_packet_free(&in);
if (err < 0)
av_packet_unref(out);
return 0; return err;
} }
static int h264_redundant_pps_init(AVBSFContext *bsf) static int h264_redundant_pps_init(AVBSFContext *bsf)
...@@ -138,25 +146,29 @@ static int h264_redundant_pps_init(AVBSFContext *bsf) ...@@ -138,25 +146,29 @@ static int h264_redundant_pps_init(AVBSFContext *bsf)
err = ff_cbs_read_extradata(ctx->input, au, bsf->par_in); err = ff_cbs_read_extradata(ctx->input, au, bsf->par_in);
if (err < 0) { if (err < 0) {
av_log(bsf, AV_LOG_ERROR, "Failed to read extradata.\n"); av_log(bsf, AV_LOG_ERROR, "Failed to read extradata.\n");
return err; goto fail;
} }
for (i = 0; i < au->nb_units; i++) { for (i = 0; i < au->nb_units; i++) {
if (au->units[i].type == H264_NAL_PPS) if (au->units[i].type == H264_NAL_PPS) {
h264_redundant_pps_fixup_pps(ctx, au->units[i].content); err = h264_redundant_pps_fixup_pps(ctx, au->units[i].content);
if (err < 0)
goto fail;
}
} }
ctx->extradata_pic_init_qp = ctx->current_pic_init_qp; ctx->extradata_pic_init_qp = ctx->current_pic_init_qp;
err = ff_cbs_write_extradata(ctx->output, bsf->par_out, au); err = ff_cbs_write_extradata(ctx->output, bsf->par_out, au);
if (err < 0) { if (err < 0) {
av_log(bsf, AV_LOG_ERROR, "Failed to write extradata.\n"); av_log(bsf, AV_LOG_ERROR, "Failed to write extradata.\n");
return err; goto fail;
} }
ff_cbs_fragment_uninit(ctx->output, au);
} }
return 0; err = 0;
fail:
ff_cbs_fragment_uninit(ctx->output, au);
return err;
} }
static void h264_redundant_pps_flush(AVBSFContext *bsf) static void h264_redundant_pps_flush(AVBSFContext *bsf)
......
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