You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	Merge commit '90944ee3ab79081845ea1bd97eea475031ce0842'
* commit '90944ee3ab79081845ea1bd97eea475031ce0842': avconv: refactor selecting an encoder Conflicts: ffmpeg.c ffmpeg_opt.c Merged-by: James Almer <jamrial@gmail.com>
This commit is contained in:
		
							
								
								
									
										10
									
								
								ffmpeg.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								ffmpeg.c
									
									
									
									
									
								
							| @@ -3047,16 +3047,6 @@ static int transcode_init(void) | ||||
|                 abort(); | ||||
|             } | ||||
|         } 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); | ||||
|  | ||||
| #if CONFIG_LIBMFX | ||||
|   | ||||
							
								
								
									
										51
									
								
								ffmpeg_opt.c
									
									
									
									
									
								
							
							
						
						
									
										51
									
								
								ffmpeg_opt.c
									
									
									
									
									
								
							| @@ -1172,21 +1172,39 @@ static int get_preset_file_2(const char *preset_name, const char *codec_name, AV | ||||
|     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; | ||||
|  | ||||
|     MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st); | ||||
|     if (!codec_name) { | ||||
|         ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, | ||||
|                                                   NULL, ost->st->codec->codec_type); | ||||
|         ost->enc = avcodec_find_encoder(ost->st->codec->codec_id); | ||||
|     } 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; | ||||
|     if (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO || type == AVMEDIA_TYPE_SUBTITLE) { | ||||
|         MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st); | ||||
|         if (!codec_name) { | ||||
|             ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, | ||||
|                                                       NULL, ost->st->codec->codec_type); | ||||
|             ost->enc = avcodec_find_encoder(ost->st->codec->codec_id); | ||||
|             if (!ost->enc) { | ||||
|                 av_log(NULL, AV_LOG_FATAL, "Automatic encoder selection failed for " | ||||
|                        "output stream #%d:%d. Default encoder for format %s (codec %s) is " | ||||
|                        "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) | ||||
| @@ -1216,7 +1234,13 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e | ||||
|     ost->index      = idx; | ||||
|     ost->st         = st; | ||||
|     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); | ||||
|     if (!ost->enc_ctx) { | ||||
| @@ -2288,11 +2312,10 @@ loop_end: | ||||
|     } | ||||
|     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++) { | ||||
|         OutputStream *ost = output_streams[i]; | ||||
|  | ||||
|         ost->encoding_needed = !ost->stream_copy; | ||||
|         if (ost->encoding_needed && ost->source_index >= 0) { | ||||
|             InputStream *ist = input_streams[ost->source_index]; | ||||
|             ist->decoding_needed |= DECODING_FOR_OST; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user