58 #include <SDL_thread.h>
67 #define MAX_QUEUE_SIZE (15 * 1024 * 1024)
72 #define SDL_AUDIO_BUFFER_SIZE 1024
75 #define AV_SYNC_THRESHOLD_MIN 0.01
77 #define AV_SYNC_THRESHOLD_MAX 0.1
79 #define AV_SYNC_FRAMEDUP_THRESHOLD 0.1
81 #define AV_NOSYNC_THRESHOLD 10.0
84 #define SAMPLE_CORRECTION_PERCENT_MAX 10
87 #define EXTERNAL_CLOCK_SPEED_MIN 0.900
88 #define EXTERNAL_CLOCK_SPEED_MAX 1.010
89 #define EXTERNAL_CLOCK_SPEED_STEP 0.001
92 #define AUDIO_DIFF_AVG_NB 20
95 #define REFRESH_RATE 0.01
99 #define SAMPLE_ARRAY_SIZE (8 * 65536)
101 #define CURSOR_HIDE_DELAY 1000000
121 #define VIDEO_PICTURE_QUEUE_SIZE 3
122 #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;
374 if (pkt == &flush_pkt)
386 SDL_CondSignal(q->
cond);
398 SDL_LockMutex(q->
mutex);
400 SDL_UnlockMutex(q->
mutex);
402 if (pkt != &flush_pkt && ret < 0)
422 q->
mutex = SDL_CreateMutex();
423 q->
cond = SDL_CreateCond();
431 SDL_LockMutex(q->
mutex);
432 for (pkt = q->
first_pkt; pkt != NULL; pkt = pkt1) {
441 SDL_UnlockMutex(q->
mutex);
447 SDL_DestroyMutex(q->
mutex);
448 SDL_DestroyCond(q->
cond);
453 SDL_LockMutex(q->
mutex);
457 SDL_CondSignal(q->
cond);
459 SDL_UnlockMutex(q->
mutex);
464 SDL_LockMutex(q->
mutex);
467 SDL_UnlockMutex(q->
mutex);
476 SDL_LockMutex(q->
mutex);
504 SDL_UnlockMutex(q->
mutex);
516 SDL_FillRect(screen, &rect, color);
517 if (update && w > 0 && h > 0)
518 SDL_UpdateRect(screen, x, y, w, h);
530 w2 = width - (x + w);
536 h2 = height - (y + h);
544 xleft + width - w2, ytop,
552 xleft + w1, ytop + height - h2,
557 #define ALPHA_BLEND(a, oldp, newp, s)\
558 ((((oldp << s) * (255 - (a))) + (newp * (a))) / (255 << s))
560 #define RGBA_IN(r, g, b, a, s)\
562 unsigned int v = ((const uint32_t *)(s))[0];\
563 a = (v >> 24) & 0xff;\
564 r = (v >> 16) & 0xff;\
565 g = (v >> 8) & 0xff;\
569 #define YUVA_IN(y, u, v, a, s, pal)\
571 unsigned int val = ((const uint32_t *)(pal))[*(const uint8_t*)(s)];\
572 a = (val >> 24) & 0xff;\
573 y = (val >> 16) & 0xff;\
574 u = (val >> 8) & 0xff;\
578 #define YUVA_OUT(d, y, u, v, a)\
580 ((uint32_t *)(d))[0] = (a << 24) | (y << 16) | (u << 8) | v;\
588 int wrap, wrap3, width2, skip2;
589 int y,
u,
v,
a, u1, v1,
a1, w, h;
593 int dstx, dsty, dstw, dsth;
595 dstw = av_clip(rect->
w, 0, imgw);
596 dsth = av_clip(rect->
h, 0, imgh);
597 dstx = av_clip(rect->
x, 0, imgw - dstw);
598 dsty = av_clip(rect->
y, 0, imgh - dsth);
603 width2 = ((dstw + 1) >> 1) + (dstx & ~dstw & 1);
608 pal = (
const uint32_t *)rect->
pict.
data[1];
625 for (w = dstw - (dstx & 1); w >= 2; w -= 2) {
652 p += wrap3 - dstw *
BPP;
653 lum += wrap - dstw - dstx;
654 cb += dst->
linesize[1] - width2 - skip2;
655 cr += dst->
linesize[2] - width2 - skip2;
657 for (h = dsth - (dsty & 1); h >= 2; h -= 2) {
682 for (w = dstw - (dstx & 1); w >= 2; w -= 2) {
714 p += -wrap3 + 2 *
BPP;
737 p += wrap3 + (wrap3 - dstw *
BPP);
738 lum += wrap + (wrap - dstw - dstx);
739 cb += dst->
linesize[1] - width2 - skip2;
740 cr += dst->
linesize[2] - width2 - skip2;
758 for (w = dstw - (dstx & 1); w >= 2; w -= 2) {
789 SDL_FreeYUVOverlay(vp->
bmp);
809 if (aspect_ratio <= 0.0)
811 aspect_ratio *= (float)vp->
width / (
float)vp->
height;
815 width = ((int)
rint(height * aspect_ratio)) & ~1;
816 if (width > scr_width) {
818 height = ((int)
rint(width / aspect_ratio)) & ~1;
820 x = (scr_width -
width) / 2;
821 y = (scr_height -
height) / 2;
822 rect->x = scr_xleft + x;
823 rect->y = scr_ytop +
y;
824 rect->w =
FFMAX(width, 1);
825 rect->h =
FFMAX(height, 1);
843 SDL_LockYUVOverlay (vp->
bmp);
845 pict.
data[0] = vp->
bmp->pixels[0];
846 pict.
data[1] = vp->
bmp->pixels[2];
847 pict.
data[2] = vp->
bmp->pixels[1];
857 SDL_UnlockYUVOverlay (vp->
bmp);
864 SDL_DisplayYUVOverlay(vp->
bmp, &rect);
867 int bgcolor = SDL_MapRGB(
screen->format, 0x00, 0x00, 0x00);
876 return a < 0 ? a%b + b : a%
b;
881 int i, i_start, x, y1,
y, ys, delay,
n, nb_display_channels;
882 int ch, channels, h, h2, bgcolor, fgcolor;
884 int rdft_bits, nb_freq;
886 for (rdft_bits = 1; (1 << rdft_bits) < 2 * s->
height; rdft_bits++)
888 nb_freq = 1 << (rdft_bits - 1);
892 nb_display_channels = channels;
894 int data_used= s->
show_mode == SHOW_MODE_WAVES ? s->
width : (2*nb_freq);
906 delay += 2 * data_used;
907 if (delay < data_used)
913 for (i = 0; i < 1000; i += channels) {
920 if (h < score && (b ^ c) < 0) {
932 bgcolor = SDL_MapRGB(
screen->format, 0x00, 0x00, 0x00);
938 fgcolor = SDL_MapRGB(
screen->format, 0xff, 0xff, 0xff);
941 h = s->
height / nb_display_channels;
944 for (ch = 0; ch < nb_display_channels; ch++) {
946 y1 = s->
ytop + ch * h + (h / 2);
947 for (x = 0; x < s->
width; x++) {
956 s->
xleft + x, ys, 1, y,
964 fgcolor = SDL_MapRGB(
screen->format, 0x00, 0x00, 0xff);
966 for (ch = 1; ch < nb_display_channels; ch++) {
967 y = s->
ytop + ch * h;
974 nb_display_channels=
FFMIN(nb_display_channels, 2);
984 for (ch = 0; ch < nb_display_channels; ch++) {
985 data[ch] = s->
rdft_data + 2 * nb_freq * ch;
987 for (x = 0; x < 2 * nb_freq; x++) {
988 double w = (x-nb_freq) * (1.0 / nb_freq);
998 for (y = 0; y < s->
height; y++) {
999 double w = 1 / sqrt(nb_freq);
1000 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]));
1001 int b = (nb_display_channels == 2 ) ? sqrt(w * sqrt(data[1][2 * y + 0] * data[1][2 * y + 0]
1002 + data[1][2 * y + 1] * data[1][2 * y + 1])) : a;
1005 fgcolor = SDL_MapRGB(
screen->format, a, b, (a + b) / 2);
1025 SDL_WaitThread(is->
read_tid, NULL);
1040 #if !CONFIG_AVFILTER
1079 int flags = SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_HWACCEL;
1083 else flags |= SDL_RESIZABLE;
1085 if (vp && vp->
width)
1098 w =
FFMIN(16383, w);
1102 screen = SDL_SetVideoMode(w, h, 0, flags);
1269 double sync_threshold, diff;
1282 if (diff <= -sync_threshold)
1283 delay =
FFMAX(0, delay + diff);
1285 delay = delay + diff;
1286 else if (diff >= sync_threshold)
1291 av_dlog(NULL,
"video: delay=%0.3f A-V=%f\n",
1374 double last_duration,
duration, delay;
1402 if (time < is->frame_timer + delay && !redisplay) {
1470 static int64_t last_time;
1472 int aqsize, vqsize, sqsize;
1476 if (!last_time || (cur_time - last_time) >= 30000) {
1494 "%7.2f %s:%7.3f fd=%4d aq=%5dKB vq=%5dKB sq=%5dB f=%"PRId64
"/%"PRId64
" \r",
1526 bufferdiff = vp->
bmp ?
FFMAX(vp->
bmp->pixels[0], vp->
bmp->pixels[1]) -
FFMIN(vp->
bmp->pixels[0], vp->
bmp->pixels[1]) : 0;
1527 if (!vp->
bmp || vp->
bmp->pitches[0] < vp->
width || bufferdiff < (int64_t)vp->
height * vp->
bmp->pitches[0]) {
1531 "Error: the video system does not support an image\n"
1532 "size of %dx%d pixels. Try using -lowres or -vf \"scale=w:h\"\n"
1533 "to reduce the image size.\n", vp->
width, vp->
height );
1546 for (i = 0; i < 3; i++) {
1553 if (bmp->pitches[i] > width) {
1554 maxp = bmp->pixels[i] + bmp->pitches[i] * height - 1;
1555 for (p = bmp->pixels[i] + width - 1; p < maxp; p += bmp->pitches[i])
1565 #if defined(DEBUG_SYNC) && 0
1566 printf(
"frame_type=%c pts=%0.3f\n",
1601 event.user.data1 = is;
1602 SDL_PushEvent(&event);
1626 SDL_LockYUVOverlay (vp->
bmp);
1628 pict.
data[0] = vp->
bmp->pixels[0];
1629 pict.
data[1] = vp->
bmp->pixels[2];
1630 pict.
data[2] = vp->
bmp->pixels[1];
1655 SDL_UnlockYUVOverlay(vp->
bmp);
1687 if (!got_picture && !pkt->
data)
1737 if (!outputs || !inputs) {
1745 outputs->
next = NULL;
1748 inputs->filter_ctx = sink_ctx;
1749 inputs->pad_idx = 0;
1750 inputs->next = NULL;
1760 for (i = 0; i < graph->
nb_filters - nb_filters; i++)
1773 char sws_flags_str[128];
1774 char buffersrc_args[256];
1784 snprintf(buffersrc_args,
sizeof(buffersrc_args),
1785 "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
1790 av_strlcatf(buffersrc_args,
sizeof(buffersrc_args),
":frame_rate=%d/%d", fr.
num, fr.
den);
1794 "ffplay_buffer", buffersrc_args, NULL,
1800 "ffplay_buffersink", NULL, NULL, graph);
1811 "ffplay_crop",
"floor(in_w/2)*2:floor(in_h/2)*2", NULL, graph)) < 0)
1819 is->in_video_filter = filt_src;
1820 is->out_video_filter = filt_out;
1826 static int configure_audio_filters(
VideoState *is,
const char *afilters,
int force_output_format)
1830 int64_t channel_layouts[2] = { 0, -1 };
1831 int channels[2] = { 0, -1 };
1833 char aresample_swr_opts[512] =
"";
1835 char asrc_args[256];
1844 if (strlen(aresample_swr_opts))
1845 aresample_swr_opts[strlen(aresample_swr_opts)-1] =
'\0';
1846 av_opt_set(is->agraph,
"aresample_swr_opts", aresample_swr_opts, 0);
1848 ret =
snprintf(asrc_args,
sizeof(asrc_args),
1849 "sample_rate=%d:sample_fmt=%s:channels=%d:time_base=%d/%d",
1851 is->audio_filter_src.channels,
1852 1, is->audio_filter_src.freq);
1853 if (is->audio_filter_src.channel_layout)
1854 snprintf(asrc_args + ret,
sizeof(asrc_args) - ret,
1855 ":channel_layout=0x%"PRIx64, is->audio_filter_src.channel_layout);
1859 asrc_args, NULL, is->agraph);
1866 NULL, NULL, is->agraph);
1875 if (force_output_format) {
1893 is->in_audio_filter = filt_asrc;
1894 is->out_audio_filter = filt_asink;
1921 int last_serial = -1;
1937 if ( last_w != frame->
width
1938 || last_h != frame->
height
1939 || last_format != frame->
format
1940 || last_serial != serial) {
1942 "Video frame changed from size:%dx%d format:%s serial:%d to size:%dx%d format:%s serial:%d\n",
1949 if ((ret = configure_video_filters(graph, is, vfilters, frame)) < 0) {
1952 event.user.data1 = is;
1953 SDL_PushEvent(&event);
1956 filt_in = is->in_video_filter;
1957 filt_out = is->out_video_filter;
1958 last_w = frame->
width;
1960 last_format = frame->
format;
1961 last_serial = serial;
2046 &got_subtitle, pkt);
2047 if (got_subtitle && sp->
sub.
format == 0) {
2071 }
else if (got_subtitle) {
2084 size = samples_size /
sizeof(short);
2102 int wanted_nb_samples = nb_samples;
2106 double diff, avg_diff;
2107 int min_nb_samples, max_nb_samples;
2121 wanted_nb_samples = nb_samples + (int)(diff * is->
audio_src.
freq);
2124 wanted_nb_samples =
FFMIN(
FFMAX(wanted_nb_samples, min_nb_samples), max_nb_samples);
2126 av_dlog(NULL,
"diff=%f adiff=%f sample_diff=%d apts=%0.3f %f\n",
2127 diff, avg_diff, wanted_nb_samples - nb_samples,
2138 return wanted_nb_samples;
2153 int len1,
data_size, resampled_data_size;
2154 int64_t dec_channel_layout;
2157 int wanted_nb_samples;
2188 pkt_temp->
data += len1;
2189 pkt_temp->
size -= len1;
2190 if (pkt_temp->
data && pkt_temp->
size <= 0 || !pkt_temp->
data && !got_frame)
2192 if (!pkt_temp->
data && !got_frame)
2217 cmp_audio_fmts(is->audio_filter_src.fmt, is->audio_filter_src.channels,
2219 is->audio_filter_src.channel_layout != dec_channel_layout ||
2224 char buf1[1024], buf2[1024];
2228 "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",
2234 is->audio_filter_src.channel_layout = dec_channel_layout;
2238 if ((ret = configure_audio_filters(is, afilters, 1)) < 0)
2257 tb = is->out_audio_filter->inputs[0]->time_base;
2264 dec_channel_layout =
2280 "Cannot create sample rate converter for conversion of %d Hz %s %d channels to %d Hz %s %d channels!\n",
2316 if (len2 == out_count) {
2336 static double last_clock;
2337 printf(
"audio: delay=%0.3f clock=%0.3f clock0=%0.3f\n",
2343 return resampled_data_size;
2349 memset(pkt_temp, 0,
sizeof(*pkt_temp));
2350 pkt_temp->stream_index = -1;
2386 if (audio_size < 0) {
2413 static int audio_open(
void *opaque, int64_t wanted_channel_layout,
int wanted_nb_channels,
int wanted_sample_rate,
struct AudioParams *audio_hw_params)
2415 SDL_AudioSpec wanted_spec, spec;
2417 static const int next_nb_channels[] = {0, 0, 1, 6, 2, 6, 4, 6};
2419 env = SDL_getenv(
"SDL_AUDIO_CHANNELS");
2421 wanted_nb_channels = atoi(env);
2429 wanted_spec.freq = wanted_sample_rate;
2430 if (wanted_spec.freq <= 0 || wanted_spec.channels <= 0) {
2434 wanted_spec.format = AUDIO_S16SYS;
2435 wanted_spec.silence = 0;
2438 wanted_spec.userdata = opaque;
2439 while (SDL_OpenAudio(&wanted_spec, &spec) < 0) {
2440 av_log(NULL,
AV_LOG_WARNING,
"SDL_OpenAudio (%d channels): %s\n", wanted_spec.channels, SDL_GetError());
2441 wanted_spec.channels = next_nb_channels[
FFMIN(7, wanted_spec.channels)];
2442 if (!wanted_spec.channels) {
2444 "No more channel combinations to try, audio open failed\n");
2449 if (spec.format != AUDIO_S16SYS) {
2451 "SDL advised audio format %d is not supported!\n", spec.format);
2454 if (spec.channels != wanted_spec.channels) {
2456 if (!wanted_channel_layout) {
2458 "SDL advised channel count %d is not supported!\n", spec.channels);
2464 audio_hw_params->
freq = spec.freq;
2466 audio_hw_params->
channels = spec.channels;
2482 const char *forced_codec_name = NULL;
2486 int64_t channel_layout;
2488 int stream_lowres =
lowres;
2490 if (stream_index < 0 || stream_index >= ic->
nb_streams)
2501 if (forced_codec_name)
2505 "No codec could be found with name '%s'\n", forced_codec_name);
2507 "No codec could be found with id %d\n", avctx->
codec_id);
2548 is->audio_filter_src.channels = avctx->
channels;
2550 is->audio_filter_src.fmt = avctx->
sample_fmt;
2551 if ((ret = configure_audio_filters(is, afilters, 0)) < 0)
2553 link = is->out_audio_filter->inputs[0];
2615 if (stream_index < 0 || stream_index >= ic->
nb_streams)
2707 if(s->
pb && ( !strncmp(s->
filename,
"rtp:", 4)
2708 || !strncmp(s->
filename,
"udp:", 4)
2724 int64_t stream_start_time;
2725 int pkt_in_play_range = 0;
2728 int orig_nb_streams;
2729 SDL_mutex *wait_mutex = SDL_CreateMutex();
2731 memset(st_index, -1,
sizeof(st_index));
2761 "%s: could not find codec parameters\n", is->
filename);
2765 for (i = 0; i < orig_nb_streams; i++)
2807 st_index[AVMEDIA_TYPE_VIDEO],
2813 (st_index[AVMEDIA_TYPE_AUDIO] >= 0 ?
2814 st_index[AVMEDIA_TYPE_AUDIO] :
2815 st_index[AVMEDIA_TYPE_VIDEO]),
2822 if (st_index[AVMEDIA_TYPE_VIDEO] >= 0) {
2831 if (st_index[AVMEDIA_TYPE_AUDIO] >= 0) {
2836 if (st_index[AVMEDIA_TYPE_VIDEO] >= 0) {
2840 is->
show_mode = ret >= 0 ? SHOW_MODE_VIDEO : SHOW_MODE_RDFT;
2842 if (st_index[AVMEDIA_TYPE_SUBTITLE] >= 0) {
2853 if (infinite_buffer < 0 && is->realtime)
2866 #if CONFIG_RTSP_DEMUXER || CONFIG_MMSH_PROTOCOL
2877 int64_t seek_target = is->
seek_pos;
2878 int64_t seek_min = is->
seek_rel > 0 ? seek_target - is->
seek_rel + 2: INT64_MIN;
2879 int64_t seek_max = is->
seek_rel < 0 ? seek_target - is->
seek_rel - 2: INT64_MAX;
2886 "%s: error while seeking\n", is->
ic->
filename);
2931 SDL_LockMutex(wait_mutex);
2933 SDL_UnlockMutex(wait_mutex);
2963 SDL_LockMutex(wait_mutex);
2965 SDL_UnlockMutex(wait_mutex);
3008 event.user.data1 = is;
3009 SDL_PushEvent(&event);
3011 SDL_DestroyMutex(wait_mutex);
3057 int start_index, stream_index;
3073 stream_index = start_index;
3079 for (start_index = 0; start_index < nb_streams; start_index++)
3082 if (start_index == nb_streams)
3084 stream_index = start_index;
3089 if (++stream_index >= nb_streams)
3097 if (start_index == -1)
3101 if (stream_index == start_index)
3106 switch (codec_type) {
3121 if (p && stream_index != -1)
3130 #if defined(__APPLE__) && SDL_VERSION_ATLEAST(1, 2, 14)
3142 int bgcolor = SDL_MapRGB(
screen->format, 0x00, 0x00, 0x00);
3145 next = (next + 1) % SHOW_MODE_NB;
3146 }
while (next != is->
show_mode && (next == SHOW_MODE_VIDEO && !is->
video_st || next != SHOW_MODE_VIDEO && !is->
audio_st));
3157 double remaining_time = 0.0;
3159 while (!SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_ALLEVENTS)) {
3164 if (remaining_time > 0.0)
3165 av_usleep((int64_t)(remaining_time * 1000000.0));
3204 double incr, pos, frac;
3209 switch (event.type) {
3215 switch (event.key.keysym.sym) {
3301 case SDL_VIDEOEXPOSE:
3304 case SDL_MOUSEBUTTONDOWN:
3309 case SDL_MOUSEMOTION:
3315 if (event.type == SDL_MOUSEBUTTONDOWN) {
3318 if (event.motion.state != SDL_PRESSED)
3328 int tns, thh, tmm, tss;
3331 tmm = (tns % 3600) / 60;
3333 frac = x / cur_stream->
width;
3336 mm = (ns % 3600) / 60;
3339 "Seek to %2.0f%% (%2d:%02d:%02d) of total duration (%2d:%02d:%02d) \n", frac*100,
3340 hh, mm, ss, thh, tmm, tss);
3347 case SDL_VIDEORESIZE:
3348 screen = SDL_SetVideoMode(
FFMIN(16383, event.resize.w), event.resize.h, 0,
3349 SDL_HWSURFACE|SDL_RESIZABLE|SDL_ASYNCBLIT|SDL_HWACCEL);
3392 if (!file_iformat) {
3407 if (!strcmp(arg,
"audio"))
3409 else if (!strcmp(arg,
"video"))
3411 else if (!strcmp(arg,
"ext"))
3434 show_mode = !strcmp(arg,
"video") ? SHOW_MODE_VIDEO :
3435 !strcmp(arg,
"waves") ? SHOW_MODE_WAVES :
3436 !strcmp(arg,
"rdft" ) ? SHOW_MODE_RDFT :
3445 "Argument '%s' provided as input filename, but '%s' was already specified.\n",
3449 if (!strcmp(filename,
"-"))
3456 const char *spec = strchr(opt,
':');
3459 "No media specifier was specified in '%s' in option '%s'\n",
3470 "Invalid media specifier '%s' in option '%s'\n", spec, opt);
3480 {
"x",
HAS_ARG, { .func_arg =
opt_width },
"force displayed width",
"width" },
3481 {
"y",
HAS_ARG, { .func_arg =
opt_height },
"force displayed height",
"height" },
3490 {
"ss",
HAS_ARG, { .func_arg =
opt_seek },
"seek to a given position in seconds",
"pos" },
3491 {
"t",
HAS_ARG, { .func_arg =
opt_duration },
"play \"duration\" seconds of audio/video",
"duration" },
3503 {
"sync",
HAS_ARG |
OPT_EXPERT, { .func_arg =
opt_sync },
"set audio-video sync. type (type=audio/video/ext)",
"type" },
3512 {
"vf",
OPT_STRING |
HAS_ARG, { &vfilters },
"set video filters",
"filter_graph" },
3513 {
"af",
OPT_STRING |
HAS_ARG, { &afilters },
"set audio filters",
"filter_graph" },
3516 {
"showmode",
HAS_ARG, { .func_arg =
opt_show_mode},
"select show mode (0 = video, 1 = waves, 2 = RDFT)",
"mode" },
3518 {
"i",
OPT_BOOL, { &dummy},
"read specified file",
"input_file"},
3519 {
"codec",
HAS_ARG, { .func_arg =
opt_codec},
"force decoder",
"decoder_name" },
3542 #if !CONFIG_AVFILTER
3547 printf(
"\nWhile playing:\n"
3549 "f toggle full screen\n"
3551 "a cycle audio channel in the current program\n"
3552 "v cycle video channel\n"
3553 "t cycle subtitle channel in the current program\n"
3555 "w show audio waves\n"
3556 "s activate frame-step mode\n"
3557 "left/right seek backward/forward 10 seconds\n"
3558 "down/up seek backward/forward 1 minute\n"
3559 "page down/page up seek backward/forward 10 minutes\n"
3560 "mouse click seek to percentage in file corresponding to fraction of width\n"
3568 *mtx = SDL_CreateMutex();
3573 return !!SDL_LockMutex(*mtx);
3575 return !!SDL_UnlockMutex(*mtx);
3577 SDL_DestroyMutex(*mtx);
3588 char dummy_videodriver[] =
"SDL_VIDEODRIVER=dummy";
3616 "Use -h to get full help or, even better, run 'man %s'\n",
program_name);
3623 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER;
3625 flags &= ~SDL_INIT_AUDIO;
3627 SDL_putenv(dummy_videodriver);
3628 #if !defined(__MINGW32__) && !defined(__APPLE__)
3629 flags |= SDL_INIT_EVENTTHREAD;
3631 if (SDL_Init (flags)) {
3638 const SDL_VideoInfo *
vi = SDL_GetVideoInfo();
3643 SDL_EventState(SDL_ACTIVEEVENT, SDL_IGNORE);
3644 SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE);
3645 SDL_EventState(SDL_USEREVENT, SDL_IGNORE);