Commit 4a897224 authored by Nicolas George's avatar Nicolas George Committed by Benoit Fouet

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
parent 85060fe6
......@@ -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
......
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