Merge commit '90944ee3ab79081845ea1bd97eea475031ce0842'

* commit '90944ee3ab79081845ea1bd97eea475031ce0842':
  avconv: refactor selecting an encoder

Conflicts:
	ffmpeg.c
	ffmpeg_opt.c

Merged-by: James Almer <jamrial@gmail.com>
pull/230/head
James Almer 9 years ago
commit 61da882cea
  1. 10
      ffmpeg.c
  2. 51
      ffmpeg_opt.c

@ -3047,16 +3047,6 @@ static int transcode_init(void)
abort(); abort();
} }
} else { } else {
if (!ost->enc)
ost->enc = avcodec_find_encoder(enc_ctx->codec_id);
if (!ost->enc) {
/* should only happen when a default codec is not present. */
snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d:%d",
avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
ret = AVERROR(EINVAL);
goto dump_format;
}
set_encoder_id(output_files[ost->file_index], ost); set_encoder_id(output_files[ost->file_index], ost);
#if CONFIG_LIBMFX #if CONFIG_LIBMFX

@ -1172,21 +1172,39 @@ static int get_preset_file_2(const char *preset_name, const char *codec_name, AV
return ret; return ret;
} }
static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost) static int choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
{ {
enum AVMediaType type = ost->st->codec->codec_type;
char *codec_name = NULL; char *codec_name = NULL;
MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st); if (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO || type == AVMEDIA_TYPE_SUBTITLE) {
if (!codec_name) { MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, if (!codec_name) {
NULL, ost->st->codec->codec_type); ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
ost->enc = avcodec_find_encoder(ost->st->codec->codec_id); NULL, ost->st->codec->codec_type);
} else if (!strcmp(codec_name, "copy")) ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
ost->stream_copy = 1; if (!ost->enc) {
else { av_log(NULL, AV_LOG_FATAL, "Automatic encoder selection failed for "
ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1); "output stream #%d:%d. Default encoder for format %s (codec %s) is "
ost->st->codec->codec_id = ost->enc->id; "probably disabled. Please choose an encoder manually.\n",
ost->file_index, ost->index, s->oformat->name,
avcodec_get_name(ost->st->codec->codec_id));
return AVERROR_ENCODER_NOT_FOUND;
}
} else if (!strcmp(codec_name, "copy"))
ost->stream_copy = 1;
else {
ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
ost->st->codec->codec_id = ost->enc->id;
}
ost->encoding_needed = !ost->stream_copy;
} else {
/* no encoding supported for other media types */
ost->stream_copy = 1;
ost->encoding_needed = 0;
} }
return 0;
} }
static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index) static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
@ -1216,7 +1234,13 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
ost->index = idx; ost->index = idx;
ost->st = st; ost->st = st;
st->codec->codec_type = type; st->codec->codec_type = type;
choose_encoder(o, oc, ost);
ret = choose_encoder(o, oc, ost);
if (ret < 0) {
av_log(NULL, AV_LOG_FATAL, "Error selecting an encoder for stream "
"%d:%d\n", ost->file_index, ost->index);
exit_program(1);
}
ost->enc_ctx = avcodec_alloc_context3(ost->enc); ost->enc_ctx = avcodec_alloc_context3(ost->enc);
if (!ost->enc_ctx) { if (!ost->enc_ctx) {
@ -2288,11 +2312,10 @@ loop_end:
} }
av_dict_free(&unused_opts); av_dict_free(&unused_opts);
/* set the encoding/decoding_needed flags and create simple filtergraphs*/ /* set the decoding_needed flags and create simple filtergraphs */
for (i = of->ost_index; i < nb_output_streams; i++) { for (i = of->ost_index; i < nb_output_streams; i++) {
OutputStream *ost = output_streams[i]; OutputStream *ost = output_streams[i];
ost->encoding_needed = !ost->stream_copy;
if (ost->encoding_needed && ost->source_index >= 0) { if (ost->encoding_needed && ost->source_index >= 0) {
InputStream *ist = input_streams[ost->source_index]; InputStream *ist = input_streams[ost->source_index];
ist->decoding_needed |= DECODING_FOR_OST; ist->decoding_needed |= DECODING_FOR_OST;

Loading…
Cancel
Save