X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=ffplay.c;h=6e55e0f18b569bf6fbd7697ab57974f07ac205c3;hb=6865e04620fa14eada30866cd8efbcbd9157537b;hp=cc4e853440d491e889c1c4f5d85a564d02826567;hpb=94eadc8ba0c8953c916acb0c431aabe5cdc8427d;p=ffmpeg diff --git a/ffplay.c b/ffplay.c index cc4e853440d..6e55e0f18b5 100644 --- a/ffplay.c +++ b/ffplay.c @@ -21,13 +21,12 @@ #include #include -#include "avformat.h" -#include "avdevice.h" -#include "rtsp.h" -#include "swscale.h" -#include "avstring.h" +#include "libavutil/avstring.h" +#include "libavformat/avformat.h" +#include "libavformat/rtsp.h" +#include "libavdevice/avdevice.h" +#include "libswscale/swscale.h" -#include "version.h" #include "cmdutils.h" #include @@ -39,8 +38,8 @@ #undef exit -static const char program_name[] = "FFplay"; -static const int program_birth_year = 2003; +const char program_name[] = "FFplay"; +const int program_birth_year = 2003; //#define DEBUG_SYNC @@ -169,7 +168,7 @@ typedef struct VideoState { int width, height, xleft, ytop; } VideoState; -void show_help(void); +static void show_help(void); static int audio_write_get_buf_size(VideoState *is); /* options specified by the user */ @@ -657,7 +656,7 @@ static void video_image_display(VideoState *is) aspect_ratio = 0; else aspect_ratio = av_q2d(is->video_st->codec->sample_aspect_ratio) - * is->video_st->codec->width / is->video_st->codec->height;; + * is->video_st->codec->width / is->video_st->codec->height; if (aspect_ratio <= 0.0) aspect_ratio = (float)is->video_st->codec->width / (float)is->video_st->codec->height; @@ -1645,7 +1644,7 @@ static int audio_write_get_buf_size(VideoState *is) /* prepare a new audio buffer */ -void sdl_audio_callback(void *opaque, Uint8 *stream, int len) +static void sdl_audio_callback(void *opaque, Uint8 *stream, int len) { VideoState *is = opaque; int audio_size, len1; @@ -1693,23 +1692,11 @@ static int stream_component_open(VideoState *is, int stream_index) /* prepare audio output */ if (enc->codec_type == CODEC_TYPE_AUDIO) { - wanted_spec.freq = enc->sample_rate; - wanted_spec.format = AUDIO_S16SYS; - if(enc->channels > 2) { - wanted_spec.channels = 2; - enc->request_channels = 2; + if (enc->channels > 0) { + enc->request_channels = FFMIN(2, enc->channels); } else { - wanted_spec.channels = enc->channels; - } - wanted_spec.silence = 0; - wanted_spec.samples = SDL_AUDIO_BUFFER_SIZE; - wanted_spec.callback = sdl_audio_callback; - wanted_spec.userdata = is; - if (SDL_OpenAudio(&wanted_spec, &spec) < 0) { - fprintf(stderr, "SDL_OpenAudio: %s\n", SDL_GetError()); - return -1; + enc->request_channels = 2; } - is->audio_hw_buf_size = spec.size; } codec = avcodec_find_decoder(enc->codec_id); @@ -1728,6 +1715,23 @@ static int stream_component_open(VideoState *is, int stream_index) if (!codec || avcodec_open(enc, codec) < 0) return -1; + + /* prepare audio output */ + if (enc->codec_type == CODEC_TYPE_AUDIO) { + wanted_spec.freq = enc->sample_rate; + wanted_spec.format = AUDIO_S16SYS; + wanted_spec.channels = enc->channels; + wanted_spec.silence = 0; + wanted_spec.samples = SDL_AUDIO_BUFFER_SIZE; + wanted_spec.callback = sdl_audio_callback; + wanted_spec.userdata = is; + if (SDL_OpenAudio(&wanted_spec, &spec) < 0) { + fprintf(stderr, "SDL_OpenAudio: %s\n", SDL_GetError()); + return -1; + } + is->audio_hw_buf_size = spec.size; + } + if(thread_count>1) avcodec_thread_init(enc, thread_count); enc->thread_count= thread_count; @@ -2359,22 +2363,16 @@ static void opt_frame_size(const char *arg) } } -static void opt_width(const char *arg) +static int opt_width(const char *opt, const char *arg) { - screen_width = atoi(arg); - if(screen_width<=0){ - fprintf(stderr, "invalid width\n"); - exit(1); - } + screen_width = parse_number_or_die(opt, arg, OPT_INT64, 1, INT_MAX); + return 0; } -static void opt_height(const char *arg) +static int opt_height(const char *opt, const char *arg) { - screen_height = atoi(arg); - if(screen_height<=0){ - fprintf(stderr, "invalid height\n"); - exit(1); - } + screen_height = parse_number_or_die(opt, arg, OPT_INT64, 1, INT_MAX); + return 0; } static void opt_format(const char *arg) @@ -2391,15 +2389,7 @@ static void opt_frame_pix_fmt(const char *arg) frame_pix_fmt = avcodec_get_pix_fmt(arg); } -#ifdef CONFIG_RTSP_DEMUXER -static void opt_rtp_tcp(void) -{ - /* only tcp protocol */ - rtsp_default_protocols = (1 << RTSP_PROTOCOL_RTP_TCP); -} -#endif - -static void opt_sync(const char *arg) +static int opt_sync(const char *opt, const char *arg) { if (!strcmp(arg, "audio")) av_sync_type = AV_SYNC_AUDIO_MASTER; @@ -2408,64 +2398,62 @@ static void opt_sync(const char *arg) else if (!strcmp(arg, "ext")) av_sync_type = AV_SYNC_EXTERNAL_CLOCK; else { - show_help(); + fprintf(stderr, "Unknown value for %s: %s\n", opt, arg); exit(1); } + return 0; } -static void opt_seek(const char *arg) +static int opt_seek(const char *opt, const char *arg) { - start_time = parse_date(arg, 1); - if (start_time == INT64_MIN) { - fprintf(stderr, "Invalid duration specification: %s\n", arg); - exit(1); - } + start_time = parse_time_or_die(opt, arg, 1); + return 0; } -static void opt_debug(const char *arg) +static int opt_debug(const char *opt, const char *arg) { av_log_set_level(99); - debug = atoi(arg); + debug = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX); + return 0; } -static void opt_vismv(const char *arg) +static int opt_vismv(const char *opt, const char *arg) { - debug_mv = atoi(arg); + debug_mv = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX); + return 0; } -static void opt_thread_count(const char *arg) +static int opt_thread_count(const char *opt, const char *arg) { - thread_count= atoi(arg); + thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX); #if !defined(HAVE_THREADS) fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n"); #endif + return 0; } -static void opt_show_help(void) -{ - show_help(); - exit(0); -} - -const OptionDef options[] = { - { "h", 0, {(void*)opt_show_help}, "show help" }, - { "x", HAS_ARG, {(void*)opt_width}, "force displayed width", "width" }, - { "y", HAS_ARG, {(void*)opt_height}, "force displayed height", "height" }, +static const OptionDef options[] = { + { "h", OPT_EXIT, {(void*)show_help}, "show help" }, + { "version", OPT_EXIT, {(void*)show_version}, "show version" }, + { "L", OPT_EXIT, {(void*)show_license}, "show license" }, + { "formats", OPT_EXIT, {(void*)show_formats}, "show available formats, codecs, protocols, ..." }, + { "x", HAS_ARG | OPT_FUNC2, {(void*)opt_width}, "force displayed width", "width" }, + { "y", HAS_ARG | OPT_FUNC2, {(void*)opt_height}, "force displayed height", "height" }, { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" }, { "fs", OPT_BOOL, {(void*)&is_full_screen}, "force full screen" }, { "an", OPT_BOOL, {(void*)&audio_disable}, "disable audio" }, { "vn", OPT_BOOL, {(void*)&video_disable}, "disable video" }, { "ast", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&wanted_audio_stream}, "", "" }, { "vst", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&wanted_video_stream}, "", "" }, - { "ss", HAS_ARG, {(void*)&opt_seek}, "seek to a given position in seconds", "pos" }, + { "ss", HAS_ARG | OPT_FUNC2, {(void*)&opt_seek}, "seek to a given position in seconds", "pos" }, { "bytes", OPT_BOOL, {(void*)&seek_by_bytes}, "seek by bytes" }, { "nodisp", OPT_BOOL, {(void*)&display_disable}, "disable graphical display" }, { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" }, { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format", "format" }, { "stats", OPT_BOOL | OPT_EXPERT, {(void*)&show_status}, "show status", "" }, - { "debug", HAS_ARG | OPT_EXPERT, {(void*)opt_debug}, "print specific debug info", "" }, + { "debug", HAS_ARG | OPT_FUNC2 | OPT_EXPERT, {(void*)opt_debug}, "print specific debug info", "" }, { "bug", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&workaround_bugs}, "workaround bugs", "" }, - { "vismv", HAS_ARG | OPT_EXPERT, {(void*)opt_vismv}, "visualize motion vectors", "" }, + { "vismv", HAS_ARG | OPT_FUNC2 | OPT_EXPERT, {(void*)opt_vismv}, "visualize motion vectors", "" }, { "fast", OPT_BOOL | OPT_EXPERT, {(void*)&fast}, "non spec compliant optimizations", "" }, { "genpts", OPT_BOOL | OPT_EXPERT, {(void*)&genpts}, "generate pts", "" }, { "drp", OPT_BOOL |OPT_EXPERT, {(void*)&decoder_reorder_pts}, "let decoder reorder pts", ""}, @@ -2476,15 +2464,12 @@ const OptionDef options[] = { { "idct", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&idct}, "set idct algo", "algo" }, { "er", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&error_resilience}, "set error detection threshold (0-4)", "threshold" }, { "ec", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&error_concealment}, "set error concealment options", "bit_mask" }, -#ifdef CONFIG_RTSP_DEMUXER - { "rtp_tcp", OPT_EXPERT, {(void*)&opt_rtp_tcp}, "force RTP/TCP protocol usage", "" }, -#endif - { "sync", HAS_ARG | OPT_EXPERT, {(void*)opt_sync}, "set audio-video sync. type (type=audio/video/ext)", "type" }, - { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" }, + { "sync", HAS_ARG | OPT_FUNC2 | OPT_EXPERT, {(void*)opt_sync}, "set audio-video sync. type (type=audio/video/ext)", "type" }, + { "threads", HAS_ARG | OPT_FUNC2 | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" }, { NULL, }, }; -void show_help(void) +static void show_help(void) { printf("usage: ffplay [options] input_file\n" "Simple media player\n"); @@ -2507,7 +2492,7 @@ void show_help(void) ); } -void opt_input_file(const char *filename) +static void opt_input_file(const char *filename) { if (!strcmp(filename, "-")) filename = "pipe:"; @@ -2524,7 +2509,7 @@ int main(int argc, char **argv) avdevice_register_all(); av_register_all(); - show_banner(program_name, program_birth_year); + show_banner(); parse_options(argc, argv, options, opt_input_file);