56 #include <SDL_thread.h>
65 #define MAX_QUEUE_SIZE (15 * 1024 * 1024)
70 #define SDL_AUDIO_BUFFER_SIZE 1024
73 #define AV_SYNC_THRESHOLD_MIN 0.01
75 #define AV_SYNC_THRESHOLD_MAX 0.1
77 #define AV_SYNC_FRAMEDUP_THRESHOLD 0.1
79 #define AV_NOSYNC_THRESHOLD 10.0
82 #define SAMPLE_CORRECTION_PERCENT_MAX 10
85 #define EXTERNAL_CLOCK_SPEED_MIN 0.900
86 #define EXTERNAL_CLOCK_SPEED_MAX 1.010
87 #define EXTERNAL_CLOCK_SPEED_STEP 0.001
90 #define AUDIO_DIFF_AVG_NB 20
93 #define REFRESH_RATE 0.01
97 #define SAMPLE_ARRAY_SIZE (8 * 65536)
99 #define CURSOR_HIDE_DELAY 1000000
119 #define VIDEO_PICTURE_QUEUE_SIZE 3
120 #define SUBPICTURE_QUEUE_SIZE 4
327 static char *vfilters = NULL;
328 static char *afilters = NULL;
337 #define FF_ALLOC_EVENT (SDL_USEREVENT)
338 #define FF_QUIT_EVENT (SDL_USEREVENT + 2)
347 if (channel_count1 == 1 && channel_count2 == 1)
350 return channel_count1 != channel_count2 || fmt1 != fmt2;
357 return channel_layout;
376 if (pkt == &flush_pkt)
388 SDL_CondSignal(q->
cond);
400 SDL_LockMutex(q->
mutex);
402 SDL_UnlockMutex(q->
mutex);
404 if (pkt != &flush_pkt && ret < 0)
424 q->
mutex = SDL_CreateMutex();
425 q->
cond = SDL_CreateCond();
433 SDL_LockMutex(q->
mutex);
434 for (pkt = q->
first_pkt; pkt != NULL; pkt = pkt1) {
443 SDL_UnlockMutex(q->
mutex);
449 SDL_DestroyMutex(q->
mutex);
450 SDL_DestroyCond(q->
cond);
455 SDL_LockMutex(q->
mutex);
459 SDL_CondSignal(q->
cond);
461 SDL_UnlockMutex(q->
mutex);
466 SDL_LockMutex(q->
mutex);
469 SDL_UnlockMutex(q->
mutex);
478 SDL_LockMutex(q->
mutex);
506 SDL_UnlockMutex(q->
mutex);
518 SDL_FillRect(screen, &rect, color);
519 if (update && w > 0 && h > 0)
520 SDL_UpdateRect(screen, x, y, w, h);
532 w2 = width - (x + w);
538 h2 = height - (y + h);
546 xleft + width - w2, ytop,
554 xleft + w1, ytop + height - h2,
559 #define ALPHA_BLEND(a, oldp, newp, s)\
560 ((((oldp << s) * (255 - (a))) + (newp * (a))) / (255 << s))
562 #define RGBA_IN(r, g, b, a, s)\
564 unsigned int v = ((const uint32_t *)(s))[0];\
565 a = (v >> 24) & 0xff;\
566 r = (v >> 16) & 0xff;\
567 g = (v >> 8) & 0xff;\
571 #define YUVA_IN(y, u, v, a, s, pal)\
573 unsigned int val = ((const uint32_t *)(pal))[*(const uint8_t*)(s)];\
574 a = (val >> 24) & 0xff;\
575 y = (val >> 16) & 0xff;\
576 u = (val >> 8) & 0xff;\
580 #define YUVA_OUT(d, y, u, v, a)\
582 ((uint32_t *)(d))[0] = (a << 24) | (y << 16) | (u << 8) | v;\
590 int wrap, wrap3, width2, skip2;
591 int y,
u,
v,
a, u1, v1,
a1, w, h;
595 int dstx, dsty, dstw, dsth;
597 dstw = av_clip(rect->
w, 0, imgw);
598 dsth = av_clip(rect->
h, 0, imgh);
599 dstx = av_clip(rect->
x, 0, imgw - dstw);
600 dsty = av_clip(rect->
y, 0, imgh - dsth);
605 width2 = ((dstw + 1) >> 1) + (dstx & ~dstw & 1);
610 pal = (
const uint32_t *)rect->
pict.
data[1];
627 for (w = dstw - (dstx & 1); w >= 2; w -= 2) {
654 p += wrap3 - dstw *
BPP;
655 lum += wrap - dstw - dstx;
656 cb += dst->
linesize[1] - width2 - skip2;
657 cr += dst->
linesize[2] - width2 - skip2;
659 for (h = dsth - (dsty & 1); h >= 2; h -= 2) {
684 for (w = dstw - (dstx & 1); w >= 2; w -= 2) {
716 p += -wrap3 + 2 *
BPP;
739 p += wrap3 + (wrap3 - dstw *
BPP);
740 lum += wrap + (wrap - dstw - dstx);
741 cb += dst->
linesize[1] - width2 - skip2;
742 cr += dst->
linesize[2] - width2 - skip2;
760 for (w = dstw - (dstx & 1); w >= 2; w -= 2) {
791 SDL_FreeYUVOverlay(vp->
bmp);
811 if (aspect_ratio <= 0.0)
813 aspect_ratio *= (float)vp->
width / (
float)vp->
height;
817 width = ((int)
rint(height * aspect_ratio)) & ~1;
818 if (width > scr_width) {
820 height = ((int)
rint(width / aspect_ratio)) & ~1;
822 x = (scr_width -
width) / 2;
823 y = (scr_height -
height) / 2;
824 rect->x = scr_xleft + x;
825 rect->y = scr_ytop +
y;
826 rect->w =
FFMAX(width, 1);
827 rect->h =
FFMAX(height, 1);
845 SDL_LockYUVOverlay (vp->
bmp);
847 pict.
data[0] = vp->
bmp->pixels[0];
848 pict.
data[1] = vp->
bmp->pixels[2];
849 pict.
data[2] = vp->
bmp->pixels[1];
859 SDL_UnlockYUVOverlay (vp->
bmp);
866 SDL_DisplayYUVOverlay(vp->
bmp, &rect);
869 int bgcolor = SDL_MapRGB(
screen->format, 0x00, 0x00, 0x00);
878 return a < 0 ? a%b + b : a%
b;
883 int i, i_start, x, y1,
y, ys, delay,
n, nb_display_channels;
884 int ch, channels, h, h2, bgcolor, fgcolor;
886 int rdft_bits, nb_freq;
888 for (rdft_bits = 1; (1 << rdft_bits) < 2 * s->
height; rdft_bits++)
890 nb_freq = 1 << (rdft_bits - 1);
894 nb_display_channels = channels;
896 int data_used= s->
show_mode == SHOW_MODE_WAVES ? s->
width : (2*nb_freq);
908 delay += 2 * data_used;
909 if (delay < data_used)
915 for (i = 0; i < 1000; i += channels) {
922 if (h < score && (b ^ c) < 0) {
934 bgcolor = SDL_MapRGB(
screen->format, 0x00, 0x00, 0x00);
940 fgcolor = SDL_MapRGB(
screen->format, 0xff, 0xff, 0xff);
943 h = s->
height / nb_display_channels;
946 for (ch = 0; ch < nb_display_channels; ch++) {
948 y1 = s->
ytop + ch * h + (h / 2);
949 for (x = 0; x < s->
width; x++) {
958 s->
xleft + x, ys, 1, y,
966 fgcolor = SDL_MapRGB(
screen->format, 0x00, 0x00, 0xff);
968 for (ch = 1; ch < nb_display_channels; ch++) {
969 y = s->
ytop + ch * h;
976 nb_display_channels=
FFMIN(nb_display_channels, 2);
986 for (ch = 0; ch < nb_display_channels; ch++) {
987 data[ch] = s->
rdft_data + 2 * nb_freq * ch;
989 for (x = 0; x < 2 * nb_freq; x++) {
990 double w = (x-nb_freq) * (1.0 / nb_freq);
1000 for (y = 0; y < s->
height; y++) {
1001 double w = 1 / sqrt(nb_freq);
1002 int a = sqrt(w * sqrt(data[0][2 * y + 0] * data[0][2 * y + 0] + data[0][2 * y + 1] * data[0][2 * y + 1]));
1003 int b = (nb_display_channels == 2 ) ? sqrt(w * sqrt(data[1][2 * y + 0] * data[1][2 * y + 0]
1004 + data[1][2 * y + 1] * data[1][2 * y + 1])) : a;
1007 fgcolor = SDL_MapRGB(
screen->format, a, b, (a + b) / 2);
1027 SDL_WaitThread(is->
read_tid, NULL);
1042 #if !CONFIG_AVFILTER
1073 int flags = SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_HWACCEL;
1078 else flags |= SDL_RESIZABLE;
1080 if (vp && vp->
width) {
1096 w =
FFMIN(16383, w);
1100 screen = SDL_SetVideoMode(w, h, 0, flags);
1267 double sync_threshold, diff;
1280 if (diff <= -sync_threshold)
1281 delay =
FFMAX(0, delay + diff);
1283 delay = delay + diff;
1284 else if (diff >= sync_threshold)
1289 av_dlog(NULL,
"video: delay=%0.3f A-V=%f\n",
1368 double last_duration,
duration, delay;
1383 if (!
isnan(last_duration) && last_duration > 0 && last_duration < is->max_frame_duration) {
1393 if (time < is->frame_timer + delay && !redisplay) {
1409 duration = nextvp->
pts - vp->
pts;
1461 static int64_t last_time;
1463 int aqsize, vqsize, sqsize;
1467 if (!last_time || (cur_time - last_time) >= 30000) {
1485 "%7.2f %s:%7.3f fd=%4d aq=%5dKB vq=%5dKB sq=%5dB f=%"PRId64
"/%"PRId64
" \r",
1517 bufferdiff = vp->
bmp ?
FFMAX(vp->
bmp->pixels[0], vp->
bmp->pixels[1]) -
FFMIN(vp->
bmp->pixels[0], vp->
bmp->pixels[1]) : 0;
1518 if (!vp->
bmp || vp->
bmp->pitches[0] < vp->
width || bufferdiff < (int64_t)vp->
height * vp->
bmp->pitches[0]) {
1522 "Error: the video system does not support an image\n"
1523 "size of %dx%d pixels. Try using -lowres or -vf \"scale=w:h\"\n"
1524 "to reduce the image size.\n", vp->
width, vp->
height );
1537 for (i = 0; i < 3; i++) {
1544 if (bmp->pitches[i] > width) {
1545 maxp = bmp->pixels[i] + bmp->pitches[i] * height - 1;
1546 for (p = bmp->pixels[i] + width - 1; p < maxp; p += bmp->pitches[i])
1556 #if defined(DEBUG_SYNC) && 0
1557 printf(
"frame_type=%c pts=%0.3f\n",
1592 event.user.data1 = is;
1593 SDL_PushEvent(&event);
1617 SDL_LockYUVOverlay (vp->
bmp);
1619 pict.
data[0] = vp->
bmp->pixels[0];
1620 pict.
data[1] = vp->
bmp->pixels[2];
1621 pict.
data[2] = vp->
bmp->pixels[1];
1646 SDL_UnlockYUVOverlay(vp->
bmp);
1689 if (!got_picture && !pkt->
data)
1744 if (!outputs || !inputs) {
1752 outputs->
next = NULL;
1755 inputs->filter_ctx = sink_ctx;
1756 inputs->pad_idx = 0;
1757 inputs->next = NULL;
1776 char sws_flags_str[128];
1777 char buffersrc_args[256];
1787 snprintf(buffersrc_args,
sizeof(buffersrc_args),
1788 "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
1793 av_strlcatf(buffersrc_args,
sizeof(buffersrc_args),
":frame_rate=%d/%d", fr.
num, fr.
den);
1797 "ffplay_buffer", buffersrc_args, NULL,
1803 "ffplay_buffersink", NULL, NULL, graph);
1814 "ffplay_crop",
"floor(in_w/2)*2:floor(in_h/2)*2", NULL, graph)) < 0)
1822 is->in_video_filter = filt_src;
1823 is->out_video_filter = filt_out;
1829 static int configure_audio_filters(
VideoState *is,
const char *afilters,
int force_output_format)
1833 int64_t channel_layouts[2] = { 0, -1 };
1834 int channels[2] = { 0, -1 };
1836 char aresample_swr_opts[512] =
"";
1838 char asrc_args[256];
1847 if (strlen(aresample_swr_opts))
1848 aresample_swr_opts[strlen(aresample_swr_opts)-1] =
'\0';
1849 av_opt_set(is->agraph,
"aresample_swr_opts", aresample_swr_opts, 0);
1851 ret =
snprintf(asrc_args,
sizeof(asrc_args),
1852 "sample_rate=%d:sample_fmt=%s:channels=%d:time_base=%d/%d",
1854 is->audio_filter_src.channels,
1855 1, is->audio_filter_src.freq);
1856 if (is->audio_filter_src.channel_layout)
1857 snprintf(asrc_args + ret,
sizeof(asrc_args) - ret,
1858 ":channel_layout=0x%"PRIx64, is->audio_filter_src.channel_layout);
1862 asrc_args, NULL, is->agraph);
1869 NULL, NULL, is->agraph);
1878 if (force_output_format) {
1896 is->in_audio_filter = filt_asrc;
1897 is->out_audio_filter = filt_asink;
1921 int last_serial = -1;
1938 if ( last_w != frame->
width
1939 || last_h != frame->
height
1940 || last_format != frame->
format
1941 || last_serial != serial) {
1943 "Video frame changed from size:%dx%d format:%s serial:%d to size:%dx%d format:%s serial:%d\n",
1950 if ((ret = configure_video_filters(graph, is, vfilters, frame)) < 0) {
1953 event.user.data1 = is;
1954 SDL_PushEvent(&event);
1958 filt_in = is->in_video_filter;
1959 filt_out = is->out_video_filter;
1960 last_w = frame->
width;
1962 last_format = frame->
format;
1963 last_serial = serial;
2052 &got_subtitle, pkt);
2053 if (got_subtitle && sp->
sub.
format == 0) {
2077 }
else if (got_subtitle) {
2090 size = samples_size /
sizeof(short);
2108 int wanted_nb_samples = nb_samples;
2112 double diff, avg_diff;
2113 int min_nb_samples, max_nb_samples;
2127 wanted_nb_samples = nb_samples + (int)(diff * is->
audio_src.
freq);
2130 wanted_nb_samples =
FFMIN(
FFMAX(wanted_nb_samples, min_nb_samples), max_nb_samples);
2132 av_dlog(NULL,
"diff=%f adiff=%f sample_diff=%d apts=%0.3f %f\n",
2133 diff, avg_diff, wanted_nb_samples - nb_samples,
2144 return wanted_nb_samples;
2159 int len1, data_size, resampled_data_size;
2160 int64_t dec_channel_layout;
2163 int wanted_nb_samples;
2195 pkt_temp->
data += len1;
2196 pkt_temp->
size -= len1;
2197 if (pkt_temp->
data && pkt_temp->
size <= 0 || !pkt_temp->
data && !got_frame)
2199 if (!pkt_temp->
data && !got_frame)
2224 cmp_audio_fmts(is->audio_filter_src.fmt, is->audio_filter_src.channels,
2226 is->audio_filter_src.channel_layout != dec_channel_layout ||
2231 char buf1[1024], buf2[1024];
2235 "Audio frame changed from rate:%d ch:%d fmt:%s layout:%s serial:%d to rate:%d ch:%d fmt:%s layout:%s serial:%d\n",
2241 is->audio_filter_src.channel_layout = dec_channel_layout;
2245 if ((ret = configure_audio_filters(is, afilters, 1)) < 0)
2265 tb = is->out_audio_filter->inputs[0]->time_base;
2272 dec_channel_layout =
2288 "Cannot create sample rate converter for conversion of %d Hz %s %d channels to %d Hz %s %d channels!\n",
2324 if (len2 == out_count) {
2332 resampled_data_size = data_size;
2344 static double last_clock;
2345 printf(
"audio: delay=%0.3f clock=%0.3f clock0=%0.3f\n",
2351 return resampled_data_size;
2357 memset(pkt_temp, 0,
sizeof(*pkt_temp));
2358 pkt_temp->stream_index = -1;
2396 if (audio_size < 0) {
2424 static int audio_open(
void *opaque, int64_t wanted_channel_layout,
int wanted_nb_channels,
int wanted_sample_rate,
struct AudioParams *audio_hw_params)
2426 SDL_AudioSpec wanted_spec, spec;
2428 static const int next_nb_channels[] = {0, 0, 1, 6, 2, 6, 4, 6};
2430 env = SDL_getenv(
"SDL_AUDIO_CHANNELS");
2432 wanted_nb_channels = atoi(env);
2440 wanted_spec.freq = wanted_sample_rate;
2441 if (wanted_spec.freq <= 0 || wanted_spec.channels <= 0) {
2445 wanted_spec.format = AUDIO_S16SYS;
2446 wanted_spec.silence = 0;
2449 wanted_spec.userdata = opaque;
2450 while (SDL_OpenAudio(&wanted_spec, &spec) < 0) {
2451 av_log(NULL,
AV_LOG_WARNING,
"SDL_OpenAudio (%d channels): %s\n", wanted_spec.channels, SDL_GetError());
2452 wanted_spec.channels = next_nb_channels[
FFMIN(7, wanted_spec.channels)];
2453 if (!wanted_spec.channels) {
2455 "No more channel combinations to try, audio open failed\n");
2460 if (spec.format != AUDIO_S16SYS) {
2462 "SDL advised audio format %d is not supported!\n", spec.format);
2465 if (spec.channels != wanted_spec.channels) {
2467 if (!wanted_channel_layout) {
2469 "SDL advised channel count %d is not supported!\n", spec.channels);
2475 audio_hw_params->
freq = spec.freq;
2477 audio_hw_params->
channels = spec.channels;
2487 const char *forced_codec_name = NULL;
2491 int64_t channel_layout;
2493 int stream_lowres =
lowres;
2495 if (stream_index < 0 || stream_index >= ic->
nb_streams)
2506 if (forced_codec_name)
2510 "No codec could be found with name '%s'\n", forced_codec_name);
2512 "No codec could be found with id %d\n", avctx->
codec_id);
2553 is->audio_filter_src.channels = avctx->
channels;
2555 is->audio_filter_src.fmt = avctx->
sample_fmt;
2556 if ((ret = configure_audio_filters(is, afilters, 0)) < 0)
2558 link = is->out_audio_filter->inputs[0];
2620 if (stream_index < 0 || stream_index >= ic->
nb_streams)
2712 if(s->
pb && ( !strncmp(s->
filename,
"rtp:", 4)
2713 || !strncmp(s->
filename,
"udp:", 4)
2729 int64_t stream_start_time;
2730 int pkt_in_play_range = 0;
2733 int orig_nb_streams;
2734 SDL_mutex *wait_mutex = SDL_CreateMutex();
2736 memset(st_index, -1,
sizeof(st_index));
2766 "%s: could not find codec parameters\n", is->
filename);
2770 for (i = 0; i < orig_nb_streams; i++)
2812 st_index[AVMEDIA_TYPE_VIDEO],
2818 (st_index[AVMEDIA_TYPE_AUDIO] >= 0 ?
2819 st_index[AVMEDIA_TYPE_AUDIO] :
2820 st_index[AVMEDIA_TYPE_VIDEO]),
2829 if (st_index[AVMEDIA_TYPE_AUDIO] >= 0) {
2834 if (st_index[AVMEDIA_TYPE_VIDEO] >= 0) {
2838 is->
show_mode = ret >= 0 ? SHOW_MODE_VIDEO : SHOW_MODE_RDFT;
2840 if (st_index[AVMEDIA_TYPE_SUBTITLE] >= 0) {
2851 if (infinite_buffer < 0 && is->realtime)
2864 #if CONFIG_RTSP_DEMUXER || CONFIG_MMSH_PROTOCOL
2875 int64_t seek_target = is->
seek_pos;
2876 int64_t seek_min = is->
seek_rel > 0 ? seek_target - is->
seek_rel + 2: INT64_MIN;
2877 int64_t seek_max = is->
seek_rel < 0 ? seek_target - is->
seek_rel - 2: INT64_MAX;
2884 "%s: error while seeking\n", is->
ic->
filename);
2929 SDL_LockMutex(wait_mutex);
2931 SDL_UnlockMutex(wait_mutex);
2959 SDL_LockMutex(wait_mutex);
2961 SDL_UnlockMutex(wait_mutex);
3004 event.user.data1 = is;
3005 SDL_PushEvent(&event);
3007 SDL_DestroyMutex(wait_mutex);
3053 int start_index, stream_index;
3069 stream_index = start_index;
3075 for (start_index = 0; start_index < nb_streams; start_index++)
3078 if (start_index == nb_streams)
3080 stream_index = start_index;
3085 if (++stream_index >= nb_streams)
3093 if (start_index == -1)
3097 if (stream_index == start_index)
3102 switch (codec_type) {
3117 if (p && stream_index != -1)
3126 #if defined(__APPLE__) && SDL_VERSION_ATLEAST(1, 2, 14)
3138 int bgcolor = SDL_MapRGB(
screen->format, 0x00, 0x00, 0x00);
3141 next = (next + 1) % SHOW_MODE_NB;
3142 }
while (next != is->
show_mode && (next == SHOW_MODE_VIDEO && !is->
video_st || next != SHOW_MODE_VIDEO && !is->
audio_st));
3153 double remaining_time = 0.0;
3155 while (!SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_ALLEVENTS)) {
3160 if (remaining_time > 0.0)
3161 av_usleep((int64_t)(remaining_time * 1000000.0));
3173 double incr, pos, frac;
3178 switch (event.type) {
3184 switch (event.key.keysym.sym) {
3262 case SDL_VIDEOEXPOSE:
3265 case SDL_MOUSEBUTTONDOWN:
3270 case SDL_MOUSEMOTION:
3276 if (event.type == SDL_MOUSEBUTTONDOWN) {
3279 if (event.motion.state != SDL_PRESSED)
3289 int tns, thh, tmm, tss;
3292 tmm = (tns % 3600) / 60;
3294 frac = x / cur_stream->
width;
3297 mm = (ns % 3600) / 60;
3300 "Seek to %2.0f%% (%2d:%02d:%02d) of total duration (%2d:%02d:%02d) \n", frac*100,
3301 hh, mm, ss, thh, tmm, tss);
3308 case SDL_VIDEORESIZE:
3309 screen = SDL_SetVideoMode(
FFMIN(16383, event.resize.w), event.resize.h, 0,
3310 SDL_HWSURFACE|SDL_RESIZABLE|SDL_ASYNCBLIT|SDL_HWACCEL);
3353 if (!file_iformat) {
3368 if (!strcmp(arg,
"audio"))
3370 else if (!strcmp(arg,
"video"))
3372 else if (!strcmp(arg,
"ext"))
3395 show_mode = !strcmp(arg,
"video") ? SHOW_MODE_VIDEO :
3396 !strcmp(arg,
"waves") ? SHOW_MODE_WAVES :
3397 !strcmp(arg,
"rdft" ) ? SHOW_MODE_RDFT :
3406 "Argument '%s' provided as input filename, but '%s' was already specified.\n",
3410 if (!strcmp(filename,
"-"))
3417 const char *spec = strchr(opt,
':');
3420 "No media specifier was specified in '%s' in option '%s'\n",
3431 "Invalid media specifier '%s' in option '%s'\n", spec, opt);
3441 {
"x",
HAS_ARG, { .func_arg =
opt_width },
"force displayed width",
"width" },
3442 {
"y",
HAS_ARG, { .func_arg =
opt_height },
"force displayed height",
"height" },
3451 {
"ss",
HAS_ARG, { .func_arg =
opt_seek },
"seek to a given position in seconds",
"pos" },
3452 {
"t",
HAS_ARG, { .func_arg =
opt_duration },
"play \"duration\" seconds of audio/video",
"duration" },
3464 {
"sync",
HAS_ARG |
OPT_EXPERT, { .func_arg =
opt_sync },
"set audio-video sync. type (type=audio/video/ext)",
"type" },
3473 {
"vf",
OPT_STRING |
HAS_ARG, { &vfilters },
"set video filters",
"filter_graph" },
3474 {
"af",
OPT_STRING |
HAS_ARG, { &afilters },
"set audio filters",
"filter_graph" },
3477 {
"showmode",
HAS_ARG, { .func_arg =
opt_show_mode},
"select show mode (0 = video, 1 = waves, 2 = RDFT)",
"mode" },
3479 {
"i",
OPT_BOOL, { &dummy},
"read specified file",
"input_file"},
3480 {
"codec",
HAS_ARG, { .func_arg =
opt_codec},
"force decoder",
"decoder_name" },
3503 #if !CONFIG_AVFILTER
3508 printf(
"\nWhile playing:\n"
3510 "f toggle full screen\n"
3512 "a cycle audio channel in the current program\n"
3513 "v cycle video channel\n"
3514 "t cycle subtitle channel in the current program\n"
3516 "w show audio waves\n"
3517 "s activate frame-step mode\n"
3518 "left/right seek backward/forward 10 seconds\n"
3519 "down/up seek backward/forward 1 minute\n"
3520 "page down/page up seek backward/forward 10 minutes\n"
3521 "mouse click seek to percentage in file corresponding to fraction of width\n"
3529 *mtx = SDL_CreateMutex();
3534 return !!SDL_LockMutex(*mtx);
3536 return !!SDL_UnlockMutex(*mtx);
3538 SDL_DestroyMutex(*mtx);
3549 char dummy_videodriver[] =
"SDL_VIDEODRIVER=dummy";
3578 "Use -h to get full help or, even better, run 'man %s'\n",
program_name);
3585 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER;
3587 flags &= ~SDL_INIT_AUDIO;
3589 SDL_putenv(dummy_videodriver);
3590 #if !defined(__MINGW32__) && !defined(__APPLE__)
3591 flags |= SDL_INIT_EVENTTHREAD;
3593 if (SDL_Init (flags)) {
3600 const SDL_VideoInfo *
vi = SDL_GetVideoInfo();
3605 SDL_EventState(SDL_ACTIVEEVENT, SDL_IGNORE);
3606 SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE);
3607 SDL_EventState(SDL_USEREVENT, SDL_IGNORE);