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.
This commit is contained in:
Stefano Sabatini 2012-12-15 22:40:26 +01:00
parent 718eab527b
commit cb0f97b59d
2 changed files with 35 additions and 10 deletions

View File

@ -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

View File

@ -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, },
};