X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=ffplay.c;h=d5985f73eaa92f683231f9a9799e5eaa1d665530;hb=1dd33d472a608daba459b628c170e89d796f1795;hp=d6b17c206c0f61ce6c31f2c29d8750c126838cbe;hpb=86b4dc6277691781015000763563d1baf212cdc7;p=ffmpeg diff --git a/ffplay.c b/ffplay.c index d6b17c206c0..d5985f73eaa 100644 --- a/ffplay.c +++ b/ffplay.c @@ -2300,6 +2300,7 @@ static int stream_component_open(VideoState *is, int stream_index) AVFormatContext *ic = is->ic; AVCodecContext *avctx; AVCodec *codec; + const char *forced_codec_name = NULL; AVDictionary *opts; AVDictionaryEntry *t = NULL; @@ -2310,13 +2311,19 @@ static int stream_component_open(VideoState *is, int stream_index) codec = avcodec_find_decoder(avctx->codec_id); switch(avctx->codec_type){ - case AVMEDIA_TYPE_AUDIO : is->last_audio_stream = stream_index; if(audio_codec_name ) codec= avcodec_find_decoder_by_name( audio_codec_name); break; - case AVMEDIA_TYPE_SUBTITLE: is->last_subtitle_stream = stream_index; if(subtitle_codec_name) codec= avcodec_find_decoder_by_name(subtitle_codec_name); break; - case AVMEDIA_TYPE_VIDEO : is->last_video_stream = stream_index; if(video_codec_name ) codec= avcodec_find_decoder_by_name( video_codec_name); break; - } - if (!codec) + case AVMEDIA_TYPE_AUDIO : is->last_audio_stream = stream_index; forced_codec_name = audio_codec_name; break; + case AVMEDIA_TYPE_SUBTITLE: is->last_subtitle_stream = stream_index; forced_codec_name = subtitle_codec_name; break; + case AVMEDIA_TYPE_VIDEO : is->last_video_stream = stream_index; forced_codec_name = video_codec_name; break; + } + if (forced_codec_name) + codec = avcodec_find_decoder_by_name(forced_codec_name); + if (!codec) { + if (forced_codec_name) fprintf(stderr, "No codec could be found with name '%s'\n", forced_codec_name); + else fprintf(stderr, "No codec could be found with id %d\n", avctx->codec_id); return -1; + } + avctx->codec_id = codec->id; avctx->workaround_bugs = workaround_bugs; avctx->lowres = lowres; if(avctx->lowres > codec->max_lowres){ @@ -3147,14 +3154,24 @@ static void opt_input_file(void *optctx, const char *filename) input_filename = filename; } -static int opt_codec(void *o, const char *opt, const char *arg) +static int opt_codec(void *optctx, const char *opt, const char *arg) { - switch(opt[strlen(opt)-1]){ - case 'a' : audio_codec_name = arg; break; - case 's' : subtitle_codec_name = arg; break; - case 'v' : video_codec_name = arg; break; - } - return 0; + const char *spec = strchr(opt, ':'); + if (!spec) { + fprintf(stderr, "No media specifier was specified in '%s' in option '%s'\n", + arg, opt); + return AVERROR(EINVAL); + } + spec++; + switch (spec[0]) { + case 'a' : audio_codec_name = arg; break; + case 's' : subtitle_codec_name = arg; break; + case 'v' : video_codec_name = arg; break; + default: + fprintf(stderr, "Invalid media specifier '%s' in option '%s'\n", spec, opt); + return AVERROR(EINVAL); + } + return 0; } static int dummy; @@ -3202,7 +3219,10 @@ static const OptionDef options[] = { { "showmode", HAS_ARG, { .func_arg = opt_show_mode}, "select show mode (0 = video, 1 = waves, 2 = RDFT)", "mode" }, { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, { .func_arg = opt_default }, "generic catch all option", "" }, { "i", OPT_BOOL, { &dummy}, "read specified file", "input_file"}, - { "codec", HAS_ARG, { .func_arg = opt_codec}, "force decoder", "decoder" }, + { "codec", HAS_ARG, { .func_arg = opt_codec}, "force decoder", "decoder_name" }, + { "acodec", HAS_ARG | OPT_STRING | OPT_EXPERT, { &audio_codec_name }, "force audio decoder", "decoder_name" }, + { "scodec", HAS_ARG | OPT_STRING | OPT_EXPERT, { &subtitle_codec_name }, "force subtitle decoder", "decoder_name" }, + { "vcodec", HAS_ARG | OPT_STRING | OPT_EXPERT, { &video_codec_name }, "force video decoder", "decoder_name" }, { NULL, }, };