aboutsummaryrefslogtreecommitdiffstats
path: root/ffplay.c
diff options
context:
space:
mode:
authorStefano Sabatini <stefasab@gmail.com>2012-12-15 22:40:26 +0100
committerStefano Sabatini <stefasab@gmail.com>2012-12-16 10:57:50 +0100
commitcb0f97b59d67bda2c33586922640e65e128c17fb (patch)
treedab09f883da09f4136521eb14ee8aa43ad510f9d /ffplay.c
parent718eab527b9af53582c0370e28967e20df991364 (diff)
downloadffmpeg-cb0f97b59d67bda2c33586922640e65e128c17fb.tar.gz
ffplay: improve robustness of opt_codec(), and add options acodec,vcodec,scodec
Fail with a meaningfull error message in case of bogus input. Also the new options are more consistent with the rest of the tool options, since it does not support generic stream specifiers.
Diffstat (limited to 'ffplay.c')
-rw-r--r--ffplay.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/ffplay.c b/ffplay.c
index d6b17c206c..3384c6cba5 100644
--- a/ffplay.c
+++ b/ffplay.c
@@ -3147,14 +3147,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 +3212,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, },
};