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);