[FFmpeg-devel] [PATCH 2/2] ffmpeg: stop using AVStream.codec on stream copy
James Almer
jamrial at gmail.com
Mon Sep 26 20:39:13 EEST 2016
This commit is based on commit 35c8580 from Anton Khirnov <anton at khirnov.net>
which was skipped in b8945c4.
The avcodec_copy_context() call in the encode path is left in place for now
as AVStream.codec is apparently still required even after porting ffmpeg to
the new bsf API.
Signed-off-by: James Almer <jamrial at gmail.com>
---
ffmpeg.c | 25 ++++++++++++-------------
ffmpeg.h | 1 +
ffmpeg_opt.c | 12 +-----------
3 files changed, 14 insertions(+), 24 deletions(-)
diff --git a/ffmpeg.c b/ffmpeg.c
index df55a49..bbde63b 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -516,6 +516,7 @@ static void ffmpeg_cleanup(int ret)
av_dict_free(&ost->encoder_opts);
av_parser_close(ost->parser);
+ avcodec_free_context(&ost->parser_avctx);
av_freep(&ost->forced_keyframes);
av_expr_free(ost->forced_keyframes_pexpr);
@@ -1899,7 +1900,7 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p
&& ost->st->codecpar->codec_id != AV_CODEC_ID_MPEG2VIDEO
&& ost->st->codecpar->codec_id != AV_CODEC_ID_VC1
) {
- int ret = av_parser_change(ost->parser, ost->st->codec,
+ int ret = av_parser_change(ost->parser, ost->parser_avctx,
&opkt.data, &opkt.size,
pkt->data, pkt->size,
pkt->flags & AV_PKT_FLAG_KEY);
@@ -2723,9 +2724,7 @@ static int init_output_stream(OutputStream *ost, char *error, int error_len)
exit_program(1);
}
/*
- * FIXME: this is only so that the bitstream filters and parsers (that still
- * work with a codec context) get the parameter values.
- * This should go away with the new BSF/parser API.
+ * FIXME: ost->st->codec should't be needed here anymore.
*/
ret = avcodec_copy_context(ost->st->codec, ost->enc_ctx);
if (ret < 0)
@@ -2757,15 +2756,11 @@ static int init_output_stream(OutputStream *ost, char *error, int error_len)
ost->st->time_base = av_add_q(ost->enc_ctx->time_base, (AVRational){0, 1});
ost->st->codec->codec= ost->enc_ctx->codec;
} else if (ost->stream_copy) {
- // copy timebase while removing common factors
- ost->st->time_base = av_add_q(ost->st->codec->time_base, (AVRational){0, 1});
-
/*
- * FIXME: this is only so that the bitstream filters and parsers (that still
- * work with a codec context) get the parameter values.
- * This should go away with the new BSF/parser API.
+ * FIXME: will the codec context used by the parser during streamcopy
+ * This should go away with the new parser API.
*/
- ret = avcodec_parameters_to_context(ost->st->codec, ost->st->codecpar);
+ ret = avcodec_parameters_to_context(ost->parser_avctx, ost->st->codecpar);
if (ret < 0)
return ret;
}
@@ -3007,12 +3002,13 @@ static int transcode_init(void)
ost->frame_rate = ist->framerate;
ost->st->avg_frame_rate = ost->frame_rate;
- ost->st->time_base = ist->st->time_base;
-
ret = avformat_transfer_internal_stream_timing_info(oc->oformat, ost->st, ist->st, copy_tb);
if (ret < 0)
return ret;
+ // copy timebase while removing common factors
+ ost->st->time_base = av_add_q(av_stream_get_codec_timebase(ost->st), (AVRational){0, 1});
+
if (ist->st->nb_side_data) {
ost->st->side_data = av_realloc_array(NULL, ist->st->nb_side_data,
sizeof(*ist->st->side_data));
@@ -3038,6 +3034,9 @@ static int transcode_init(void)
}
ost->parser = av_parser_init(par_dst->codec_id);
+ ost->parser_avctx = avcodec_alloc_context3(NULL);
+ if (!ost->parser_avctx)
+ return AVERROR(ENOMEM);
switch (par_dst->codec_type) {
case AVMEDIA_TYPE_AUDIO:
diff --git a/ffmpeg.h b/ffmpeg.h
index b7f8b7a..0d01d2b 100644
--- a/ffmpeg.h
+++ b/ffmpeg.h
@@ -477,6 +477,7 @@ typedef struct OutputStream {
int keep_pix_fmt;
AVCodecParserContext *parser;
+ AVCodecContext *parser_avctx;
/* stats */
// combined size of all the packets written
diff --git a/ffmpeg_opt.c b/ffmpeg_opt.c
index 73da546..0dd06a7 100644
--- a/ffmpeg_opt.c
+++ b/ffmpeg_opt.c
@@ -2300,6 +2300,7 @@ loop_end:
avio_read(pb, attachment, len);
ost = new_attachment_stream(o, oc, -1);
+ ost->stream_copy = 0;
ost->attachment_filename = o->attachments[i];
ost->st->codecpar->extradata = attachment;
ost->st->codecpar->extradata_size = len;
@@ -2309,17 +2310,6 @@ loop_end:
avio_closep(&pb);
}
- for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
- AVDictionaryEntry *e;
- ost = output_streams[i];
-
- if ((ost->stream_copy || ost->attachment_filename)
- && (e = av_dict_get(o->g->codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
- && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
- if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
- exit_program(1);
- }
-
if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
av_dump_format(oc, nb_output_files - 1, oc->filename, 1);
av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", nb_output_files - 1);
--
2.9.1
More information about the ffmpeg-devel
mailing list