From 4a897224b72b46c93d2c1c7cd61b22001caed66a Mon Sep 17 00:00:00 2001 From: Nicolas George Date: Wed, 8 Aug 2007 14:34:51 +0000 Subject: Use the codec name from the command line options instead of the codec id. patch by Nicolas George [nicolas dot george normalesup org] original thread: [FFmpeg-devel] [PATCH] Codec lookup: do not use codec_id date: 06/18/2007 06:19 PM Originally committed as revision 9983 to svn://svn.ffmpeg.org/ffmpeg/trunk --- ffmpeg.c | 80 +++++++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 46 insertions(+), 34 deletions(-) (limited to 'ffmpeg.c') diff --git a/ffmpeg.c b/ffmpeg.c index d3ca922450..e730da9763 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -128,7 +128,7 @@ static char *video_rc_override_string=NULL; static char *video_rc_eq="tex^qComp"; static int video_disable = 0; static int video_discard = 0; -static int video_codec_id = CODEC_ID_NONE; +static char *video_codec_name = NULL; static int video_codec_tag = 0; static int same_quality = 0; static int do_deinterlace = 0; @@ -146,12 +146,12 @@ static int audio_sample_rate = 44100; static float audio_qscale = QSCALE_NONE; static int audio_disable = 0; static int audio_channels = 1; -static int audio_codec_id = CODEC_ID_NONE; +static char *audio_codec_name = NULL; static int audio_codec_tag = 0; static char *audio_language = NULL; static int subtitle_disable = 0; -static int subtitle_codec_id = CODEC_ID_NONE; +static char *subtitle_codec_name = NULL; static char *subtitle_language = NULL; static float mux_preload= 0.5; @@ -2368,32 +2368,20 @@ static void opt_video_standard(const char *arg) video_standard = av_strdup(arg); } -static void opt_codec(int *pstream_copy, int *pcodec_id, +static void opt_codec(int *pstream_copy, char **pcodec_name, int codec_type, const char *arg) { - AVCodec *p; - + av_freep(pcodec_name); if (!strcmp(arg, "copy")) { *pstream_copy = 1; } else { - p = first_avcodec; - while (p) { - if (!strcmp(p->name, arg) && p->type == codec_type) - break; - p = p->next; - } - if (p == NULL) { - fprintf(stderr, "Unknown codec '%s'\n", arg); - exit(1); - } else { - *pcodec_id = p->id; - } + *pcodec_name = av_strdup(arg); } } static void opt_audio_codec(const char *arg) { - opt_codec(&audio_stream_copy, &audio_codec_id, CODEC_TYPE_AUDIO, arg); + opt_codec(&audio_stream_copy, &audio_codec_name, CODEC_TYPE_AUDIO, arg); } static void opt_audio_tag(const char *arg) @@ -2439,12 +2427,12 @@ static void add_frame_hooker(const char *arg) static void opt_video_codec(const char *arg) { - opt_codec(&video_stream_copy, &video_codec_id, CODEC_TYPE_VIDEO, arg); + opt_codec(&video_stream_copy, &video_codec_name, CODEC_TYPE_VIDEO, arg); } static void opt_subtitle_codec(const char *arg) { - opt_codec(&subtitle_stream_copy, &subtitle_codec_id, CODEC_TYPE_SUBTITLE, arg); + opt_codec(&subtitle_stream_copy, &subtitle_codec_name, CODEC_TYPE_SUBTITLE, arg); } static void opt_map(const char *arg) @@ -2507,6 +2495,26 @@ static void opt_input_ts_offset(const char *arg) input_ts_offset = parse_date(arg, 1); } +static enum CodecID find_codec_or_die(const char *name, int type, int encoder) +{ + AVCodec *codec; + + if(!name) + return CODEC_ID_NONE; + codec = encoder ? + avcodec_find_encoder_by_name(name) : + avcodec_find_decoder_by_name(name); + if(!codec) { + av_log(NULL, AV_LOG_ERROR, "Unknown codec '%s'\n", name); + exit(1); + } + if(codec->type != type) { + av_log(NULL, AV_LOG_ERROR, "Invalid codec type '%s'\n", name); + exit(1); + } + return codec->id; +} + static void opt_input_file(const char *filename) { AVFormatContext *ic; @@ -2534,8 +2542,8 @@ static void opt_input_file(const char *filename) ap->pix_fmt = frame_pix_fmt; ap->channel = video_channel; ap->standard = video_standard; - ap->video_codec_id = video_codec_id; - ap->audio_codec_id = audio_codec_id; + ap->video_codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 0); + ap->audio_codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 0); if(pgmyuv_compatibility_hack) ap->video_codec_id= CODEC_ID_PGMYUV; @@ -2740,8 +2748,8 @@ static void new_video_stream(AVFormatContext *oc) AVCodec *codec; codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO); - if (video_codec_id != CODEC_ID_NONE) - codec_id = video_codec_id; + if (video_codec_name) + codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 1); video_enc->codec_id = codec_id; codec = avcodec_find_encoder(codec_id); @@ -2849,7 +2857,7 @@ static void new_video_stream(AVFormatContext *oc) /* reset some key parameters */ video_disable = 0; - video_codec_id = CODEC_ID_NONE; + av_freep(&video_codec_name); video_stream_copy = 0; } @@ -2896,8 +2904,8 @@ static void new_audio_stream(AVFormatContext *oc) av_set_double(audio_enc, opt_names[i], d); } - if (audio_codec_id != CODEC_ID_NONE) - codec_id = audio_codec_id; + if (audio_codec_name) + codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 1); audio_enc->codec_id = codec_id; if (audio_qscale > QSCALE_NONE) { @@ -2917,7 +2925,7 @@ static void new_audio_stream(AVFormatContext *oc) /* reset some key parameters */ audio_disable = 0; - audio_codec_id = CODEC_ID_NONE; + av_freep(&audio_codec_name); audio_stream_copy = 0; } @@ -2945,7 +2953,7 @@ static void new_subtitle_stream(AVFormatContext *oc) if(d==d && (opt->flags&AV_OPT_FLAG_SUBTITLE_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM)) av_set_double(subtitle_enc, opt_names[i], d); } - subtitle_enc->codec_id = subtitle_codec_id; + subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 1); } if (subtitle_language) { @@ -2955,7 +2963,7 @@ static void new_subtitle_stream(AVFormatContext *oc) } subtitle_disable = 0; - subtitle_codec_id = CODEC_ID_NONE; + av_freep(&subtitle_codec_name); subtitle_stream_copy = 0; } @@ -3025,9 +3033,9 @@ static void opt_output_file(const char *filename) exit(1); } } else { - use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_id != CODEC_ID_NONE; - use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_id != CODEC_ID_NONE; - use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_id != CODEC_ID_NONE; + use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name; + use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name; + use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name; /* disable if no corresponding type found and at least one input file */ @@ -3863,6 +3871,10 @@ int main(int argc, char **argv) av_free(opt_names); + av_free(video_codec_name); + av_free(audio_codec_name); + av_free(subtitle_codec_name); + av_free(video_standard); #ifdef CONFIG_POWERPC_PERF -- cgit v1.2.3