mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
ffmpeg: stop using AVStream.codec on stream copy
This commit is based on commit35c8580
from Anton Khirnov <anton@khirnov.net> which was skipped inb8945c4
. 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. Tested-by: Michael Niedermayer <michael@niedermayer.cc> Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
parent
f0b6f7253f
commit
4a05d2eda7
25
ffmpeg.c
25
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:
|
||||
|
1
ffmpeg.h
1
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
|
||||
|
@ -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,6 +2310,7 @@ loop_end:
|
||||
avio_closep(&pb);
|
||||
}
|
||||
|
||||
#if FF_API_LAVF_AVCTX
|
||||
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];
|
||||
@ -2319,6 +2321,7 @@ loop_end:
|
||||
if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
|
||||
exit_program(1);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
|
||||
av_dump_format(oc, nb_output_files - 1, oc->filename, 1);
|
||||
|
Loading…
Reference in New Issue
Block a user