diff --git a/ffmpeg.c b/ffmpeg.c index bbce98e036..24b6bec37a 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -468,6 +468,8 @@ static void ffmpeg_cleanup(int ret) output_streams[i]->bitstream_filters = NULL; avcodec_free_frame(&output_streams[i]->filtered_frame); + av_parser_close(output_streams[i]->parser); + av_freep(&output_streams[i]->forced_keyframes); av_expr_free(output_streams[i]->forced_keyframes_pexpr); av_freep(&output_streams[i]->avfilter); @@ -1467,7 +1469,10 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p && ost->st->codec->codec_id != AV_CODEC_ID_MPEG2VIDEO && ost->st->codec->codec_id != AV_CODEC_ID_VC1 ) { - if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY)) { + if (av_parser_change(ost->parser, ost->st->codec, + &opkt.data, &opkt.size, + pkt->data, pkt->size, + pkt->flags & AV_PKT_FLAG_KEY)) { opkt.buf = av_buffer_create(opkt.data, opkt.size, av_buffer_default_free, NULL, 0); if (!opkt.buf) exit_program(1); @@ -2256,6 +2261,8 @@ static int transcode_init(void) av_reduce(&codec->time_base.num, &codec->time_base.den, codec->time_base.num, codec->time_base.den, INT_MAX); + ost->parser = av_parser_init(codec->codec_id); + switch (codec->codec_type) { case AVMEDIA_TYPE_AUDIO: if (audio_volume != 256) { diff --git a/ffmpeg.h b/ffmpeg.h index 054e71814d..c001d2cc16 100644 --- a/ffmpeg.h +++ b/ffmpeg.h @@ -371,6 +371,8 @@ typedef struct OutputStream { int copy_prior_start; int keep_pix_fmt; + + AVCodecParserContext *parser; } OutputStream; typedef struct OutputFile {