Commit a69d0745 authored by benoit's avatar benoit

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


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@9983 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent f74b356f
...@@ -128,7 +128,7 @@ static char *video_rc_override_string=NULL; ...@@ -128,7 +128,7 @@ static char *video_rc_override_string=NULL;
static char *video_rc_eq="tex^qComp"; static char *video_rc_eq="tex^qComp";
static int video_disable = 0; static int video_disable = 0;
static int video_discard = 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 video_codec_tag = 0;
static int same_quality = 0; static int same_quality = 0;
static int do_deinterlace = 0; static int do_deinterlace = 0;
...@@ -146,12 +146,12 @@ static int audio_sample_rate = 44100; ...@@ -146,12 +146,12 @@ static int audio_sample_rate = 44100;
static float audio_qscale = QSCALE_NONE; static float audio_qscale = QSCALE_NONE;
static int audio_disable = 0; static int audio_disable = 0;
static int audio_channels = 1; 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 int audio_codec_tag = 0;
static char *audio_language = NULL; static char *audio_language = NULL;
static int subtitle_disable = 0; 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 char *subtitle_language = NULL;
static float mux_preload= 0.5; static float mux_preload= 0.5;
...@@ -2368,32 +2368,20 @@ static void opt_video_standard(const char *arg) ...@@ -2368,32 +2368,20 @@ static void opt_video_standard(const char *arg)
video_standard = av_strdup(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) int codec_type, const char *arg)
{ {
AVCodec *p; av_freep(pcodec_name);
if (!strcmp(arg, "copy")) { if (!strcmp(arg, "copy")) {
*pstream_copy = 1; *pstream_copy = 1;
} else { } else {
p = first_avcodec; *pcodec_name = av_strdup(arg);
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;
}
} }
} }
static void opt_audio_codec(const char *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) static void opt_audio_tag(const char *arg)
...@@ -2439,12 +2427,12 @@ static void add_frame_hooker(const char *arg) ...@@ -2439,12 +2427,12 @@ static void add_frame_hooker(const char *arg)
static void opt_video_codec(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) 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) static void opt_map(const char *arg)
...@@ -2507,6 +2495,26 @@ static void opt_input_ts_offset(const char *arg) ...@@ -2507,6 +2495,26 @@ static void opt_input_ts_offset(const char *arg)
input_ts_offset = parse_date(arg, 1); 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) static void opt_input_file(const char *filename)
{ {
AVFormatContext *ic; AVFormatContext *ic;
...@@ -2534,8 +2542,8 @@ static void opt_input_file(const char *filename) ...@@ -2534,8 +2542,8 @@ static void opt_input_file(const char *filename)
ap->pix_fmt = frame_pix_fmt; ap->pix_fmt = frame_pix_fmt;
ap->channel = video_channel; ap->channel = video_channel;
ap->standard = video_standard; ap->standard = video_standard;
ap->video_codec_id = video_codec_id; ap->video_codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 0);
ap->audio_codec_id = audio_codec_id; ap->audio_codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 0);
if(pgmyuv_compatibility_hack) if(pgmyuv_compatibility_hack)
ap->video_codec_id= CODEC_ID_PGMYUV; ap->video_codec_id= CODEC_ID_PGMYUV;
...@@ -2740,8 +2748,8 @@ static void new_video_stream(AVFormatContext *oc) ...@@ -2740,8 +2748,8 @@ static void new_video_stream(AVFormatContext *oc)
AVCodec *codec; AVCodec *codec;
codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO); codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
if (video_codec_id != CODEC_ID_NONE) if (video_codec_name)
codec_id = video_codec_id; codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 1);
video_enc->codec_id = codec_id; video_enc->codec_id = codec_id;
codec = avcodec_find_encoder(codec_id); codec = avcodec_find_encoder(codec_id);
...@@ -2849,7 +2857,7 @@ static void new_video_stream(AVFormatContext *oc) ...@@ -2849,7 +2857,7 @@ static void new_video_stream(AVFormatContext *oc)
/* reset some key parameters */ /* reset some key parameters */
video_disable = 0; video_disable = 0;
video_codec_id = CODEC_ID_NONE; av_freep(&video_codec_name);
video_stream_copy = 0; video_stream_copy = 0;
} }
...@@ -2896,8 +2904,8 @@ static void new_audio_stream(AVFormatContext *oc) ...@@ -2896,8 +2904,8 @@ static void new_audio_stream(AVFormatContext *oc)
av_set_double(audio_enc, opt_names[i], d); av_set_double(audio_enc, opt_names[i], d);
} }
if (audio_codec_id != CODEC_ID_NONE) if (audio_codec_name)
codec_id = audio_codec_id; codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 1);
audio_enc->codec_id = codec_id; audio_enc->codec_id = codec_id;
if (audio_qscale > QSCALE_NONE) { if (audio_qscale > QSCALE_NONE) {
...@@ -2917,7 +2925,7 @@ static void new_audio_stream(AVFormatContext *oc) ...@@ -2917,7 +2925,7 @@ static void new_audio_stream(AVFormatContext *oc)
/* reset some key parameters */ /* reset some key parameters */
audio_disable = 0; audio_disable = 0;
audio_codec_id = CODEC_ID_NONE; av_freep(&audio_codec_name);
audio_stream_copy = 0; audio_stream_copy = 0;
} }
...@@ -2945,7 +2953,7 @@ static void new_subtitle_stream(AVFormatContext *oc) ...@@ -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)) 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); 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) { if (subtitle_language) {
...@@ -2955,7 +2963,7 @@ static void new_subtitle_stream(AVFormatContext *oc) ...@@ -2955,7 +2963,7 @@ static void new_subtitle_stream(AVFormatContext *oc)
} }
subtitle_disable = 0; subtitle_disable = 0;
subtitle_codec_id = CODEC_ID_NONE; av_freep(&subtitle_codec_name);
subtitle_stream_copy = 0; subtitle_stream_copy = 0;
} }
...@@ -3025,9 +3033,9 @@ static void opt_output_file(const char *filename) ...@@ -3025,9 +3033,9 @@ static void opt_output_file(const char *filename)
exit(1); exit(1);
} }
} else { } else {
use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_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_id != CODEC_ID_NONE; 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_id != CODEC_ID_NONE; 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 /* disable if no corresponding type found and at least one
input file */ input file */
...@@ -3863,6 +3871,10 @@ int main(int argc, char **argv) ...@@ -3863,6 +3871,10 @@ int main(int argc, char **argv)
av_free(opt_names); av_free(opt_names);
av_free(video_codec_name);
av_free(audio_codec_name);
av_free(subtitle_codec_name);
av_free(video_standard); av_free(video_standard);
#ifdef CONFIG_POWERPC_PERF #ifdef CONFIG_POWERPC_PERF
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment