diff options
author | Stefano Sabatini <stefasab@gmail.com> | 2012-12-15 22:40:26 +0100 |
---|---|---|
committer | Stefano Sabatini <stefasab@gmail.com> | 2012-12-16 10:57:50 +0100 |
commit | cb0f97b59d67bda2c33586922640e65e128c17fb (patch) | |
tree | dab09f883da09f4136521eb14ee8aa43ad510f9d | |
parent | 718eab527b9af53582c0370e28967e20df991364 (diff) | |
download | ffmpeg-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.
-rw-r--r-- | doc/ffplay.texi | 16 | ||||
-rw-r--r-- | ffplay.c | 29 |
2 files changed, 35 insertions, 10 deletions
diff --git a/doc/ffplay.texi b/doc/ffplay.texi index e2bded7dcc..1396b01b42 100644 --- a/doc/ffplay.texi +++ b/doc/ffplay.texi @@ -134,8 +134,20 @@ Exit when video is done playing. Exit if any key is pressed. @item -exitonmousedown Exit if any mouse button is pressed. -@item -codec:@var{stream_type} -Force a specific decoder implementation + +@item -codec:@var{media_specifier} @var{codec_name} +Force a specific decoder implementation for the stream identified by +@var{media_specifier}, which can assume the values @code{a} (audio), +@code{v} (video), and @code{s} subtitle. + +@item -acodec @var{codec_name} +Force a specific audio decoder. + +@item -vcodec @var{codec_name} +Force a specific video decoder. + +@item -scodec @var{codec_name} +Force a specific subtitle decoder. @end table @section While playing @@ -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, }, }; |