mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
ffmpeg: use new avcodec_open2 and avformat_find_stream_info API.
This commit is contained in:
parent
3009f521f3
commit
bf174a70cd
47
ffmpeg.c
47
ffmpeg.c
@ -291,6 +291,7 @@ typedef struct OutputStream {
|
||||
#endif
|
||||
|
||||
int sws_flags;
|
||||
AVDictionary *opts;
|
||||
} OutputStream;
|
||||
|
||||
static OutputStream **output_streams_for_file[MAX_FILES] = { NULL };
|
||||
@ -312,6 +313,7 @@ typedef struct InputStream {
|
||||
int is_start; /* is 1 at the start and after a discontinuity */
|
||||
int showed_multi_packet_warning;
|
||||
int is_past_recording_time;
|
||||
AVDictionary *opts;
|
||||
} InputStream;
|
||||
|
||||
typedef struct InputFile {
|
||||
@ -459,6 +461,8 @@ static int ffmpeg_exit(int ret)
|
||||
for(i=0;i<nb_input_files;i++) {
|
||||
av_close_input_file(input_files[i].ctx);
|
||||
}
|
||||
for (i = 0; i < nb_input_streams; i++)
|
||||
av_dict_free(&input_streams[i].opts);
|
||||
|
||||
av_free(intra_matrix);
|
||||
av_free(inter_matrix);
|
||||
@ -678,6 +682,8 @@ static OutputStream *new_output_stream(AVFormatContext *oc, int file_idx, AVCode
|
||||
ost->index = idx;
|
||||
ost->st = st;
|
||||
ost->enc = codec;
|
||||
if (codec)
|
||||
ost->opts = filter_codec_opts(codec_opts, codec->id, 1);
|
||||
|
||||
avcodec_get_context_defaults3(st->codec, codec);
|
||||
|
||||
@ -2335,13 +2341,14 @@ static int transcode(AVFormatContext **output_files,
|
||||
memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
|
||||
ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
|
||||
}
|
||||
if (avcodec_open(ost->st->codec, codec) < 0) {
|
||||
if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
|
||||
snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
|
||||
ost->file_index, ost->index);
|
||||
ret = AVERROR(EINVAL);
|
||||
goto dump_format;
|
||||
}
|
||||
assert_codec_experimental(ost->st->codec, 1);
|
||||
assert_avoptions(ost->opts);
|
||||
extra_size += ost->st->codec->extradata_size;
|
||||
}
|
||||
}
|
||||
@ -2370,13 +2377,14 @@ static int transcode(AVFormatContext **output_files,
|
||||
}
|
||||
}
|
||||
|
||||
if (avcodec_open(ist->st->codec, codec) < 0) {
|
||||
if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
|
||||
snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
|
||||
ist->file_index, ist->st->index);
|
||||
ret = AVERROR(EINVAL);
|
||||
goto dump_format;
|
||||
}
|
||||
assert_codec_experimental(ist->st->codec, 0);
|
||||
assert_avoptions(ost->opts);
|
||||
//if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
|
||||
// ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
|
||||
}
|
||||
@ -2740,6 +2748,7 @@ static int transcode(AVFormatContext **output_files,
|
||||
audio_resample_close(ost->resample);
|
||||
if (ost->reformat_ctx)
|
||||
av_audio_convert_free(ost->reformat_ctx);
|
||||
av_dict_free(&ost->opts);
|
||||
av_free(ost);
|
||||
}
|
||||
}
|
||||
@ -3161,6 +3170,8 @@ static int opt_input_file(const char *opt, const char *filename)
|
||||
int err, i, ret, rfps, rfps_base;
|
||||
int64_t timestamp;
|
||||
uint8_t buf[128];
|
||||
AVDictionary **opts;
|
||||
int orig_nb_streams; // number of streams before avformat_find_stream_info
|
||||
|
||||
if (last_asked_format) {
|
||||
if (!(file_iformat = av_find_input_format(last_asked_format))) {
|
||||
@ -3246,26 +3257,13 @@ static int opt_input_file(const char *opt, const char *filename)
|
||||
ic->loop_input = loop_input;
|
||||
}
|
||||
|
||||
/* Set AVCodecContext options so they will be seen by av_find_stream_info() */
|
||||
for (i = 0; i < ic->nb_streams; i++) {
|
||||
AVCodecContext *dec = ic->streams[i]->codec;
|
||||
switch (dec->codec_type) {
|
||||
case AVMEDIA_TYPE_AUDIO:
|
||||
set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_AUDIO],
|
||||
AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM,
|
||||
NULL);
|
||||
break;
|
||||
case AVMEDIA_TYPE_VIDEO:
|
||||
set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_VIDEO],
|
||||
AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM,
|
||||
NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* Set AVCodecContext options for avformat_find_stream_info */
|
||||
opts = setup_find_stream_info_opts(ic);
|
||||
orig_nb_streams = ic->nb_streams;
|
||||
|
||||
/* If not enough info to get the stream parameters, we decode the
|
||||
first frames to get it. (used in mpeg case for example) */
|
||||
ret = av_find_stream_info(ic);
|
||||
ret = avformat_find_stream_info(ic, opts);
|
||||
if (ret < 0 && verbose >= 0) {
|
||||
fprintf(stderr, "%s: could not find codec parameters\n", filename);
|
||||
av_close_input_file(ic);
|
||||
@ -3301,6 +3299,7 @@ static int opt_input_file(const char *opt, const char *filename)
|
||||
ist->st = st;
|
||||
ist->file_index = nb_input_files;
|
||||
ist->discard = 1;
|
||||
ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, 0);
|
||||
|
||||
if (i < nb_ts_scale)
|
||||
ist->ts_scale = ts_scale[i];
|
||||
@ -3308,13 +3307,11 @@ static int opt_input_file(const char *opt, const char *filename)
|
||||
switch (dec->codec_type) {
|
||||
case AVMEDIA_TYPE_AUDIO:
|
||||
ist->dec = avcodec_find_decoder_by_name(audio_codec_name);
|
||||
set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM, ist->dec);
|
||||
if(audio_disable)
|
||||
st->discard= AVDISCARD_ALL;
|
||||
break;
|
||||
case AVMEDIA_TYPE_VIDEO:
|
||||
ist->dec = avcodec_find_decoder_by_name(video_codec_name);
|
||||
set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM, ist->dec);
|
||||
rfps = ic->streams[i]->r_frame_rate.num;
|
||||
rfps_base = ic->streams[i]->r_frame_rate.den;
|
||||
if (dec->lowres) {
|
||||
@ -3373,6 +3370,9 @@ static int opt_input_file(const char *opt, const char *filename)
|
||||
av_freep(&ts_scale);
|
||||
nb_ts_scale = 0;
|
||||
|
||||
for (i = 0; i < orig_nb_streams; i++)
|
||||
av_dict_free(&opts[i]);
|
||||
av_freep(&opts);
|
||||
av_freep(&video_codec_name);
|
||||
av_freep(&audio_codec_name);
|
||||
av_freep(&subtitle_codec_name);
|
||||
@ -3467,9 +3467,9 @@ static void new_video_stream(AVFormatContext *oc, int file_idx)
|
||||
video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
|
||||
}
|
||||
|
||||
video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
|
||||
if (video_stream_copy) {
|
||||
st->stream_copy = 1;
|
||||
video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
|
||||
video_enc->sample_aspect_ratio =
|
||||
st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
|
||||
} else {
|
||||
@ -3479,7 +3479,6 @@ static void new_video_stream(AVFormatContext *oc, int file_idx)
|
||||
if (frame_rate.num)
|
||||
ost->frame_rate = frame_rate;
|
||||
video_enc->codec_id = codec_id;
|
||||
set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
|
||||
|
||||
video_enc->width = frame_width;
|
||||
video_enc->height = frame_height;
|
||||
@ -3594,7 +3593,6 @@ static void new_audio_stream(AVFormatContext *oc, int file_idx)
|
||||
st->stream_copy = 1;
|
||||
} else {
|
||||
audio_enc->codec_id = codec_id;
|
||||
set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
|
||||
|
||||
if (audio_qscale > QSCALE_NONE) {
|
||||
audio_enc->flags |= CODEC_FLAG_QSCALE;
|
||||
@ -3685,7 +3683,6 @@ static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
|
||||
st->stream_copy = 1;
|
||||
} else {
|
||||
subtitle_enc->codec_id = codec_id;
|
||||
set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
|
||||
}
|
||||
|
||||
if (subtitle_language) {
|
||||
|
Loading…
Reference in New Issue
Block a user