ffplay: fix build with disabled avfilter
[ffmpeg.git] / ffplay.c
1 /*
2  * Copyright (c) 2003 Fabrice Bellard
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20
21 /**
22  * @file
23  * simple media player based on the FFmpeg libraries
24  */
25
26 #include "config.h"
27 #include <inttypes.h>
28 #include <math.h>
29 #include <limits.h>
30 #include <signal.h>
31 #include "libavutil/avstring.h"
32 #include "libavutil/colorspace.h"
33 #include "libavutil/mathematics.h"
34 #include "libavutil/pixdesc.h"
35 #include "libavutil/imgutils.h"
36 #include "libavutil/dict.h"
37 #include "libavutil/parseutils.h"
38 #include "libavutil/samplefmt.h"
39 #include "libavutil/avassert.h"
40 #include "libavutil/time.h"
41 #include "libavformat/avformat.h"
42 #include "libavdevice/avdevice.h"
43 #include "libswscale/swscale.h"
44 #include "libavutil/opt.h"
45 #include "libavcodec/avfft.h"
46 #include "libswresample/swresample.h"
47
48 #if CONFIG_AVFILTER
49 # include "libavfilter/avcodec.h"
50 # include "libavfilter/avfilter.h"
51 # include "libavfilter/buffersink.h"
52 # include "libavfilter/buffersrc.h"
53 #endif
54
55 #include <SDL.h>
56 #include <SDL_thread.h>
57
58 #include "cmdutils.h"
59
60 #include <assert.h>
61
62 const char program_name[] = "ffplay";
63 const int program_birth_year = 2003;
64
65 #define MAX_QUEUE_SIZE (15 * 1024 * 1024)
66 #define MIN_FRAMES 5
67
68 /* SDL audio buffer size, in samples. Should be small to have precise
69    A/V sync as SDL does not have hardware buffer fullness info. */
70 #define SDL_AUDIO_BUFFER_SIZE 1024
71
72 /* no AV sync correction is done if below the minimum AV sync threshold */
73 #define AV_SYNC_THRESHOLD_MIN 0.01
74 /* AV sync correction is done if above the maximum AV sync threshold */
75 #define AV_SYNC_THRESHOLD_MAX 0.1
76 /* If a frame duration is longer than this, it will not be duplicated to compensate AV sync */
77 #define AV_SYNC_FRAMEDUP_THRESHOLD 0.1
78 /* no AV correction is done if too big error */
79 #define AV_NOSYNC_THRESHOLD 10.0
80
81 /* maximum audio speed change to get correct sync */
82 #define SAMPLE_CORRECTION_PERCENT_MAX 10
83
84 /* external clock speed adjustment constants for realtime sources based on buffer fullness */
85 #define EXTERNAL_CLOCK_SPEED_MIN  0.900
86 #define EXTERNAL_CLOCK_SPEED_MAX  1.010
87 #define EXTERNAL_CLOCK_SPEED_STEP 0.001
88
89 /* we use about AUDIO_DIFF_AVG_NB A-V differences to make the average */
90 #define AUDIO_DIFF_AVG_NB   20
91
92 /* polls for possible required screen refresh at least this often, should be less than 1/fps */
93 #define REFRESH_RATE 0.01
94
95 /* NOTE: the size must be big enough to compensate the hardware audio buffersize size */
96 /* TODO: We assume that a decoded and resampled frame fits into this buffer */
97 #define SAMPLE_ARRAY_SIZE (8 * 65536)
98
99 #define CURSOR_HIDE_DELAY 1000000
100
101 static int64_t sws_flags = SWS_BICUBIC;
102
103 typedef struct MyAVPacketList {
104     AVPacket pkt;
105     struct MyAVPacketList *next;
106     int serial;
107 } MyAVPacketList;
108
109 typedef struct PacketQueue {
110     MyAVPacketList *first_pkt, *last_pkt;
111     int nb_packets;
112     int size;
113     int abort_request;
114     int serial;
115     SDL_mutex *mutex;
116     SDL_cond *cond;
117 } PacketQueue;
118
119 #define VIDEO_PICTURE_QUEUE_SIZE 3
120 #define SUBPICTURE_QUEUE_SIZE 4
121
122 typedef struct VideoPicture {
123     double pts;             // presentation timestamp for this picture
124     int64_t pos;            // byte position in file
125     SDL_Overlay *bmp;
126     int width, height; /* source height & width */
127     int allocated;
128     int reallocate;
129     int serial;
130
131     AVRational sar;
132 } VideoPicture;
133
134 typedef struct SubPicture {
135     double pts; /* presentation time stamp for this picture */
136     AVSubtitle sub;
137     int serial;
138 } SubPicture;
139
140 typedef struct AudioParams {
141     int freq;
142     int channels;
143     int64_t channel_layout;
144     enum AVSampleFormat fmt;
145 } AudioParams;
146
147 typedef struct Clock {
148     double pts;           /* clock base */
149     double pts_drift;     /* clock base minus time at which we updated the clock */
150     double last_updated;
151     double speed;
152     int serial;           /* clock is based on a packet with this serial */
153     int paused;
154     int *queue_serial;    /* pointer to the current packet queue serial, used for obsolete clock detection */
155 } Clock;
156
157 enum {
158     AV_SYNC_AUDIO_MASTER, /* default choice */
159     AV_SYNC_VIDEO_MASTER,
160     AV_SYNC_EXTERNAL_CLOCK, /* synchronize to an external clock */
161 };
162
163 typedef struct VideoState {
164     SDL_Thread *read_tid;
165     SDL_Thread *video_tid;
166     AVInputFormat *iformat;
167     int no_background;
168     int abort_request;
169     int force_refresh;
170     int paused;
171     int last_paused;
172     int queue_attachments_req;
173     int seek_req;
174     int seek_flags;
175     int64_t seek_pos;
176     int64_t seek_rel;
177     int read_pause_return;
178     AVFormatContext *ic;
179     int realtime;
180
181     Clock audclk;
182     Clock vidclk;
183     Clock extclk;
184
185     int audio_stream;
186
187     int av_sync_type;
188
189     double audio_clock;
190     int audio_clock_serial;
191     double audio_diff_cum; /* used for AV difference average computation */
192     double audio_diff_avg_coef;
193     double audio_diff_threshold;
194     int audio_diff_avg_count;
195     AVStream *audio_st;
196     PacketQueue audioq;
197     int audio_hw_buf_size;
198     uint8_t silence_buf[SDL_AUDIO_BUFFER_SIZE];
199     uint8_t *audio_buf;
200     uint8_t *audio_buf1;
201     unsigned int audio_buf_size; /* in bytes */
202     unsigned int audio_buf1_size;
203     int audio_buf_index; /* in bytes */
204     int audio_write_buf_size;
205     int audio_buf_frames_pending;
206     AVPacket audio_pkt_temp;
207     AVPacket audio_pkt;
208     int audio_pkt_temp_serial;
209     int audio_last_serial;
210     struct AudioParams audio_src;
211 #if CONFIG_AVFILTER
212     struct AudioParams audio_filter_src;
213 #endif
214     struct AudioParams audio_tgt;
215     struct SwrContext *swr_ctx;
216     int frame_drops_early;
217     int frame_drops_late;
218     AVFrame *frame;
219     int64_t audio_frame_next_pts;
220
221     enum ShowMode {
222         SHOW_MODE_NONE = -1, SHOW_MODE_VIDEO = 0, SHOW_MODE_WAVES, SHOW_MODE_RDFT, SHOW_MODE_NB
223     } show_mode;
224     int16_t sample_array[SAMPLE_ARRAY_SIZE];
225     int sample_array_index;
226     int last_i_start;
227     RDFTContext *rdft;
228     int rdft_bits;
229     FFTSample *rdft_data;
230     int xpos;
231     double last_vis_time;
232
233     SDL_Thread *subtitle_tid;
234     int subtitle_stream;
235     AVStream *subtitle_st;
236     PacketQueue subtitleq;
237     SubPicture subpq[SUBPICTURE_QUEUE_SIZE];
238     int subpq_size, subpq_rindex, subpq_windex;
239     SDL_mutex *subpq_mutex;
240     SDL_cond *subpq_cond;
241
242     double frame_timer;
243     double frame_last_pts;
244     double frame_last_duration;
245     double frame_last_dropped_pts;
246     double frame_last_returned_time;
247     double frame_last_filter_delay;
248     int64_t frame_last_dropped_pos;
249     int frame_last_dropped_serial;
250     int video_stream;
251     AVStream *video_st;
252     PacketQueue videoq;
253     int64_t video_current_pos;      // current displayed file pos
254     double max_frame_duration;      // maximum duration of a frame - above this, we consider the jump a timestamp discontinuity
255     VideoPicture pictq[VIDEO_PICTURE_QUEUE_SIZE];
256     int pictq_size, pictq_rindex, pictq_windex;
257     SDL_mutex *pictq_mutex;
258     SDL_cond *pictq_cond;
259 #if !CONFIG_AVFILTER
260     struct SwsContext *img_convert_ctx;
261 #endif
262     SDL_Rect last_display_rect;
263
264     char filename[1024];
265     int width, height, xleft, ytop;
266     int step;
267
268 #if CONFIG_AVFILTER
269     AVFilterContext *in_video_filter;   // the first filter in the video chain
270     AVFilterContext *out_video_filter;  // the last filter in the video chain
271     AVFilterContext *in_audio_filter;   // the first filter in the audio chain
272     AVFilterContext *out_audio_filter;  // the last filter in the audio chain
273     AVFilterGraph *agraph;              // audio filter graph
274 #endif
275
276     int last_video_stream, last_audio_stream, last_subtitle_stream;
277
278     SDL_cond *continue_read_thread;
279 } VideoState;
280
281 /* options specified by the user */
282 static AVInputFormat *file_iformat;
283 static const char *input_filename;
284 static const char *window_title;
285 static int fs_screen_width;
286 static int fs_screen_height;
287 static int default_width  = 640;
288 static int default_height = 480;
289 static int screen_width  = 0;
290 static int screen_height = 0;
291 static int audio_disable;
292 static int video_disable;
293 static int subtitle_disable;
294 static int wanted_stream[AVMEDIA_TYPE_NB] = {
295     [AVMEDIA_TYPE_AUDIO]    = -1,
296     [AVMEDIA_TYPE_VIDEO]    = -1,
297     [AVMEDIA_TYPE_SUBTITLE] = -1,
298 };
299 static int seek_by_bytes = -1;
300 static int display_disable;
301 static int show_status = 1;
302 static int av_sync_type = AV_SYNC_AUDIO_MASTER;
303 static int64_t start_time = AV_NOPTS_VALUE;
304 static int64_t duration = AV_NOPTS_VALUE;
305 static int workaround_bugs = 1;
306 static int fast = 0;
307 static int genpts = 0;
308 static int lowres = 0;
309 static int error_concealment = 3;
310 static int decoder_reorder_pts = -1;
311 static int autoexit;
312 static int exit_on_keydown;
313 static int exit_on_mousedown;
314 static int loop = 1;
315 static int framedrop = -1;
316 static int infinite_buffer = -1;
317 static enum ShowMode show_mode = SHOW_MODE_NONE;
318 static const char *audio_codec_name;
319 static const char *subtitle_codec_name;
320 static const char *video_codec_name;
321 double rdftspeed = 0.02;
322 static int64_t cursor_last_shown;
323 static int cursor_hidden = 0;
324 #if CONFIG_AVFILTER
325 static char *vfilters = NULL;
326 static char *afilters = NULL;
327 #endif
328
329 /* current context */
330 static int is_full_screen;
331 static int64_t audio_callback_time;
332
333 static AVPacket flush_pkt;
334
335 #define FF_ALLOC_EVENT   (SDL_USEREVENT)
336 #define FF_QUIT_EVENT    (SDL_USEREVENT + 2)
337
338 static SDL_Surface *screen;
339
340 static inline
341 int cmp_audio_fmts(enum AVSampleFormat fmt1, int64_t channel_count1,
342                    enum AVSampleFormat fmt2, int64_t channel_count2)
343 {
344     /* If channel count == 1, planar and non-planar formats are the same */
345     if (channel_count1 == 1 && channel_count2 == 1)
346         return av_get_packed_sample_fmt(fmt1) != av_get_packed_sample_fmt(fmt2);
347     else
348         return channel_count1 != channel_count2 || fmt1 != fmt2;
349 }
350
351 static inline
352 int64_t get_valid_channel_layout(int64_t channel_layout, int channels)
353 {
354     if (channel_layout && av_get_channel_layout_nb_channels(channel_layout) == channels)
355         return channel_layout;
356     else
357         return 0;
358 }
359
360 static int packet_queue_put(PacketQueue *q, AVPacket *pkt);
361
362 static int packet_queue_put_private(PacketQueue *q, AVPacket *pkt)
363 {
364     MyAVPacketList *pkt1;
365
366     if (q->abort_request)
367        return -1;
368
369     pkt1 = av_malloc(sizeof(MyAVPacketList));
370     if (!pkt1)
371         return -1;
372     pkt1->pkt = *pkt;
373     pkt1->next = NULL;
374     if (pkt == &flush_pkt)
375         q->serial++;
376     pkt1->serial = q->serial;
377
378     if (!q->last_pkt)
379         q->first_pkt = pkt1;
380     else
381         q->last_pkt->next = pkt1;
382     q->last_pkt = pkt1;
383     q->nb_packets++;
384     q->size += pkt1->pkt.size + sizeof(*pkt1);
385     /* XXX: should duplicate packet data in DV case */
386     SDL_CondSignal(q->cond);
387     return 0;
388 }
389
390 static int packet_queue_put(PacketQueue *q, AVPacket *pkt)
391 {
392     int ret;
393
394     /* duplicate the packet */
395     if (pkt != &flush_pkt && av_dup_packet(pkt) < 0)
396         return -1;
397
398     SDL_LockMutex(q->mutex);
399     ret = packet_queue_put_private(q, pkt);
400     SDL_UnlockMutex(q->mutex);
401
402     if (pkt != &flush_pkt && ret < 0)
403         av_free_packet(pkt);
404
405     return ret;
406 }
407
408 /* packet queue handling */
409 static void packet_queue_init(PacketQueue *q)
410 {
411     memset(q, 0, sizeof(PacketQueue));
412     q->mutex = SDL_CreateMutex();
413     q->cond = SDL_CreateCond();
414     q->abort_request = 1;
415 }
416
417 static void packet_queue_flush(PacketQueue *q)
418 {
419     MyAVPacketList *pkt, *pkt1;
420
421     SDL_LockMutex(q->mutex);
422     for (pkt = q->first_pkt; pkt != NULL; pkt = pkt1) {
423         pkt1 = pkt->next;
424         av_free_packet(&pkt->pkt);
425         av_freep(&pkt);
426     }
427     q->last_pkt = NULL;
428     q->first_pkt = NULL;
429     q->nb_packets = 0;
430     q->size = 0;
431     SDL_UnlockMutex(q->mutex);
432 }
433
434 static void packet_queue_destroy(PacketQueue *q)
435 {
436     packet_queue_flush(q);
437     SDL_DestroyMutex(q->mutex);
438     SDL_DestroyCond(q->cond);
439 }
440
441 static void packet_queue_abort(PacketQueue *q)
442 {
443     SDL_LockMutex(q->mutex);
444
445     q->abort_request = 1;
446
447     SDL_CondSignal(q->cond);
448
449     SDL_UnlockMutex(q->mutex);
450 }
451
452 static void packet_queue_start(PacketQueue *q)
453 {
454     SDL_LockMutex(q->mutex);
455     q->abort_request = 0;
456     packet_queue_put_private(q, &flush_pkt);
457     SDL_UnlockMutex(q->mutex);
458 }
459
460 /* return < 0 if aborted, 0 if no packet and > 0 if packet.  */
461 static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block, int *serial)
462 {
463     MyAVPacketList *pkt1;
464     int ret;
465
466     SDL_LockMutex(q->mutex);
467
468     for (;;) {
469         if (q->abort_request) {
470             ret = -1;
471             break;
472         }
473
474         pkt1 = q->first_pkt;
475         if (pkt1) {
476             q->first_pkt = pkt1->next;
477             if (!q->first_pkt)
478                 q->last_pkt = NULL;
479             q->nb_packets--;
480             q->size -= pkt1->pkt.size + sizeof(*pkt1);
481             *pkt = pkt1->pkt;
482             if (serial)
483                 *serial = pkt1->serial;
484             av_free(pkt1);
485             ret = 1;
486             break;
487         } else if (!block) {
488             ret = 0;
489             break;
490         } else {
491             SDL_CondWait(q->cond, q->mutex);
492         }
493     }
494     SDL_UnlockMutex(q->mutex);
495     return ret;
496 }
497
498 static inline void fill_rectangle(SDL_Surface *screen,
499                                   int x, int y, int w, int h, int color, int update)
500 {
501     SDL_Rect rect;
502     rect.x = x;
503     rect.y = y;
504     rect.w = w;
505     rect.h = h;
506     SDL_FillRect(screen, &rect, color);
507     if (update && w > 0 && h > 0)
508         SDL_UpdateRect(screen, x, y, w, h);
509 }
510
511 /* draw only the border of a rectangle */
512 static void fill_border(int xleft, int ytop, int width, int height, int x, int y, int w, int h, int color, int update)
513 {
514     int w1, w2, h1, h2;
515
516     /* fill the background */
517     w1 = x;
518     if (w1 < 0)
519         w1 = 0;
520     w2 = width - (x + w);
521     if (w2 < 0)
522         w2 = 0;
523     h1 = y;
524     if (h1 < 0)
525         h1 = 0;
526     h2 = height - (y + h);
527     if (h2 < 0)
528         h2 = 0;
529     fill_rectangle(screen,
530                    xleft, ytop,
531                    w1, height,
532                    color, update);
533     fill_rectangle(screen,
534                    xleft + width - w2, ytop,
535                    w2, height,
536                    color, update);
537     fill_rectangle(screen,
538                    xleft + w1, ytop,
539                    width - w1 - w2, h1,
540                    color, update);
541     fill_rectangle(screen,
542                    xleft + w1, ytop + height - h2,
543                    width - w1 - w2, h2,
544                    color, update);
545 }
546
547 #define ALPHA_BLEND(a, oldp, newp, s)\
548 ((((oldp << s) * (255 - (a))) + (newp * (a))) / (255 << s))
549
550 #define RGBA_IN(r, g, b, a, s)\
551 {\
552     unsigned int v = ((const uint32_t *)(s))[0];\
553     a = (v >> 24) & 0xff;\
554     r = (v >> 16) & 0xff;\
555     g = (v >> 8) & 0xff;\
556     b = v & 0xff;\
557 }
558
559 #define YUVA_IN(y, u, v, a, s, pal)\
560 {\
561     unsigned int val = ((const uint32_t *)(pal))[*(const uint8_t*)(s)];\
562     a = (val >> 24) & 0xff;\
563     y = (val >> 16) & 0xff;\
564     u = (val >> 8) & 0xff;\
565     v = val & 0xff;\
566 }
567
568 #define YUVA_OUT(d, y, u, v, a)\
569 {\
570     ((uint32_t *)(d))[0] = (a << 24) | (y << 16) | (u << 8) | v;\
571 }
572
573
574 #define BPP 1
575
576 static void blend_subrect(AVPicture *dst, const AVSubtitleRect *rect, int imgw, int imgh)
577 {
578     int wrap, wrap3, width2, skip2;
579     int y, u, v, a, u1, v1, a1, w, h;
580     uint8_t *lum, *cb, *cr;
581     const uint8_t *p;
582     const uint32_t *pal;
583     int dstx, dsty, dstw, dsth;
584
585     dstw = av_clip(rect->w, 0, imgw);
586     dsth = av_clip(rect->h, 0, imgh);
587     dstx = av_clip(rect->x, 0, imgw - dstw);
588     dsty = av_clip(rect->y, 0, imgh - dsth);
589     lum = dst->data[0] + dsty * dst->linesize[0];
590     cb  = dst->data[1] + (dsty >> 1) * dst->linesize[1];
591     cr  = dst->data[2] + (dsty >> 1) * dst->linesize[2];
592
593     width2 = ((dstw + 1) >> 1) + (dstx & ~dstw & 1);
594     skip2 = dstx >> 1;
595     wrap = dst->linesize[0];
596     wrap3 = rect->pict.linesize[0];
597     p = rect->pict.data[0];
598     pal = (const uint32_t *)rect->pict.data[1];  /* Now in YCrCb! */
599
600     if (dsty & 1) {
601         lum += dstx;
602         cb += skip2;
603         cr += skip2;
604
605         if (dstx & 1) {
606             YUVA_IN(y, u, v, a, p, pal);
607             lum[0] = ALPHA_BLEND(a, lum[0], y, 0);
608             cb[0] = ALPHA_BLEND(a >> 2, cb[0], u, 0);
609             cr[0] = ALPHA_BLEND(a >> 2, cr[0], v, 0);
610             cb++;
611             cr++;
612             lum++;
613             p += BPP;
614         }
615         for (w = dstw - (dstx & 1); w >= 2; w -= 2) {
616             YUVA_IN(y, u, v, a, p, pal);
617             u1 = u;
618             v1 = v;
619             a1 = a;
620             lum[0] = ALPHA_BLEND(a, lum[0], y, 0);
621
622             YUVA_IN(y, u, v, a, p + BPP, pal);
623             u1 += u;
624             v1 += v;
625             a1 += a;
626             lum[1] = ALPHA_BLEND(a, lum[1], y, 0);
627             cb[0] = ALPHA_BLEND(a1 >> 2, cb[0], u1, 1);
628             cr[0] = ALPHA_BLEND(a1 >> 2, cr[0], v1, 1);
629             cb++;
630             cr++;
631             p += 2 * BPP;
632             lum += 2;
633         }
634         if (w) {
635             YUVA_IN(y, u, v, a, p, pal);
636             lum[0] = ALPHA_BLEND(a, lum[0], y, 0);
637             cb[0] = ALPHA_BLEND(a >> 2, cb[0], u, 0);
638             cr[0] = ALPHA_BLEND(a >> 2, cr[0], v, 0);
639             p++;
640             lum++;
641         }
642         p += wrap3 - dstw * BPP;
643         lum += wrap - dstw - dstx;
644         cb += dst->linesize[1] - width2 - skip2;
645         cr += dst->linesize[2] - width2 - skip2;
646     }
647     for (h = dsth - (dsty & 1); h >= 2; h -= 2) {
648         lum += dstx;
649         cb += skip2;
650         cr += skip2;
651
652         if (dstx & 1) {
653             YUVA_IN(y, u, v, a, p, pal);
654             u1 = u;
655             v1 = v;
656             a1 = a;
657             lum[0] = ALPHA_BLEND(a, lum[0], y, 0);
658             p += wrap3;
659             lum += wrap;
660             YUVA_IN(y, u, v, a, p, pal);
661             u1 += u;
662             v1 += v;
663             a1 += a;
664             lum[0] = ALPHA_BLEND(a, lum[0], y, 0);
665             cb[0] = ALPHA_BLEND(a1 >> 2, cb[0], u1, 1);
666             cr[0] = ALPHA_BLEND(a1 >> 2, cr[0], v1, 1);
667             cb++;
668             cr++;
669             p += -wrap3 + BPP;
670             lum += -wrap + 1;
671         }
672         for (w = dstw - (dstx & 1); w >= 2; w -= 2) {
673             YUVA_IN(y, u, v, a, p, pal);
674             u1 = u;
675             v1 = v;
676             a1 = a;
677             lum[0] = ALPHA_BLEND(a, lum[0], y, 0);
678
679             YUVA_IN(y, u, v, a, p + BPP, pal);
680             u1 += u;
681             v1 += v;
682             a1 += a;
683             lum[1] = ALPHA_BLEND(a, lum[1], y, 0);
684             p += wrap3;
685             lum += wrap;
686
687             YUVA_IN(y, u, v, a, p, pal);
688             u1 += u;
689             v1 += v;
690             a1 += a;
691             lum[0] = ALPHA_BLEND(a, lum[0], y, 0);
692
693             YUVA_IN(y, u, v, a, p + BPP, pal);
694             u1 += u;
695             v1 += v;
696             a1 += a;
697             lum[1] = ALPHA_BLEND(a, lum[1], y, 0);
698
699             cb[0] = ALPHA_BLEND(a1 >> 2, cb[0], u1, 2);
700             cr[0] = ALPHA_BLEND(a1 >> 2, cr[0], v1, 2);
701
702             cb++;
703             cr++;
704             p += -wrap3 + 2 * BPP;
705             lum += -wrap + 2;
706         }
707         if (w) {
708             YUVA_IN(y, u, v, a, p, pal);
709             u1 = u;
710             v1 = v;
711             a1 = a;
712             lum[0] = ALPHA_BLEND(a, lum[0], y, 0);
713             p += wrap3;
714             lum += wrap;
715             YUVA_IN(y, u, v, a, p, pal);
716             u1 += u;
717             v1 += v;
718             a1 += a;
719             lum[0] = ALPHA_BLEND(a, lum[0], y, 0);
720             cb[0] = ALPHA_BLEND(a1 >> 2, cb[0], u1, 1);
721             cr[0] = ALPHA_BLEND(a1 >> 2, cr[0], v1, 1);
722             cb++;
723             cr++;
724             p += -wrap3 + BPP;
725             lum += -wrap + 1;
726         }
727         p += wrap3 + (wrap3 - dstw * BPP);
728         lum += wrap + (wrap - dstw - dstx);
729         cb += dst->linesize[1] - width2 - skip2;
730         cr += dst->linesize[2] - width2 - skip2;
731     }
732     /* handle odd height */
733     if (h) {
734         lum += dstx;
735         cb += skip2;
736         cr += skip2;
737
738         if (dstx & 1) {
739             YUVA_IN(y, u, v, a, p, pal);
740             lum[0] = ALPHA_BLEND(a, lum[0], y, 0);
741             cb[0] = ALPHA_BLEND(a >> 2, cb[0], u, 0);
742             cr[0] = ALPHA_BLEND(a >> 2, cr[0], v, 0);
743             cb++;
744             cr++;
745             lum++;
746             p += BPP;
747         }
748         for (w = dstw - (dstx & 1); w >= 2; w -= 2) {
749             YUVA_IN(y, u, v, a, p, pal);
750             u1 = u;
751             v1 = v;
752             a1 = a;
753             lum[0] = ALPHA_BLEND(a, lum[0], y, 0);
754
755             YUVA_IN(y, u, v, a, p + BPP, pal);
756             u1 += u;
757             v1 += v;
758             a1 += a;
759             lum[1] = ALPHA_BLEND(a, lum[1], y, 0);
760             cb[0] = ALPHA_BLEND(a1 >> 2, cb[0], u, 1);
761             cr[0] = ALPHA_BLEND(a1 >> 2, cr[0], v, 1);
762             cb++;
763             cr++;
764             p += 2 * BPP;
765             lum += 2;
766         }
767         if (w) {
768             YUVA_IN(y, u, v, a, p, pal);
769             lum[0] = ALPHA_BLEND(a, lum[0], y, 0);
770             cb[0] = ALPHA_BLEND(a >> 2, cb[0], u, 0);
771             cr[0] = ALPHA_BLEND(a >> 2, cr[0], v, 0);
772         }
773     }
774 }
775
776 static void free_subpicture(SubPicture *sp)
777 {
778     avsubtitle_free(&sp->sub);
779 }
780
781 static void calculate_display_rect(SDL_Rect *rect, int scr_xleft, int scr_ytop, int scr_width, int scr_height, VideoPicture *vp)
782 {
783     float aspect_ratio;
784     int width, height, x, y;
785
786     if (vp->sar.num == 0)
787         aspect_ratio = 0;
788     else
789         aspect_ratio = av_q2d(vp->sar);
790
791     if (aspect_ratio <= 0.0)
792         aspect_ratio = 1.0;
793     aspect_ratio *= (float)vp->width / (float)vp->height;
794
795     /* XXX: we suppose the screen has a 1.0 pixel ratio */
796     height = scr_height;
797     width = ((int)rint(height * aspect_ratio)) & ~1;
798     if (width > scr_width) {
799         width = scr_width;
800         height = ((int)rint(width / aspect_ratio)) & ~1;
801     }
802     x = (scr_width - width) / 2;
803     y = (scr_height - height) / 2;
804     rect->x = scr_xleft + x;
805     rect->y = scr_ytop  + y;
806     rect->w = FFMAX(width,  1);
807     rect->h = FFMAX(height, 1);
808 }
809
810 static void video_image_display(VideoState *is)
811 {
812     VideoPicture *vp;
813     SubPicture *sp;
814     AVPicture pict;
815     SDL_Rect rect;
816     int i;
817
818     vp = &is->pictq[is->pictq_rindex];
819     if (vp->bmp) {
820         if (is->subtitle_st) {
821             if (is->subpq_size > 0) {
822                 sp = &is->subpq[is->subpq_rindex];
823
824                 if (vp->pts >= sp->pts + ((float) sp->sub.start_display_time / 1000)) {
825                     SDL_LockYUVOverlay (vp->bmp);
826
827                     pict.data[0] = vp->bmp->pixels[0];
828                     pict.data[1] = vp->bmp->pixels[2];
829                     pict.data[2] = vp->bmp->pixels[1];
830
831                     pict.linesize[0] = vp->bmp->pitches[0];
832                     pict.linesize[1] = vp->bmp->pitches[2];
833                     pict.linesize[2] = vp->bmp->pitches[1];
834
835                     for (i = 0; i < sp->sub.num_rects; i++)
836                         blend_subrect(&pict, sp->sub.rects[i],
837                                       vp->bmp->w, vp->bmp->h);
838
839                     SDL_UnlockYUVOverlay (vp->bmp);
840                 }
841             }
842         }
843
844         calculate_display_rect(&rect, is->xleft, is->ytop, is->width, is->height, vp);
845
846         SDL_DisplayYUVOverlay(vp->bmp, &rect);
847
848         if (rect.x != is->last_display_rect.x || rect.y != is->last_display_rect.y || rect.w != is->last_display_rect.w || rect.h != is->last_display_rect.h || is->force_refresh) {
849             int bgcolor = SDL_MapRGB(screen->format, 0x00, 0x00, 0x00);
850             fill_border(is->xleft, is->ytop, is->width, is->height, rect.x, rect.y, rect.w, rect.h, bgcolor, 1);
851             is->last_display_rect = rect;
852         }
853     }
854 }
855
856 static inline int compute_mod(int a, int b)
857 {
858     return a < 0 ? a%b + b : a%b;
859 }
860
861 static void video_audio_display(VideoState *s)
862 {
863     int i, i_start, x, y1, y, ys, delay, n, nb_display_channels;
864     int ch, channels, h, h2, bgcolor, fgcolor;
865     int64_t time_diff;
866     int rdft_bits, nb_freq;
867
868     for (rdft_bits = 1; (1 << rdft_bits) < 2 * s->height; rdft_bits++)
869         ;
870     nb_freq = 1 << (rdft_bits - 1);
871
872     /* compute display index : center on currently output samples */
873     channels = s->audio_tgt.channels;
874     nb_display_channels = channels;
875     if (!s->paused) {
876         int data_used= s->show_mode == SHOW_MODE_WAVES ? s->width : (2*nb_freq);
877         n = 2 * channels;
878         delay = s->audio_write_buf_size;
879         delay /= n;
880
881         /* to be more precise, we take into account the time spent since
882            the last buffer computation */
883         if (audio_callback_time) {
884             time_diff = av_gettime() - audio_callback_time;
885             delay -= (time_diff * s->audio_tgt.freq) / 1000000;
886         }
887
888         delay += 2 * data_used;
889         if (delay < data_used)
890             delay = data_used;
891
892         i_start= x = compute_mod(s->sample_array_index - delay * channels, SAMPLE_ARRAY_SIZE);
893         if (s->show_mode == SHOW_MODE_WAVES) {
894             h = INT_MIN;
895             for (i = 0; i < 1000; i += channels) {
896                 int idx = (SAMPLE_ARRAY_SIZE + x - i) % SAMPLE_ARRAY_SIZE;
897                 int a = s->sample_array[idx];
898                 int b = s->sample_array[(idx + 4 * channels) % SAMPLE_ARRAY_SIZE];
899                 int c = s->sample_array[(idx + 5 * channels) % SAMPLE_ARRAY_SIZE];
900                 int d = s->sample_array[(idx + 9 * channels) % SAMPLE_ARRAY_SIZE];
901                 int score = a - d;
902                 if (h < score && (b ^ c) < 0) {
903                     h = score;
904                     i_start = idx;
905                 }
906             }
907         }
908
909         s->last_i_start = i_start;
910     } else {
911         i_start = s->last_i_start;
912     }
913
914     bgcolor = SDL_MapRGB(screen->format, 0x00, 0x00, 0x00);
915     if (s->show_mode == SHOW_MODE_WAVES) {
916         fill_rectangle(screen,
917                        s->xleft, s->ytop, s->width, s->height,
918                        bgcolor, 0);
919
920         fgcolor = SDL_MapRGB(screen->format, 0xff, 0xff, 0xff);
921
922         /* total height for one channel */
923         h = s->height / nb_display_channels;
924         /* graph height / 2 */
925         h2 = (h * 9) / 20;
926         for (ch = 0; ch < nb_display_channels; ch++) {
927             i = i_start + ch;
928             y1 = s->ytop + ch * h + (h / 2); /* position of center line */
929             for (x = 0; x < s->width; x++) {
930                 y = (s->sample_array[i] * h2) >> 15;
931                 if (y < 0) {
932                     y = -y;
933                     ys = y1 - y;
934                 } else {
935                     ys = y1;
936                 }
937                 fill_rectangle(screen,
938                                s->xleft + x, ys, 1, y,
939                                fgcolor, 0);
940                 i += channels;
941                 if (i >= SAMPLE_ARRAY_SIZE)
942                     i -= SAMPLE_ARRAY_SIZE;
943             }
944         }
945
946         fgcolor = SDL_MapRGB(screen->format, 0x00, 0x00, 0xff);
947
948         for (ch = 1; ch < nb_display_channels; ch++) {
949             y = s->ytop + ch * h;
950             fill_rectangle(screen,
951                            s->xleft, y, s->width, 1,
952                            fgcolor, 0);
953         }
954         SDL_UpdateRect(screen, s->xleft, s->ytop, s->width, s->height);
955     } else {
956         nb_display_channels= FFMIN(nb_display_channels, 2);
957         if (rdft_bits != s->rdft_bits) {
958             av_rdft_end(s->rdft);
959             av_free(s->rdft_data);
960             s->rdft = av_rdft_init(rdft_bits, DFT_R2C);
961             s->rdft_bits = rdft_bits;
962             s->rdft_data = av_malloc(4 * nb_freq * sizeof(*s->rdft_data));
963         }
964         {
965             FFTSample *data[2];
966             for (ch = 0; ch < nb_display_channels; ch++) {
967                 data[ch] = s->rdft_data + 2 * nb_freq * ch;
968                 i = i_start + ch;
969                 for (x = 0; x < 2 * nb_freq; x++) {
970                     double w = (x-nb_freq) * (1.0 / nb_freq);
971                     data[ch][x] = s->sample_array[i] * (1.0 - w * w);
972                     i += channels;
973                     if (i >= SAMPLE_ARRAY_SIZE)
974                         i -= SAMPLE_ARRAY_SIZE;
975                 }
976                 av_rdft_calc(s->rdft, data[ch]);
977             }
978             // least efficient way to do this, we should of course directly access it but its more than fast enough
979             for (y = 0; y < s->height; y++) {
980                 double w = 1 / sqrt(nb_freq);
981                 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]));
982                 int b = (nb_display_channels == 2 ) ? sqrt(w * sqrt(data[1][2 * y + 0] * data[1][2 * y + 0]
983                        + data[1][2 * y + 1] * data[1][2 * y + 1])) : a;
984                 a = FFMIN(a, 255);
985                 b = FFMIN(b, 255);
986                 fgcolor = SDL_MapRGB(screen->format, a, b, (a + b) / 2);
987
988                 fill_rectangle(screen,
989                             s->xpos, s->height-y, 1, 1,
990                             fgcolor, 0);
991             }
992         }
993         SDL_UpdateRect(screen, s->xpos, s->ytop, 1, s->height);
994         if (!s->paused)
995             s->xpos++;
996         if (s->xpos >= s->width)
997             s->xpos= s->xleft;
998     }
999 }
1000
1001 static void stream_close(VideoState *is)
1002 {
1003     VideoPicture *vp;
1004     int i;
1005     /* XXX: use a special url_shutdown call to abort parse cleanly */
1006     is->abort_request = 1;
1007     SDL_WaitThread(is->read_tid, NULL);
1008     packet_queue_destroy(&is->videoq);
1009     packet_queue_destroy(&is->audioq);
1010     packet_queue_destroy(&is->subtitleq);
1011
1012     /* free all pictures */
1013     for (i = 0; i < VIDEO_PICTURE_QUEUE_SIZE; i++) {
1014         vp = &is->pictq[i];
1015         if (vp->bmp) {
1016             SDL_FreeYUVOverlay(vp->bmp);
1017             vp->bmp = NULL;
1018         }
1019     }
1020     SDL_DestroyMutex(is->pictq_mutex);
1021     SDL_DestroyCond(is->pictq_cond);
1022     SDL_DestroyMutex(is->subpq_mutex);
1023     SDL_DestroyCond(is->subpq_cond);
1024     SDL_DestroyCond(is->continue_read_thread);
1025 #if !CONFIG_AVFILTER
1026     sws_freeContext(is->img_convert_ctx);
1027 #endif
1028     av_free(is);
1029 }
1030
1031 static void do_exit(VideoState *is)
1032 {
1033     if (is) {
1034         stream_close(is);
1035     }
1036     av_lockmgr_register(NULL);
1037     uninit_opts();
1038 #if CONFIG_AVFILTER
1039     av_freep(&vfilters);
1040 #endif
1041     avformat_network_deinit();
1042     if (show_status)
1043         printf("\n");
1044     SDL_Quit();
1045     av_log(NULL, AV_LOG_QUIET, "%s", "");
1046     exit(0);
1047 }
1048
1049 static void sigterm_handler(int sig)
1050 {
1051     exit(123);
1052 }
1053
1054 static int video_open(VideoState *is, int force_set_video_mode, VideoPicture *vp)
1055 {
1056     int flags = SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_HWACCEL;
1057     int w,h;
1058     SDL_Rect rect;
1059
1060     if (is_full_screen) flags |= SDL_FULLSCREEN;
1061     else                flags |= SDL_RESIZABLE;
1062
1063     if (vp && vp->width) {
1064         calculate_display_rect(&rect, 0, 0, INT_MAX, vp->height, vp);
1065         default_width  = rect.w;
1066         default_height = rect.h;
1067     }
1068
1069     if (is_full_screen && fs_screen_width) {
1070         w = fs_screen_width;
1071         h = fs_screen_height;
1072     } else if (!is_full_screen && screen_width) {
1073         w = screen_width;
1074         h = screen_height;
1075     } else {
1076         w = default_width;
1077         h = default_height;
1078     }
1079     w = FFMIN(16383, w);
1080     if (screen && is->width == screen->w && screen->w == w
1081        && is->height== screen->h && screen->h == h && !force_set_video_mode)
1082         return 0;
1083     screen = SDL_SetVideoMode(w, h, 0, flags);
1084     if (!screen) {
1085         av_log(NULL, AV_LOG_FATAL, "SDL: could not set video mode - exiting\n");
1086         do_exit(is);
1087     }
1088     if (!window_title)
1089         window_title = input_filename;
1090     SDL_WM_SetCaption(window_title, window_title);
1091
1092     is->width  = screen->w;
1093     is->height = screen->h;
1094
1095     return 0;
1096 }
1097
1098 /* display the current picture, if any */
1099 static void video_display(VideoState *is)
1100 {
1101     if (!screen)
1102         video_open(is, 0, NULL);
1103     if (is->audio_st && is->show_mode != SHOW_MODE_VIDEO)
1104         video_audio_display(is);
1105     else if (is->video_st)
1106         video_image_display(is);
1107 }
1108
1109 static double get_clock(Clock *c)
1110 {
1111     if (*c->queue_serial != c->serial)
1112         return NAN;
1113     if (c->paused) {
1114         return c->pts;
1115     } else {
1116         double time = av_gettime() / 1000000.0;
1117         return c->pts_drift + time - (time - c->last_updated) * (1.0 - c->speed);
1118     }
1119 }
1120
1121 static void set_clock_at(Clock *c, double pts, int serial, double time)
1122 {
1123     c->pts = pts;
1124     c->last_updated = time;
1125     c->pts_drift = c->pts - time;
1126     c->serial = serial;
1127 }
1128
1129 static void set_clock(Clock *c, double pts, int serial)
1130 {
1131     double time = av_gettime() / 1000000.0;
1132     set_clock_at(c, pts, serial, time);
1133 }
1134
1135 static void set_clock_speed(Clock *c, double speed)
1136 {
1137     set_clock(c, get_clock(c), c->serial);
1138     c->speed = speed;
1139 }
1140
1141 static void init_clock(Clock *c, int *queue_serial)
1142 {
1143     c->speed = 1.0;
1144     c->paused = 0;
1145     c->queue_serial = queue_serial;
1146     set_clock(c, NAN, -1);
1147 }
1148
1149 static void sync_clock_to_slave(Clock *c, Clock *slave)
1150 {
1151     double clock = get_clock(c);
1152     double slave_clock = get_clock(slave);
1153     if (!isnan(slave_clock) && (isnan(clock) || fabs(clock - slave_clock) > AV_NOSYNC_THRESHOLD))
1154         set_clock(c, slave_clock, slave->serial);
1155 }
1156
1157 static int get_master_sync_type(VideoState *is) {
1158     if (is->av_sync_type == AV_SYNC_VIDEO_MASTER) {
1159         if (is->video_st)
1160             return AV_SYNC_VIDEO_MASTER;
1161         else
1162             return AV_SYNC_AUDIO_MASTER;
1163     } else if (is->av_sync_type == AV_SYNC_AUDIO_MASTER) {
1164         if (is->audio_st)
1165             return AV_SYNC_AUDIO_MASTER;
1166         else
1167             return AV_SYNC_EXTERNAL_CLOCK;
1168     } else {
1169         return AV_SYNC_EXTERNAL_CLOCK;
1170     }
1171 }
1172
1173 /* get the current master clock value */
1174 static double get_master_clock(VideoState *is)
1175 {
1176     double val;
1177
1178     switch (get_master_sync_type(is)) {
1179         case AV_SYNC_VIDEO_MASTER:
1180             val = get_clock(&is->vidclk);
1181             break;
1182         case AV_SYNC_AUDIO_MASTER:
1183             val = get_clock(&is->audclk);
1184             break;
1185         default:
1186             val = get_clock(&is->extclk);
1187             break;
1188     }
1189     return val;
1190 }
1191
1192 static void check_external_clock_speed(VideoState *is) {
1193    if (is->video_stream >= 0 && is->videoq.nb_packets <= MIN_FRAMES / 2 ||
1194        is->audio_stream >= 0 && is->audioq.nb_packets <= MIN_FRAMES / 2) {
1195        set_clock_speed(&is->extclk, FFMAX(EXTERNAL_CLOCK_SPEED_MIN, is->extclk.speed - EXTERNAL_CLOCK_SPEED_STEP));
1196    } else if ((is->video_stream < 0 || is->videoq.nb_packets > MIN_FRAMES * 2) &&
1197               (is->audio_stream < 0 || is->audioq.nb_packets > MIN_FRAMES * 2)) {
1198        set_clock_speed(&is->extclk, FFMIN(EXTERNAL_CLOCK_SPEED_MAX, is->extclk.speed + EXTERNAL_CLOCK_SPEED_STEP));
1199    } else {
1200        double speed = is->extclk.speed;
1201        if (speed != 1.0)
1202            set_clock_speed(&is->extclk, speed + EXTERNAL_CLOCK_SPEED_STEP * (1.0 - speed) / fabs(1.0 - speed));
1203    }
1204 }
1205
1206 /* seek in the stream */
1207 static void stream_seek(VideoState *is, int64_t pos, int64_t rel, int seek_by_bytes)
1208 {
1209     if (!is->seek_req) {
1210         is->seek_pos = pos;
1211         is->seek_rel = rel;
1212         is->seek_flags &= ~AVSEEK_FLAG_BYTE;
1213         if (seek_by_bytes)
1214             is->seek_flags |= AVSEEK_FLAG_BYTE;
1215         is->seek_req = 1;
1216         SDL_CondSignal(is->continue_read_thread);
1217     }
1218 }
1219
1220 /* pause or resume the video */
1221 static void stream_toggle_pause(VideoState *is)
1222 {
1223     if (is->paused) {
1224         is->frame_timer += av_gettime() / 1000000.0 + is->vidclk.pts_drift - is->vidclk.pts;
1225         if (is->read_pause_return != AVERROR(ENOSYS)) {
1226             is->vidclk.paused = 0;
1227         }
1228         set_clock(&is->vidclk, get_clock(&is->vidclk), is->vidclk.serial);
1229     }
1230     set_clock(&is->extclk, get_clock(&is->extclk), is->extclk.serial);
1231     is->paused = is->audclk.paused = is->vidclk.paused = is->extclk.paused = !is->paused;
1232 }
1233
1234 static void toggle_pause(VideoState *is)
1235 {
1236     stream_toggle_pause(is);
1237     is->step = 0;
1238 }
1239
1240 static void step_to_next_frame(VideoState *is)
1241 {
1242     /* if the stream is paused unpause it, then step */
1243     if (is->paused)
1244         stream_toggle_pause(is);
1245     is->step = 1;
1246 }
1247
1248 static double compute_target_delay(double delay, VideoState *is)
1249 {
1250     double sync_threshold, diff;
1251
1252     /* update delay to follow master synchronisation source */
1253     if (get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER) {
1254         /* if video is slave, we try to correct big delays by
1255            duplicating or deleting a frame */
1256         diff = get_clock(&is->vidclk) - get_master_clock(is);
1257
1258         /* skip or repeat frame. We take into account the
1259            delay to compute the threshold. I still don't know
1260            if it is the best guess */
1261         sync_threshold = FFMAX(AV_SYNC_THRESHOLD_MIN, FFMIN(AV_SYNC_THRESHOLD_MAX, delay));
1262         if (!isnan(diff) && fabs(diff) < is->max_frame_duration) {
1263             if (diff <= -sync_threshold)
1264                 delay = FFMAX(0, delay + diff);
1265             else if (diff >= sync_threshold && delay > AV_SYNC_FRAMEDUP_THRESHOLD)
1266                 delay = delay + diff;
1267             else if (diff >= sync_threshold)
1268                 delay = 2 * delay;
1269         }
1270     }
1271
1272     av_dlog(NULL, "video: delay=%0.3f A-V=%f\n",
1273             delay, -diff);
1274
1275     return delay;
1276 }
1277
1278 static void pictq_next_picture(VideoState *is) {
1279     /* update queue size and signal for next picture */
1280     if (++is->pictq_rindex == VIDEO_PICTURE_QUEUE_SIZE)
1281         is->pictq_rindex = 0;
1282
1283     SDL_LockMutex(is->pictq_mutex);
1284     is->pictq_size--;
1285     SDL_CondSignal(is->pictq_cond);
1286     SDL_UnlockMutex(is->pictq_mutex);
1287 }
1288
1289 static int pictq_prev_picture(VideoState *is) {
1290     VideoPicture *prevvp;
1291     int ret = 0;
1292     /* update queue size and signal for the previous picture */
1293     prevvp = &is->pictq[(is->pictq_rindex + VIDEO_PICTURE_QUEUE_SIZE - 1) % VIDEO_PICTURE_QUEUE_SIZE];
1294     if (prevvp->allocated && prevvp->serial == is->videoq.serial) {
1295         SDL_LockMutex(is->pictq_mutex);
1296         if (is->pictq_size < VIDEO_PICTURE_QUEUE_SIZE) {
1297             if (--is->pictq_rindex == -1)
1298                 is->pictq_rindex = VIDEO_PICTURE_QUEUE_SIZE - 1;
1299             is->pictq_size++;
1300             ret = 1;
1301         }
1302         SDL_CondSignal(is->pictq_cond);
1303         SDL_UnlockMutex(is->pictq_mutex);
1304     }
1305     return ret;
1306 }
1307
1308 static void update_video_pts(VideoState *is, double pts, int64_t pos, int serial) {
1309     /* update current video pts */
1310     set_clock(&is->vidclk, pts, serial);
1311     sync_clock_to_slave(&is->extclk, &is->vidclk);
1312     is->video_current_pos = pos;
1313     is->frame_last_pts = pts;
1314 }
1315
1316 /* called to display each frame */
1317 static void video_refresh(void *opaque, double *remaining_time)
1318 {
1319     VideoState *is = opaque;
1320     VideoPicture *vp;
1321     double time;
1322
1323     SubPicture *sp, *sp2;
1324
1325     if (!is->paused && get_master_sync_type(is) == AV_SYNC_EXTERNAL_CLOCK && is->realtime)
1326         check_external_clock_speed(is);
1327
1328     if (!display_disable && is->show_mode != SHOW_MODE_VIDEO && is->audio_st) {
1329         time = av_gettime() / 1000000.0;
1330         if (is->force_refresh || is->last_vis_time + rdftspeed < time) {
1331             video_display(is);
1332             is->last_vis_time = time;
1333         }
1334         *remaining_time = FFMIN(*remaining_time, is->last_vis_time + rdftspeed - time);
1335     }
1336
1337     if (is->video_st) {
1338         int redisplay = 0;
1339         if (is->force_refresh)
1340             redisplay = pictq_prev_picture(is);
1341 retry:
1342         if (is->pictq_size == 0) {
1343             SDL_LockMutex(is->pictq_mutex);
1344             if (is->frame_last_dropped_pts != AV_NOPTS_VALUE && is->frame_last_dropped_pts > is->frame_last_pts) {
1345                 update_video_pts(is, is->frame_last_dropped_pts, is->frame_last_dropped_pos, is->frame_last_dropped_serial);
1346                 is->frame_last_dropped_pts = AV_NOPTS_VALUE;
1347             }
1348             SDL_UnlockMutex(is->pictq_mutex);
1349             // nothing to do, no picture to display in the queue
1350         } else {
1351             double last_duration, duration, delay;
1352             /* dequeue the picture */
1353             vp = &is->pictq[is->pictq_rindex];
1354
1355             if (vp->serial != is->videoq.serial) {
1356                 pictq_next_picture(is);
1357                 redisplay = 0;
1358                 goto retry;
1359             }
1360
1361             if (is->paused)
1362                 goto display;
1363
1364             /* compute nominal last_duration */
1365             last_duration = vp->pts - is->frame_last_pts;
1366             if (!isnan(last_duration) && last_duration > 0 && last_duration < is->max_frame_duration) {
1367                 /* if duration of the last frame was sane, update last_duration in video state */
1368                 is->frame_last_duration = last_duration;
1369             }
1370             if (redisplay)
1371                 delay = 0.0;
1372             else
1373                 delay = compute_target_delay(is->frame_last_duration, is);
1374
1375             time= av_gettime()/1000000.0;
1376             if (time < is->frame_timer + delay && !redisplay) {
1377                 *remaining_time = FFMIN(is->frame_timer + delay - time, *remaining_time);
1378                 return;
1379             }
1380
1381             is->frame_timer += delay;
1382             if (delay > 0 && time - is->frame_timer > AV_SYNC_THRESHOLD_MAX)
1383                 is->frame_timer = time;
1384
1385             SDL_LockMutex(is->pictq_mutex);
1386             if (!redisplay && !isnan(vp->pts))
1387                 update_video_pts(is, vp->pts, vp->pos, vp->serial);
1388             SDL_UnlockMutex(is->pictq_mutex);
1389
1390             if (is->pictq_size > 1) {
1391                 VideoPicture *nextvp = &is->pictq[(is->pictq_rindex + 1) % VIDEO_PICTURE_QUEUE_SIZE];
1392                 duration = nextvp->pts - vp->pts;
1393                 if(!is->step && (redisplay || framedrop>0 || (framedrop && get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER)) && time > is->frame_timer + duration){
1394                     if (!redisplay)
1395                         is->frame_drops_late++;
1396                     pictq_next_picture(is);
1397                     redisplay = 0;
1398                     goto retry;
1399                 }
1400             }
1401
1402             if (is->subtitle_st) {
1403                     while (is->subpq_size > 0) {
1404                         sp = &is->subpq[is->subpq_rindex];
1405
1406                         if (is->subpq_size > 1)
1407                             sp2 = &is->subpq[(is->subpq_rindex + 1) % SUBPICTURE_QUEUE_SIZE];
1408                         else
1409                             sp2 = NULL;
1410
1411                         if (sp->serial != is->subtitleq.serial
1412                                 || (is->vidclk.pts > (sp->pts + ((float) sp->sub.end_display_time / 1000)))
1413                                 || (sp2 && is->vidclk.pts > (sp2->pts + ((float) sp2->sub.start_display_time / 1000))))
1414                         {
1415                             free_subpicture(sp);
1416
1417                             /* update queue size and signal for next picture */
1418                             if (++is->subpq_rindex == SUBPICTURE_QUEUE_SIZE)
1419                                 is->subpq_rindex = 0;
1420
1421                             SDL_LockMutex(is->subpq_mutex);
1422                             is->subpq_size--;
1423                             SDL_CondSignal(is->subpq_cond);
1424                             SDL_UnlockMutex(is->subpq_mutex);
1425                         } else {
1426                             break;
1427                         }
1428                     }
1429             }
1430
1431 display:
1432             /* display picture */
1433             if (!display_disable && is->show_mode == SHOW_MODE_VIDEO)
1434                 video_display(is);
1435
1436             pictq_next_picture(is);
1437
1438             if (is->step && !is->paused)
1439                 stream_toggle_pause(is);
1440         }
1441     }
1442     is->force_refresh = 0;
1443     if (show_status) {
1444         static int64_t last_time;
1445         int64_t cur_time;
1446         int aqsize, vqsize, sqsize;
1447         double av_diff;
1448
1449         cur_time = av_gettime();
1450         if (!last_time || (cur_time - last_time) >= 30000) {
1451             aqsize = 0;
1452             vqsize = 0;
1453             sqsize = 0;
1454             if (is->audio_st)
1455                 aqsize = is->audioq.size;
1456             if (is->video_st)
1457                 vqsize = is->videoq.size;
1458             if (is->subtitle_st)
1459                 sqsize = is->subtitleq.size;
1460             av_diff = 0;
1461             if (is->audio_st && is->video_st)
1462                 av_diff = get_clock(&is->audclk) - get_clock(&is->vidclk);
1463             else if (is->video_st)
1464                 av_diff = get_master_clock(is) - get_clock(&is->vidclk);
1465             else if (is->audio_st)
1466                 av_diff = get_master_clock(is) - get_clock(&is->audclk);
1467             av_log(NULL, AV_LOG_INFO,
1468                    "%7.2f %s:%7.3f fd=%4d aq=%5dKB vq=%5dKB sq=%5dB f=%"PRId64"/%"PRId64"   \r",
1469                    get_master_clock(is),
1470                    (is->audio_st && is->video_st) ? "A-V" : (is->video_st ? "M-V" : (is->audio_st ? "M-A" : "   ")),
1471                    av_diff,
1472                    is->frame_drops_early + is->frame_drops_late,
1473                    aqsize / 1024,
1474                    vqsize / 1024,
1475                    sqsize,
1476                    is->video_st ? is->video_st->codec->pts_correction_num_faulty_dts : 0,
1477                    is->video_st ? is->video_st->codec->pts_correction_num_faulty_pts : 0);
1478             fflush(stdout);
1479             last_time = cur_time;
1480         }
1481     }
1482 }
1483
1484 /* allocate a picture (needs to do that in main thread to avoid
1485    potential locking problems */
1486 static void alloc_picture(VideoState *is)
1487 {
1488     VideoPicture *vp;
1489     int64_t bufferdiff;
1490
1491     vp = &is->pictq[is->pictq_windex];
1492
1493     if (vp->bmp)
1494         SDL_FreeYUVOverlay(vp->bmp);
1495
1496     video_open(is, 0, vp);
1497
1498     vp->bmp = SDL_CreateYUVOverlay(vp->width, vp->height,
1499                                    SDL_YV12_OVERLAY,
1500                                    screen);
1501     bufferdiff = vp->bmp ? FFMAX(vp->bmp->pixels[0], vp->bmp->pixels[1]) - FFMIN(vp->bmp->pixels[0], vp->bmp->pixels[1]) : 0;
1502     if (!vp->bmp || vp->bmp->pitches[0] < vp->width || bufferdiff < (int64_t)vp->height * vp->bmp->pitches[0]) {
1503         /* SDL allocates a buffer smaller than requested if the video
1504          * overlay hardware is unable to support the requested size. */
1505         av_log(NULL, AV_LOG_FATAL,
1506                "Error: the video system does not support an image\n"
1507                         "size of %dx%d pixels. Try using -lowres or -vf \"scale=w:h\"\n"
1508                         "to reduce the image size.\n", vp->width, vp->height );
1509         do_exit(is);
1510     }
1511
1512     SDL_LockMutex(is->pictq_mutex);
1513     vp->allocated = 1;
1514     SDL_CondSignal(is->pictq_cond);
1515     SDL_UnlockMutex(is->pictq_mutex);
1516 }
1517
1518 static void duplicate_right_border_pixels(SDL_Overlay *bmp) {
1519     int i, width, height;
1520     Uint8 *p, *maxp;
1521     for (i = 0; i < 3; i++) {
1522         width  = bmp->w;
1523         height = bmp->h;
1524         if (i > 0) {
1525             width  >>= 1;
1526             height >>= 1;
1527         }
1528         if (bmp->pitches[i] > width) {
1529             maxp = bmp->pixels[i] + bmp->pitches[i] * height - 1;
1530             for (p = bmp->pixels[i] + width - 1; p < maxp; p += bmp->pitches[i])
1531                 *(p+1) = *p;
1532         }
1533     }
1534 }
1535
1536 static int queue_picture(VideoState *is, AVFrame *src_frame, double pts, int64_t pos, int serial)
1537 {
1538     VideoPicture *vp;
1539
1540 #if defined(DEBUG_SYNC) && 0
1541     printf("frame_type=%c pts=%0.3f\n",
1542            av_get_picture_type_char(src_frame->pict_type), pts);
1543 #endif
1544
1545     /* wait until we have space to put a new picture */
1546     SDL_LockMutex(is->pictq_mutex);
1547
1548     /* keep the last already displayed picture in the queue */
1549     while (is->pictq_size >= VIDEO_PICTURE_QUEUE_SIZE - 1 &&
1550            !is->videoq.abort_request) {
1551         SDL_CondWait(is->pictq_cond, is->pictq_mutex);
1552     }
1553     SDL_UnlockMutex(is->pictq_mutex);
1554
1555     if (is->videoq.abort_request)
1556         return -1;
1557
1558     vp = &is->pictq[is->pictq_windex];
1559
1560     vp->sar = src_frame->sample_aspect_ratio;
1561
1562     /* alloc or resize hardware picture buffer */
1563     if (!vp->bmp || vp->reallocate || !vp->allocated ||
1564         vp->width  != src_frame->width ||
1565         vp->height != src_frame->height) {
1566         SDL_Event event;
1567
1568         vp->allocated  = 0;
1569         vp->reallocate = 0;
1570         vp->width = src_frame->width;
1571         vp->height = src_frame->height;
1572
1573         /* the allocation must be done in the main thread to avoid
1574            locking problems. */
1575         event.type = FF_ALLOC_EVENT;
1576         event.user.data1 = is;
1577         SDL_PushEvent(&event);
1578
1579         /* wait until the picture is allocated */
1580         SDL_LockMutex(is->pictq_mutex);
1581         while (!vp->allocated && !is->videoq.abort_request) {
1582             SDL_CondWait(is->pictq_cond, is->pictq_mutex);
1583         }
1584         /* if the queue is aborted, we have to pop the pending ALLOC event or wait for the allocation to complete */
1585         if (is->videoq.abort_request && SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_EVENTMASK(FF_ALLOC_EVENT)) != 1) {
1586             while (!vp->allocated) {
1587                 SDL_CondWait(is->pictq_cond, is->pictq_mutex);
1588             }
1589         }
1590         SDL_UnlockMutex(is->pictq_mutex);
1591
1592         if (is->videoq.abort_request)
1593             return -1;
1594     }
1595
1596     /* if the frame is not skipped, then display it */
1597     if (vp->bmp) {
1598         AVPicture pict = { { 0 } };
1599
1600         /* get a pointer on the bitmap */
1601         SDL_LockYUVOverlay (vp->bmp);
1602
1603         pict.data[0] = vp->bmp->pixels[0];
1604         pict.data[1] = vp->bmp->pixels[2];
1605         pict.data[2] = vp->bmp->pixels[1];
1606
1607         pict.linesize[0] = vp->bmp->pitches[0];
1608         pict.linesize[1] = vp->bmp->pitches[2];
1609         pict.linesize[2] = vp->bmp->pitches[1];
1610
1611 #if CONFIG_AVFILTER
1612         // FIXME use direct rendering
1613         av_picture_copy(&pict, (AVPicture *)src_frame,
1614                         src_frame->format, vp->width, vp->height);
1615 #else
1616         av_opt_get_int(sws_opts, "sws_flags", 0, &sws_flags);
1617         is->img_convert_ctx = sws_getCachedContext(is->img_convert_ctx,
1618             vp->width, vp->height, src_frame->format, vp->width, vp->height,
1619             AV_PIX_FMT_YUV420P, sws_flags, NULL, NULL, NULL);
1620         if (is->img_convert_ctx == NULL) {
1621             av_log(NULL, AV_LOG_FATAL, "Cannot initialize the conversion context\n");
1622             exit(1);
1623         }
1624         sws_scale(is->img_convert_ctx, src_frame->data, src_frame->linesize,
1625                   0, vp->height, pict.data, pict.linesize);
1626 #endif
1627         /* workaround SDL PITCH_WORKAROUND */
1628         duplicate_right_border_pixels(vp->bmp);
1629         /* update the bitmap content */
1630         SDL_UnlockYUVOverlay(vp->bmp);
1631
1632         vp->pts = pts;
1633         vp->pos = pos;
1634         vp->serial = serial;
1635
1636         /* now we can update the picture count */
1637         if (++is->pictq_windex == VIDEO_PICTURE_QUEUE_SIZE)
1638             is->pictq_windex = 0;
1639         SDL_LockMutex(is->pictq_mutex);
1640         is->pictq_size++;
1641         SDL_UnlockMutex(is->pictq_mutex);
1642     }
1643     return 0;
1644 }
1645
1646 static int get_video_frame(VideoState *is, AVFrame *frame, AVPacket *pkt, int *serial)
1647 {
1648     int got_picture;
1649
1650     if (packet_queue_get(&is->videoq, pkt, 1, serial) < 0)
1651         return -1;
1652
1653     if (pkt->data == flush_pkt.data) {
1654         avcodec_flush_buffers(is->video_st->codec);
1655
1656         SDL_LockMutex(is->pictq_mutex);
1657         // Make sure there are no long delay timers (ideally we should just flush the queue but that's harder)
1658         while (is->pictq_size && !is->videoq.abort_request) {
1659             SDL_CondWait(is->pictq_cond, is->pictq_mutex);
1660         }
1661         is->video_current_pos = -1;
1662         is->frame_last_pts = AV_NOPTS_VALUE;
1663         is->frame_last_duration = 0;
1664         is->frame_timer = (double)av_gettime() / 1000000.0;
1665         is->frame_last_dropped_pts = AV_NOPTS_VALUE;
1666         SDL_UnlockMutex(is->pictq_mutex);
1667         return 0;
1668     }
1669
1670     if(avcodec_decode_video2(is->video_st->codec, frame, &got_picture, pkt) < 0)
1671         return 0;
1672
1673     if (got_picture) {
1674         int ret = 1;
1675         double dpts = NAN;
1676
1677         if (decoder_reorder_pts == -1) {
1678             frame->pts = av_frame_get_best_effort_timestamp(frame);
1679         } else if (decoder_reorder_pts) {
1680             frame->pts = frame->pkt_pts;
1681         } else {
1682             frame->pts = frame->pkt_dts;
1683         }
1684
1685         if (frame->pts != AV_NOPTS_VALUE)
1686             dpts = av_q2d(is->video_st->time_base) * frame->pts;
1687
1688         frame->sample_aspect_ratio = av_guess_sample_aspect_ratio(is->ic, is->video_st, frame);
1689
1690         if (framedrop>0 || (framedrop && get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER)) {
1691             SDL_LockMutex(is->pictq_mutex);
1692             if (is->frame_last_pts != AV_NOPTS_VALUE && frame->pts != AV_NOPTS_VALUE) {
1693                 double clockdiff = get_clock(&is->vidclk) - get_master_clock(is);
1694                 double ptsdiff = dpts - is->frame_last_pts;
1695                 if (!isnan(clockdiff) && fabs(clockdiff) < AV_NOSYNC_THRESHOLD &&
1696                     !isnan(ptsdiff) && ptsdiff > 0 && ptsdiff < AV_NOSYNC_THRESHOLD &&
1697                     clockdiff + ptsdiff - is->frame_last_filter_delay < 0 &&
1698                     is->videoq.nb_packets) {
1699                     is->frame_last_dropped_pos = pkt->pos;
1700                     is->frame_last_dropped_pts = dpts;
1701                     is->frame_last_dropped_serial = *serial;
1702                     is->frame_drops_early++;
1703                     av_frame_unref(frame);
1704                     ret = 0;
1705                 }
1706             }
1707             SDL_UnlockMutex(is->pictq_mutex);
1708         }
1709
1710         return ret;
1711     }
1712     return 0;
1713 }
1714
1715 #if CONFIG_AVFILTER
1716 static int configure_filtergraph(AVFilterGraph *graph, const char *filtergraph,
1717                                  AVFilterContext *source_ctx, AVFilterContext *sink_ctx)
1718 {
1719     int ret;
1720     AVFilterInOut *outputs = NULL, *inputs = NULL;
1721
1722     if (filtergraph) {
1723         outputs = avfilter_inout_alloc();
1724         inputs  = avfilter_inout_alloc();
1725         if (!outputs || !inputs) {
1726             ret = AVERROR(ENOMEM);
1727             goto fail;
1728         }
1729
1730         outputs->name       = av_strdup("in");
1731         outputs->filter_ctx = source_ctx;
1732         outputs->pad_idx    = 0;
1733         outputs->next       = NULL;
1734
1735         inputs->name        = av_strdup("out");
1736         inputs->filter_ctx  = sink_ctx;
1737         inputs->pad_idx     = 0;
1738         inputs->next        = NULL;
1739
1740         if ((ret = avfilter_graph_parse_ptr(graph, filtergraph, &inputs, &outputs, NULL)) < 0)
1741             goto fail;
1742     } else {
1743         if ((ret = avfilter_link(source_ctx, 0, sink_ctx, 0)) < 0)
1744             goto fail;
1745     }
1746
1747     ret = avfilter_graph_config(graph, NULL);
1748 fail:
1749     avfilter_inout_free(&outputs);
1750     avfilter_inout_free(&inputs);
1751     return ret;
1752 }
1753
1754 static int configure_video_filters(AVFilterGraph *graph, VideoState *is, const char *vfilters, AVFrame *frame)
1755 {
1756     static const enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE };
1757     char sws_flags_str[128];
1758     char buffersrc_args[256];
1759     int ret;
1760     AVFilterContext *filt_src = NULL, *filt_out = NULL, *filt_crop;
1761     AVCodecContext *codec = is->video_st->codec;
1762     AVRational fr = av_guess_frame_rate(is->ic, is->video_st, NULL);
1763
1764     av_opt_get_int(sws_opts, "sws_flags", 0, &sws_flags);
1765     snprintf(sws_flags_str, sizeof(sws_flags_str), "flags=%"PRId64, sws_flags);
1766     graph->scale_sws_opts = av_strdup(sws_flags_str);
1767
1768     snprintf(buffersrc_args, sizeof(buffersrc_args),
1769              "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
1770              frame->width, frame->height, frame->format,
1771              is->video_st->time_base.num, is->video_st->time_base.den,
1772              codec->sample_aspect_ratio.num, FFMAX(codec->sample_aspect_ratio.den, 1));
1773     if (fr.num && fr.den)
1774         av_strlcatf(buffersrc_args, sizeof(buffersrc_args), ":frame_rate=%d/%d", fr.num, fr.den);
1775
1776     if ((ret = avfilter_graph_create_filter(&filt_src,
1777                                             avfilter_get_by_name("buffer"),
1778                                             "ffplay_buffer", buffersrc_args, NULL,
1779                                             graph)) < 0)
1780         goto fail;
1781
1782     ret = avfilter_graph_create_filter(&filt_out,
1783                                        avfilter_get_by_name("buffersink"),
1784                                        "ffplay_buffersink", NULL, NULL, graph);
1785     if (ret < 0)
1786         goto fail;
1787
1788     if ((ret = av_opt_set_int_list(filt_out, "pix_fmts", pix_fmts,  AV_PIX_FMT_NONE, AV_OPT_SEARCH_CHILDREN)) < 0)
1789         goto fail;
1790
1791     /* SDL YUV code is not handling odd width/height for some driver
1792      * combinations, therefore we crop the picture to an even width/height. */
1793     if ((ret = avfilter_graph_create_filter(&filt_crop,
1794                                             avfilter_get_by_name("crop"),
1795                                             "ffplay_crop", "floor(in_w/2)*2:floor(in_h/2)*2", NULL, graph)) < 0)
1796         goto fail;
1797     if ((ret = avfilter_link(filt_crop, 0, filt_out, 0)) < 0)
1798         goto fail;
1799
1800     if ((ret = configure_filtergraph(graph, vfilters, filt_src, filt_crop)) < 0)
1801         goto fail;
1802
1803     is->in_video_filter  = filt_src;
1804     is->out_video_filter = filt_out;
1805
1806 fail:
1807     return ret;
1808 }
1809
1810 static int configure_audio_filters(VideoState *is, const char *afilters, int force_output_format)
1811 {
1812     static const enum AVSampleFormat sample_fmts[] = { AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE };
1813     int sample_rates[2] = { 0, -1 };
1814     int64_t channel_layouts[2] = { 0, -1 };
1815     int channels[2] = { 0, -1 };
1816     AVFilterContext *filt_asrc = NULL, *filt_asink = NULL;
1817     char asrc_args[256];
1818     int ret;
1819
1820     avfilter_graph_free(&is->agraph);
1821     if (!(is->agraph = avfilter_graph_alloc()))
1822         return AVERROR(ENOMEM);
1823
1824     ret = snprintf(asrc_args, sizeof(asrc_args),
1825                    "sample_rate=%d:sample_fmt=%s:channels=%d:time_base=%d/%d",
1826                    is->audio_filter_src.freq, av_get_sample_fmt_name(is->audio_filter_src.fmt),
1827                    is->audio_filter_src.channels,
1828                    1, is->audio_filter_src.freq);
1829     if (is->audio_filter_src.channel_layout)
1830         snprintf(asrc_args + ret, sizeof(asrc_args) - ret,
1831                  ":channel_layout=0x%"PRIx64,  is->audio_filter_src.channel_layout);
1832
1833     ret = avfilter_graph_create_filter(&filt_asrc,
1834                                        avfilter_get_by_name("abuffer"), "ffplay_abuffer",
1835                                        asrc_args, NULL, is->agraph);
1836     if (ret < 0)
1837         goto end;
1838
1839
1840     ret = avfilter_graph_create_filter(&filt_asink,
1841                                        avfilter_get_by_name("abuffersink"), "ffplay_abuffersink",
1842                                        NULL, NULL, is->agraph);
1843     if (ret < 0)
1844         goto end;
1845
1846     if ((ret = av_opt_set_int_list(filt_asink, "sample_fmts", sample_fmts,  AV_SAMPLE_FMT_NONE, AV_OPT_SEARCH_CHILDREN)) < 0)
1847         goto end;
1848     if ((ret = av_opt_set_int(filt_asink, "all_channel_counts", 1, AV_OPT_SEARCH_CHILDREN)) < 0)
1849         goto end;
1850
1851     if (force_output_format) {
1852         channel_layouts[0] = is->audio_tgt.channel_layout;
1853         channels       [0] = is->audio_tgt.channels;
1854         sample_rates   [0] = is->audio_tgt.freq;
1855         if ((ret = av_opt_set_int(filt_asink, "all_channel_counts", 0, AV_OPT_SEARCH_CHILDREN)) < 0)
1856             goto end;
1857         if ((ret = av_opt_set_int_list(filt_asink, "channel_layouts", channel_layouts,  -1, AV_OPT_SEARCH_CHILDREN)) < 0)
1858             goto end;
1859         if ((ret = av_opt_set_int_list(filt_asink, "channel_counts" , channels       ,  -1, AV_OPT_SEARCH_CHILDREN)) < 0)
1860             goto end;
1861         if ((ret = av_opt_set_int_list(filt_asink, "sample_rates"   , sample_rates   ,  -1, AV_OPT_SEARCH_CHILDREN)) < 0)
1862             goto end;
1863     }
1864
1865
1866     if ((ret = configure_filtergraph(is->agraph, afilters, filt_asrc, filt_asink)) < 0)
1867         goto end;
1868
1869     is->in_audio_filter  = filt_asrc;
1870     is->out_audio_filter = filt_asink;
1871
1872 end:
1873     if (ret < 0)
1874         avfilter_graph_free(&is->agraph);
1875     return ret;
1876 }
1877 #endif  /* CONFIG_AVFILTER */
1878
1879 static int video_thread(void *arg)
1880 {
1881     AVPacket pkt = { 0 };
1882     VideoState *is = arg;
1883     AVFrame *frame = av_frame_alloc();
1884     double pts;
1885     int ret;
1886     int serial = 0;
1887
1888 #if CONFIG_AVFILTER
1889     AVFilterGraph *graph = avfilter_graph_alloc();
1890     AVFilterContext *filt_out = NULL, *filt_in = NULL;
1891     int last_w = 0;
1892     int last_h = 0;
1893     enum AVPixelFormat last_format = -2;
1894     int last_serial = -1;
1895 #endif
1896
1897     for (;;) {
1898         while (is->paused && !is->videoq.abort_request)
1899             SDL_Delay(10);
1900
1901         avcodec_get_frame_defaults(frame);
1902         av_free_packet(&pkt);
1903
1904         ret = get_video_frame(is, frame, &pkt, &serial);
1905         if (ret < 0)
1906             goto the_end;
1907         if (!ret)
1908             continue;
1909
1910 #if CONFIG_AVFILTER
1911         if (   last_w != frame->width
1912             || last_h != frame->height
1913             || last_format != frame->format
1914             || last_serial != serial) {
1915             av_log(NULL, AV_LOG_DEBUG,
1916                    "Video frame changed from size:%dx%d format:%s serial:%d to size:%dx%d format:%s serial:%d\n",
1917                    last_w, last_h,
1918                    (const char *)av_x_if_null(av_get_pix_fmt_name(last_format), "none"), last_serial,
1919                    frame->width, frame->height,
1920                    (const char *)av_x_if_null(av_get_pix_fmt_name(frame->format), "none"), serial);
1921             avfilter_graph_free(&graph);
1922             graph = avfilter_graph_alloc();
1923             if ((ret = configure_video_filters(graph, is, vfilters, frame)) < 0) {
1924                 SDL_Event event;
1925                 event.type = FF_QUIT_EVENT;
1926                 event.user.data1 = is;
1927                 SDL_PushEvent(&event);
1928                 av_free_packet(&pkt);
1929                 goto the_end;
1930             }
1931             filt_in  = is->in_video_filter;
1932             filt_out = is->out_video_filter;
1933             last_w = frame->width;
1934             last_h = frame->height;
1935             last_format = frame->format;
1936             last_serial = serial;
1937         }
1938
1939         ret = av_buffersrc_add_frame(filt_in, frame);
1940         if (ret < 0)
1941             goto the_end;
1942         av_frame_unref(frame);
1943         avcodec_get_frame_defaults(frame);
1944         av_free_packet(&pkt);
1945
1946         while (ret >= 0) {
1947             is->frame_last_returned_time = av_gettime() / 1000000.0;
1948
1949             ret = av_buffersink_get_frame_flags(filt_out, frame, 0);
1950             if (ret < 0) {
1951                 ret = 0;
1952                 break;
1953             }
1954
1955             is->frame_last_filter_delay = av_gettime() / 1000000.0 - is->frame_last_returned_time;
1956             if (fabs(is->frame_last_filter_delay) > AV_NOSYNC_THRESHOLD / 10.0)
1957                 is->frame_last_filter_delay = 0;
1958
1959             pts = (frame->pts == AV_NOPTS_VALUE) ? NAN : frame->pts * av_q2d(filt_out->inputs[0]->time_base);
1960             ret = queue_picture(is, frame, pts, av_frame_get_pkt_pos(frame), serial);
1961             av_frame_unref(frame);
1962         }
1963 #else
1964         pts = (frame->pts == AV_NOPTS_VALUE) ? NAN : frame->pts * av_q2d(is->video_st->time_base);
1965         ret = queue_picture(is, frame, pts, pkt.pos, serial);
1966         av_frame_unref(frame);
1967 #endif
1968
1969         if (ret < 0)
1970             goto the_end;
1971     }
1972  the_end:
1973     avcodec_flush_buffers(is->video_st->codec);
1974 #if CONFIG_AVFILTER
1975     avfilter_graph_free(&graph);
1976 #endif
1977     av_free_packet(&pkt);
1978     av_frame_free(&frame);
1979     return 0;
1980 }
1981
1982 static int subtitle_thread(void *arg)
1983 {
1984     VideoState *is = arg;
1985     SubPicture *sp;
1986     AVPacket pkt1, *pkt = &pkt1;
1987     int got_subtitle;
1988     int serial;
1989     double pts;
1990     int i, j;
1991     int r, g, b, y, u, v, a;
1992
1993     for (;;) {
1994         while (is->paused && !is->subtitleq.abort_request) {
1995             SDL_Delay(10);
1996         }
1997         if (packet_queue_get(&is->subtitleq, pkt, 1, &serial) < 0)
1998             break;
1999
2000         if (pkt->data == flush_pkt.data) {
2001             avcodec_flush_buffers(is->subtitle_st->codec);
2002             continue;
2003         }
2004         SDL_LockMutex(is->subpq_mutex);
2005         while (is->subpq_size >= SUBPICTURE_QUEUE_SIZE &&
2006                !is->subtitleq.abort_request) {
2007             SDL_CondWait(is->subpq_cond, is->subpq_mutex);
2008         }
2009         SDL_UnlockMutex(is->subpq_mutex);
2010
2011         if (is->subtitleq.abort_request)
2012             return 0;
2013
2014         sp = &is->subpq[is->subpq_windex];
2015
2016        /* NOTE: ipts is the PTS of the _first_ picture beginning in
2017            this packet, if any */
2018         pts = 0;
2019         if (pkt->pts != AV_NOPTS_VALUE)
2020             pts = av_q2d(is->subtitle_st->time_base) * pkt->pts;
2021
2022         avcodec_decode_subtitle2(is->subtitle_st->codec, &sp->sub,
2023                                  &got_subtitle, pkt);
2024         if (got_subtitle && sp->sub.format == 0) {
2025             if (sp->sub.pts != AV_NOPTS_VALUE)
2026                 pts = sp->sub.pts / (double)AV_TIME_BASE;
2027             sp->pts = pts;
2028             sp->serial = serial;
2029
2030             for (i = 0; i < sp->sub.num_rects; i++)
2031             {
2032                 for (j = 0; j < sp->sub.rects[i]->nb_colors; j++)
2033                 {
2034                     RGBA_IN(r, g, b, a, (uint32_t*)sp->sub.rects[i]->pict.data[1] + j);
2035                     y = RGB_TO_Y_CCIR(r, g, b);
2036                     u = RGB_TO_U_CCIR(r, g, b, 0);
2037                     v = RGB_TO_V_CCIR(r, g, b, 0);
2038                     YUVA_OUT((uint32_t*)sp->sub.rects[i]->pict.data[1] + j, y, u, v, a);
2039                 }
2040             }
2041
2042             /* now we can update the picture count */
2043             if (++is->subpq_windex == SUBPICTURE_QUEUE_SIZE)
2044                 is->subpq_windex = 0;
2045             SDL_LockMutex(is->subpq_mutex);
2046             is->subpq_size++;
2047             SDL_UnlockMutex(is->subpq_mutex);
2048         }
2049         av_free_packet(pkt);
2050     }
2051     return 0;
2052 }
2053
2054 /* copy samples for viewing in editor window */
2055 static void update_sample_display(VideoState *is, short *samples, int samples_size)
2056 {
2057     int size, len;
2058
2059     size = samples_size / sizeof(short);
2060     while (size > 0) {
2061         len = SAMPLE_ARRAY_SIZE - is->sample_array_index;
2062         if (len > size)
2063             len = size;
2064         memcpy(is->sample_array + is->sample_array_index, samples, len * sizeof(short));
2065         samples += len;
2066         is->sample_array_index += len;
2067         if (is->sample_array_index >= SAMPLE_ARRAY_SIZE)
2068             is->sample_array_index = 0;
2069         size -= len;
2070     }
2071 }
2072
2073 /* return the wanted number of samples to get better sync if sync_type is video
2074  * or external master clock */
2075 static int synchronize_audio(VideoState *is, int nb_samples)
2076 {
2077     int wanted_nb_samples = nb_samples;
2078
2079     /* if not master, then we try to remove or add samples to correct the clock */
2080     if (get_master_sync_type(is) != AV_SYNC_AUDIO_MASTER) {
2081         double diff, avg_diff;
2082         int min_nb_samples, max_nb_samples;
2083
2084         diff = get_clock(&is->audclk) - get_master_clock(is);
2085
2086         if (!isnan(diff) && fabs(diff) < AV_NOSYNC_THRESHOLD) {
2087             is->audio_diff_cum = diff + is->audio_diff_avg_coef * is->audio_diff_cum;
2088             if (is->audio_diff_avg_count < AUDIO_DIFF_AVG_NB) {
2089                 /* not enough measures to have a correct estimate */
2090                 is->audio_diff_avg_count++;
2091             } else {
2092                 /* estimate the A-V difference */
2093                 avg_diff = is->audio_diff_cum * (1.0 - is->audio_diff_avg_coef);
2094
2095                 if (fabs(avg_diff) >= is->audio_diff_threshold) {
2096                     wanted_nb_samples = nb_samples + (int)(diff * is->audio_src.freq);
2097                     min_nb_samples = ((nb_samples * (100 - SAMPLE_CORRECTION_PERCENT_MAX) / 100));
2098                     max_nb_samples = ((nb_samples * (100 + SAMPLE_CORRECTION_PERCENT_MAX) / 100));
2099                     wanted_nb_samples = FFMIN(FFMAX(wanted_nb_samples, min_nb_samples), max_nb_samples);
2100                 }
2101                 av_dlog(NULL, "diff=%f adiff=%f sample_diff=%d apts=%0.3f %f\n",
2102                         diff, avg_diff, wanted_nb_samples - nb_samples,
2103                         is->audio_clock, is->audio_diff_threshold);
2104             }
2105         } else {
2106             /* too big difference : may be initial PTS errors, so
2107                reset A-V filter */
2108             is->audio_diff_avg_count = 0;
2109             is->audio_diff_cum       = 0;
2110         }
2111     }
2112
2113     return wanted_nb_samples;
2114 }
2115
2116 /**
2117  * Decode one audio frame and return its uncompressed size.
2118  *
2119  * The processed audio frame is decoded, converted if required, and
2120  * stored in is->audio_buf, with size in bytes given by the return
2121  * value.
2122  */
2123 static int audio_decode_frame(VideoState *is)
2124 {
2125     AVPacket *pkt_temp = &is->audio_pkt_temp;
2126     AVPacket *pkt = &is->audio_pkt;
2127     AVCodecContext *dec = is->audio_st->codec;
2128     int len1, data_size, resampled_data_size;
2129     int64_t dec_channel_layout;
2130     int got_frame;
2131     av_unused double audio_clock0;
2132     int wanted_nb_samples;
2133     AVRational tb;
2134     int ret;
2135     int reconfigure;
2136
2137     for (;;) {
2138         /* NOTE: the audio packet can contain several frames */
2139         while (pkt_temp->stream_index != -1 || is->audio_buf_frames_pending) {
2140             if (!is->frame) {
2141                 if (!(is->frame = avcodec_alloc_frame()))
2142                     return AVERROR(ENOMEM);
2143             } else {
2144                 av_frame_unref(is->frame);
2145                 avcodec_get_frame_defaults(is->frame);
2146             }
2147
2148             if (is->audioq.serial != is->audio_pkt_temp_serial)
2149                 break;
2150
2151             if (is->paused)
2152                 return -1;
2153
2154             if (!is->audio_buf_frames_pending) {
2155                 len1 = avcodec_decode_audio4(dec, is->frame, &got_frame, pkt_temp);
2156                 if (len1 < 0) {
2157                     /* if error, we skip the frame */
2158                     pkt_temp->size = 0;
2159                     break;
2160                 }
2161
2162                 pkt_temp->dts =
2163                 pkt_temp->pts = AV_NOPTS_VALUE;
2164                 pkt_temp->data += len1;
2165                 pkt_temp->size -= len1;
2166                 if (pkt_temp->data && pkt_temp->size <= 0 || !pkt_temp->data && !got_frame)
2167                     pkt_temp->stream_index = -1;
2168
2169                 if (!got_frame)
2170                     continue;
2171
2172                 tb = (AVRational){1, is->frame->sample_rate};
2173                 if (is->frame->pts != AV_NOPTS_VALUE)
2174                     is->frame->pts = av_rescale_q(is->frame->pts, dec->time_base, tb);
2175                 else if (is->frame->pkt_pts != AV_NOPTS_VALUE)
2176                     is->frame->pts = av_rescale_q(is->frame->pkt_pts, is->audio_st->time_base, tb);
2177                 else if (is->audio_frame_next_pts != AV_NOPTS_VALUE)
2178 #if CONFIG_AVFILTER
2179                     is->frame->pts = av_rescale_q(is->audio_frame_next_pts, (AVRational){1, is->audio_filter_src.freq}, tb);
2180 #else
2181                     is->frame->pts = av_rescale_q(is->audio_frame_next_pts, (AVRational){1, is->audio_src.freq}, tb);
2182 #endif
2183
2184                 if (is->frame->pts != AV_NOPTS_VALUE)
2185                     is->audio_frame_next_pts = is->frame->pts + is->frame->nb_samples;
2186
2187 #if CONFIG_AVFILTER
2188                 dec_channel_layout = get_valid_channel_layout(is->frame->channel_layout, av_frame_get_channels(is->frame));
2189
2190                 reconfigure =
2191                     cmp_audio_fmts(is->audio_filter_src.fmt, is->audio_filter_src.channels,
2192                                    is->frame->format, av_frame_get_channels(is->frame))    ||
2193                     is->audio_filter_src.channel_layout != dec_channel_layout ||
2194                     is->audio_filter_src.freq           != is->frame->sample_rate ||
2195                     is->audio_pkt_temp_serial           != is->audio_last_serial;
2196
2197                 if (reconfigure) {
2198                     char buf1[1024], buf2[1024];
2199                     av_get_channel_layout_string(buf1, sizeof(buf1), -1, is->audio_filter_src.channel_layout);
2200                     av_get_channel_layout_string(buf2, sizeof(buf2), -1, dec_channel_layout);
2201                     av_log(NULL, AV_LOG_DEBUG,
2202                            "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",
2203                            is->audio_filter_src.freq, is->audio_filter_src.channels, av_get_sample_fmt_name(is->audio_filter_src.fmt), buf1, is->audio_last_serial,
2204                            is->frame->sample_rate, av_frame_get_channels(is->frame), av_get_sample_fmt_name(is->frame->format), buf2, is->audio_pkt_temp_serial);
2205
2206                     is->audio_filter_src.fmt            = is->frame->format;
2207                     is->audio_filter_src.channels       = av_frame_get_channels(is->frame);
2208                     is->audio_filter_src.channel_layout = dec_channel_layout;
2209                     is->audio_filter_src.freq           = is->frame->sample_rate;
2210                     is->audio_last_serial               = is->audio_pkt_temp_serial;
2211
2212                     if ((ret = configure_audio_filters(is, afilters, 1)) < 0)
2213                         return ret;
2214                 }
2215
2216                 if ((ret = av_buffersrc_add_frame(is->in_audio_filter, is->frame)) < 0)
2217                     return ret;
2218                 av_frame_unref(is->frame);
2219 #endif
2220             }
2221 #if CONFIG_AVFILTER
2222             if ((ret = av_buffersink_get_frame_flags(is->out_audio_filter, is->frame, 0)) < 0) {
2223                 if (ret == AVERROR(EAGAIN)) {
2224                     is->audio_buf_frames_pending = 0;
2225                     continue;
2226                 }
2227                 return ret;
2228             }
2229             is->audio_buf_frames_pending = 1;
2230             tb = is->out_audio_filter->inputs[0]->time_base;
2231 #endif
2232
2233             data_size = av_samples_get_buffer_size(NULL, av_frame_get_channels(is->frame),
2234                                                    is->frame->nb_samples,
2235                                                    is->frame->format, 1);
2236
2237             dec_channel_layout =
2238                 (is->frame->channel_layout && av_frame_get_channels(is->frame) == av_get_channel_layout_nb_channels(is->frame->channel_layout)) ?
2239                 is->frame->channel_layout : av_get_default_channel_layout(av_frame_get_channels(is->frame));
2240             wanted_nb_samples = synchronize_audio(is, is->frame->nb_samples);
2241
2242             if (is->frame->format        != is->audio_src.fmt            ||
2243                 dec_channel_layout       != is->audio_src.channel_layout ||
2244                 is->frame->sample_rate   != is->audio_src.freq           ||
2245                 (wanted_nb_samples       != is->frame->nb_samples && !is->swr_ctx)) {
2246                 swr_free(&is->swr_ctx);
2247                 is->swr_ctx = swr_alloc_set_opts(NULL,
2248                                                  is->audio_tgt.channel_layout, is->audio_tgt.fmt, is->audio_tgt.freq,
2249                                                  dec_channel_layout,           is->frame->format, is->frame->sample_rate,
2250                                                  0, NULL);
2251                 if (!is->swr_ctx || swr_init(is->swr_ctx) < 0) {
2252                     av_log(NULL, AV_LOG_ERROR,
2253                            "Cannot create sample rate converter for conversion of %d Hz %s %d channels to %d Hz %s %d channels!\n",
2254                             is->frame->sample_rate, av_get_sample_fmt_name(is->frame->format), av_frame_get_channels(is->frame),
2255                             is->audio_tgt.freq, av_get_sample_fmt_name(is->audio_tgt.fmt), is->audio_tgt.channels);
2256                     break;
2257                 }
2258                 is->audio_src.channel_layout = dec_channel_layout;
2259                 is->audio_src.channels       = av_frame_get_channels(is->frame);
2260                 is->audio_src.freq = is->frame->sample_rate;
2261                 is->audio_src.fmt = is->frame->format;
2262             }
2263
2264             if (is->swr_ctx) {
2265                 const uint8_t **in = (const uint8_t **)is->frame->extended_data;
2266                 uint8_t **out = &is->audio_buf1;
2267                 int out_count = (int64_t)wanted_nb_samples * is->audio_tgt.freq / is->frame->sample_rate + 256;
2268                 int out_size  = av_samples_get_buffer_size(NULL, is->audio_tgt.channels, out_count, is->audio_tgt.fmt, 0);
2269                 int len2;
2270                 if (out_size < 0) {
2271                     av_log(NULL, AV_LOG_ERROR, "av_samples_get_buffer_size() failed\n");
2272                     break;
2273                 }
2274                 if (wanted_nb_samples != is->frame->nb_samples) {
2275                     if (swr_set_compensation(is->swr_ctx, (wanted_nb_samples - is->frame->nb_samples) * is->audio_tgt.freq / is->frame->sample_rate,
2276                                                 wanted_nb_samples * is->audio_tgt.freq / is->frame->sample_rate) < 0) {
2277                         av_log(NULL, AV_LOG_ERROR, "swr_set_compensation() failed\n");
2278                         break;
2279                     }
2280                 }
2281                 av_fast_malloc(&is->audio_buf1, &is->audio_buf1_size, out_size);
2282                 if (!is->audio_buf1)
2283                     return AVERROR(ENOMEM);
2284                 len2 = swr_convert(is->swr_ctx, out, out_count, in, is->frame->nb_samples);
2285                 if (len2 < 0) {
2286                     av_log(NULL, AV_LOG_ERROR, "swr_convert() failed\n");
2287                     break;
2288                 }
2289                 if (len2 == out_count) {
2290                     av_log(NULL, AV_LOG_WARNING, "audio buffer is probably too small\n");
2291                     swr_init(is->swr_ctx);
2292                 }
2293                 is->audio_buf = is->audio_buf1;
2294                 resampled_data_size = len2 * is->audio_tgt.channels * av_get_bytes_per_sample(is->audio_tgt.fmt);
2295             } else {
2296                 is->audio_buf = is->frame->data[0];
2297                 resampled_data_size = data_size;
2298             }
2299
2300             audio_clock0 = is->audio_clock;
2301             /* update the audio clock with the pts */
2302             if (is->frame->pts != AV_NOPTS_VALUE)
2303                 is->audio_clock = is->frame->pts * av_q2d(tb) + (double) is->frame->nb_samples / is->frame->sample_rate;
2304             else
2305                 is->audio_clock = NAN;
2306             is->audio_clock_serial = is->audio_pkt_temp_serial;
2307 #ifdef DEBUG
2308             {
2309                 static double last_clock;
2310                 printf("audio: delay=%0.3f clock=%0.3f clock0=%0.3f\n",
2311                        is->audio_clock - last_clock,
2312                        is->audio_clock, audio_clock0);
2313                 last_clock = is->audio_clock;
2314             }
2315 #endif
2316             return resampled_data_size;
2317         }
2318
2319         /* free the current packet */
2320         if (pkt->data)
2321             av_free_packet(pkt);
2322         memset(pkt_temp, 0, sizeof(*pkt_temp));
2323         pkt_temp->stream_index = -1;
2324
2325         if (is->audioq.abort_request) {
2326             return -1;
2327         }
2328
2329         if (is->audioq.nb_packets == 0)
2330             SDL_CondSignal(is->continue_read_thread);
2331
2332         /* read next packet */
2333         if ((packet_queue_get(&is->audioq, pkt, 1, &is->audio_pkt_temp_serial)) < 0)
2334             return -1;
2335
2336         if (pkt->data == flush_pkt.data) {
2337             avcodec_flush_buffers(dec);
2338             is->audio_buf_frames_pending = 0;
2339             is->audio_frame_next_pts = AV_NOPTS_VALUE;
2340             if ((is->ic->iformat->flags & (AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK)) && !is->ic->iformat->read_seek)
2341                 is->audio_frame_next_pts = is->audio_st->start_time;
2342         }
2343
2344         *pkt_temp = *pkt;
2345     }
2346 }
2347
2348 /* prepare a new audio buffer */
2349 static void sdl_audio_callback(void *opaque, Uint8 *stream, int len)
2350 {
2351     VideoState *is = opaque;
2352     int audio_size, len1;
2353     int bytes_per_sec;
2354     int frame_size = av_samples_get_buffer_size(NULL, is->audio_tgt.channels, 1, is->audio_tgt.fmt, 1);
2355
2356     audio_callback_time = av_gettime();
2357
2358     while (len > 0) {
2359         if (is->audio_buf_index >= is->audio_buf_size) {
2360            audio_size = audio_decode_frame(is);
2361            if (audio_size < 0) {
2362                 /* if error, just output silence */
2363                is->audio_buf      = is->silence_buf;
2364                is->audio_buf_size = sizeof(is->silence_buf) / frame_size * frame_size;
2365            } else {
2366                if (is->show_mode != SHOW_MODE_VIDEO)
2367                    update_sample_display(is, (int16_t *)is->audio_buf, audio_size);
2368                is->audio_buf_size = audio_size;
2369            }
2370            is->audio_buf_index = 0;
2371         }
2372         len1 = is->audio_buf_size - is->audio_buf_index;
2373         if (len1 > len)
2374             len1 = len;
2375         memcpy(stream, (uint8_t *)is->audio_buf + is->audio_buf_index, len1);
2376         len -= len1;
2377         stream += len1;
2378         is->audio_buf_index += len1;
2379     }
2380     bytes_per_sec = is->audio_tgt.freq * is->audio_tgt.channels * av_get_bytes_per_sample(is->audio_tgt.fmt);
2381     is->audio_write_buf_size = is->audio_buf_size - is->audio_buf_index;
2382     /* Let's assume the audio driver that is used by SDL has two periods. */
2383     if (!isnan(is->audio_clock)) {
2384         set_clock_at(&is->audclk, is->audio_clock - (double)(2 * is->audio_hw_buf_size + is->audio_write_buf_size) / bytes_per_sec, is->audio_clock_serial, audio_callback_time / 1000000.0);
2385         sync_clock_to_slave(&is->extclk, &is->audclk);
2386     }
2387 }
2388
2389 static int audio_open(void *opaque, int64_t wanted_channel_layout, int wanted_nb_channels, int wanted_sample_rate, struct AudioParams *audio_hw_params)
2390 {
2391     SDL_AudioSpec wanted_spec, spec;
2392     const char *env;
2393     const int next_nb_channels[] = {0, 0, 1, 6, 2, 6, 4, 6};
2394
2395     env = SDL_getenv("SDL_AUDIO_CHANNELS");
2396     if (env) {
2397         wanted_nb_channels = atoi(env);
2398         wanted_channel_layout = av_get_default_channel_layout(wanted_nb_channels);
2399     }
2400     if (!wanted_channel_layout || wanted_nb_channels != av_get_channel_layout_nb_channels(wanted_channel_layout)) {
2401         wanted_channel_layout = av_get_default_channel_layout(wanted_nb_channels);
2402         wanted_channel_layout &= ~AV_CH_LAYOUT_STEREO_DOWNMIX;
2403     }
2404     wanted_spec.channels = av_get_channel_layout_nb_channels(wanted_channel_layout);
2405     wanted_spec.freq = wanted_sample_rate;
2406     if (wanted_spec.freq <= 0 || wanted_spec.channels <= 0) {
2407         av_log(NULL, AV_LOG_ERROR, "Invalid sample rate or channel count!\n");
2408         return -1;
2409     }
2410     wanted_spec.format = AUDIO_S16SYS;
2411     wanted_spec.silence = 0;
2412     wanted_spec.samples = SDL_AUDIO_BUFFER_SIZE;
2413     wanted_spec.callback = sdl_audio_callback;
2414     wanted_spec.userdata = opaque;
2415     while (SDL_OpenAudio(&wanted_spec, &spec) < 0) {
2416         av_log(NULL, AV_LOG_WARNING, "SDL_OpenAudio (%d channels): %s\n", wanted_spec.channels, SDL_GetError());
2417         wanted_spec.channels = next_nb_channels[FFMIN(7, wanted_spec.channels)];
2418         if (!wanted_spec.channels) {
2419             av_log(NULL, AV_LOG_ERROR,
2420                    "No more channel combinations to try, audio open failed\n");
2421             return -1;
2422         }
2423         wanted_channel_layout = av_get_default_channel_layout(wanted_spec.channels);
2424     }
2425     if (spec.format != AUDIO_S16SYS) {
2426         av_log(NULL, AV_LOG_ERROR,
2427                "SDL advised audio format %d is not supported!\n", spec.format);
2428         return -1;
2429     }
2430     if (spec.channels != wanted_spec.channels) {
2431         wanted_channel_layout = av_get_default_channel_layout(spec.channels);
2432         if (!wanted_channel_layout) {
2433             av_log(NULL, AV_LOG_ERROR,
2434                    "SDL advised channel count %d is not supported!\n", spec.channels);
2435             return -1;
2436         }
2437     }
2438
2439     audio_hw_params->fmt = AV_SAMPLE_FMT_S16;
2440     audio_hw_params->freq = spec.freq;
2441     audio_hw_params->channel_layout = wanted_channel_layout;
2442     audio_hw_params->channels =  spec.channels;
2443     return spec.size;
2444 }
2445
2446 /* open a given stream. Return 0 if OK */
2447 static int stream_component_open(VideoState *is, int stream_index)
2448 {
2449     AVFormatContext *ic = is->ic;
2450     AVCodecContext *avctx;
2451     AVCodec *codec;
2452     const char *forced_codec_name = NULL;
2453     AVDictionary *opts;
2454     AVDictionaryEntry *t = NULL;
2455     int sample_rate, nb_channels;
2456     int64_t channel_layout;
2457     int ret;
2458
2459     if (stream_index < 0 || stream_index >= ic->nb_streams)
2460         return -1;
2461     avctx = ic->streams[stream_index]->codec;
2462
2463     codec = avcodec_find_decoder(avctx->codec_id);
2464
2465     switch(avctx->codec_type){
2466         case AVMEDIA_TYPE_AUDIO   : is->last_audio_stream    = stream_index; forced_codec_name =    audio_codec_name; break;
2467         case AVMEDIA_TYPE_SUBTITLE: is->last_subtitle_stream = stream_index; forced_codec_name = subtitle_codec_name; break;
2468         case AVMEDIA_TYPE_VIDEO   : is->last_video_stream    = stream_index; forced_codec_name =    video_codec_name; break;
2469     }
2470     if (forced_codec_name)
2471         codec = avcodec_find_decoder_by_name(forced_codec_name);
2472     if (!codec) {
2473         if (forced_codec_name) av_log(NULL, AV_LOG_WARNING,
2474                                       "No codec could be found with name '%s'\n", forced_codec_name);
2475         else                   av_log(NULL, AV_LOG_WARNING,
2476                                       "No codec could be found with id %d\n", avctx->codec_id);
2477         return -1;
2478     }
2479
2480     avctx->codec_id = codec->id;
2481     avctx->workaround_bugs   = workaround_bugs;
2482     avctx->lowres            = lowres;
2483     if(avctx->lowres > codec->max_lowres){
2484         av_log(avctx, AV_LOG_WARNING, "The maximum value for lowres supported by the decoder is %d\n",
2485                 codec->max_lowres);
2486         avctx->lowres= codec->max_lowres;
2487     }
2488     avctx->error_concealment = error_concealment;
2489
2490     if(avctx->lowres) avctx->flags |= CODEC_FLAG_EMU_EDGE;
2491     if (fast)   avctx->flags2 |= CODEC_FLAG2_FAST;
2492     if(codec->capabilities & CODEC_CAP_DR1)
2493         avctx->flags |= CODEC_FLAG_EMU_EDGE;
2494
2495     opts = filter_codec_opts(codec_opts, avctx->codec_id, ic, ic->streams[stream_index], codec);
2496     if (!av_dict_get(opts, "threads", NULL, 0))
2497         av_dict_set(&opts, "threads", "auto", 0);
2498     if (avctx->lowres)
2499         av_dict_set(&opts, "lowres", av_asprintf("%d", avctx->lowres), AV_DICT_DONT_STRDUP_VAL);
2500     if (avctx->codec_type == AVMEDIA_TYPE_VIDEO || avctx->codec_type == AVMEDIA_TYPE_AUDIO)
2501         av_dict_set(&opts, "refcounted_frames", "1", 0);
2502     if (avcodec_open2(avctx, codec, &opts) < 0)
2503         return -1;
2504     if ((t = av_dict_get(opts, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
2505         av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
2506         return AVERROR_OPTION_NOT_FOUND;
2507     }
2508
2509     ic->streams[stream_index]->discard = AVDISCARD_DEFAULT;
2510     switch (avctx->codec_type) {
2511     case AVMEDIA_TYPE_AUDIO:
2512 #if CONFIG_AVFILTER
2513         {
2514             AVFilterLink *link;
2515
2516             is->audio_filter_src.freq           = avctx->sample_rate;
2517             is->audio_filter_src.channels       = avctx->channels;
2518             is->audio_filter_src.channel_layout = get_valid_channel_layout(avctx->channel_layout, avctx->channels);
2519             is->audio_filter_src.fmt            = avctx->sample_fmt;
2520             if ((ret = configure_audio_filters(is, afilters, 0)) < 0)
2521                 return ret;
2522             link = is->out_audio_filter->inputs[0];
2523             sample_rate    = link->sample_rate;
2524             nb_channels    = link->channels;
2525             channel_layout = link->channel_layout;
2526         }
2527 #else
2528         sample_rate    = avctx->sample_rate;
2529         nb_channels    = avctx->channels;
2530         channel_layout = avctx->channel_layout;
2531 #endif
2532
2533         /* prepare audio output */
2534         if ((ret = audio_open(is, channel_layout, nb_channels, sample_rate, &is->audio_tgt)) < 0)
2535             return ret;
2536         is->audio_hw_buf_size = ret;
2537         is->audio_src = is->audio_tgt;
2538         is->audio_buf_size  = 0;
2539         is->audio_buf_index = 0;
2540
2541         /* init averaging filter */
2542         is->audio_diff_avg_coef  = exp(log(0.01) / AUDIO_DIFF_AVG_NB);
2543         is->audio_diff_avg_count = 0;
2544         /* since we do not have a precise anough audio fifo fullness,
2545            we correct audio sync only if larger than this threshold */
2546         is->audio_diff_threshold = 2.0 * is->audio_hw_buf_size / av_samples_get_buffer_size(NULL, is->audio_tgt.channels, is->audio_tgt.freq, is->audio_tgt.fmt, 1);
2547
2548         memset(&is->audio_pkt, 0, sizeof(is->audio_pkt));
2549         memset(&is->audio_pkt_temp, 0, sizeof(is->audio_pkt_temp));
2550         is->audio_pkt_temp.stream_index = -1;
2551
2552         is->audio_stream = stream_index;
2553         is->audio_st = ic->streams[stream_index];
2554
2555         packet_queue_start(&is->audioq);
2556         SDL_PauseAudio(0);
2557         break;
2558     case AVMEDIA_TYPE_VIDEO:
2559         is->video_stream = stream_index;
2560         is->video_st = ic->streams[stream_index];
2561
2562         packet_queue_start(&is->videoq);
2563         is->video_tid = SDL_CreateThread(video_thread, is);
2564         is->queue_attachments_req = 1;
2565         break;
2566     case AVMEDIA_TYPE_SUBTITLE:
2567         is->subtitle_stream = stream_index;
2568         is->subtitle_st = ic->streams[stream_index];
2569         packet_queue_start(&is->subtitleq);
2570
2571         is->subtitle_tid = SDL_CreateThread(subtitle_thread, is);
2572         break;
2573     default:
2574         break;
2575     }
2576     return 0;
2577 }
2578
2579 static void stream_component_close(VideoState *is, int stream_index)
2580 {
2581     AVFormatContext *ic = is->ic;
2582     AVCodecContext *avctx;
2583
2584     if (stream_index < 0 || stream_index >= ic->nb_streams)
2585         return;
2586     avctx = ic->streams[stream_index]->codec;
2587
2588     switch (avctx->codec_type) {
2589     case AVMEDIA_TYPE_AUDIO:
2590         packet_queue_abort(&is->audioq);
2591
2592         SDL_CloseAudio();
2593
2594         packet_queue_flush(&is->audioq);
2595         av_free_packet(&is->audio_pkt);
2596         swr_free(&is->swr_ctx);
2597         av_freep(&is->audio_buf1);
2598         is->audio_buf1_size = 0;
2599         is->audio_buf = NULL;
2600         av_frame_free(&is->frame);
2601
2602         if (is->rdft) {
2603             av_rdft_end(is->rdft);
2604             av_freep(&is->rdft_data);
2605             is->rdft = NULL;
2606             is->rdft_bits = 0;
2607         }
2608 #if CONFIG_AVFILTER
2609         avfilter_graph_free(&is->agraph);
2610 #endif
2611         break;
2612     case AVMEDIA_TYPE_VIDEO:
2613         packet_queue_abort(&is->videoq);
2614
2615         /* note: we also signal this mutex to make sure we deblock the
2616            video thread in all cases */
2617         SDL_LockMutex(is->pictq_mutex);
2618         SDL_CondSignal(is->pictq_cond);
2619         SDL_UnlockMutex(is->pictq_mutex);
2620
2621         SDL_WaitThread(is->video_tid, NULL);
2622
2623         packet_queue_flush(&is->videoq);
2624         break;
2625     case AVMEDIA_TYPE_SUBTITLE:
2626         packet_queue_abort(&is->subtitleq);
2627
2628         /* note: we also signal this mutex to make sure we deblock the
2629            video thread in all cases */
2630         SDL_LockMutex(is->subpq_mutex);
2631         SDL_CondSignal(is->subpq_cond);
2632         SDL_UnlockMutex(is->subpq_mutex);
2633
2634         SDL_WaitThread(is->subtitle_tid, NULL);
2635
2636         packet_queue_flush(&is->subtitleq);
2637         break;
2638     default:
2639         break;
2640     }
2641
2642     ic->streams[stream_index]->discard = AVDISCARD_ALL;
2643     avcodec_close(avctx);
2644     switch (avctx->codec_type) {
2645     case AVMEDIA_TYPE_AUDIO:
2646         is->audio_st = NULL;
2647         is->audio_stream = -1;
2648         break;
2649     case AVMEDIA_TYPE_VIDEO:
2650         is->video_st = NULL;
2651         is->video_stream = -1;
2652         break;
2653     case AVMEDIA_TYPE_SUBTITLE:
2654         is->subtitle_st = NULL;
2655         is->subtitle_stream = -1;
2656         break;
2657     default:
2658         break;
2659     }
2660 }
2661
2662 static int decode_interrupt_cb(void *ctx)
2663 {
2664     VideoState *is = ctx;
2665     return is->abort_request;
2666 }
2667
2668 static int is_realtime(AVFormatContext *s)
2669 {
2670     if(   !strcmp(s->iformat->name, "rtp")
2671        || !strcmp(s->iformat->name, "rtsp")
2672        || !strcmp(s->iformat->name, "sdp")
2673     )
2674         return 1;
2675
2676     if(s->pb && (   !strncmp(s->filename, "rtp:", 4)
2677                  || !strncmp(s->filename, "udp:", 4)
2678                 )
2679     )
2680         return 1;
2681     return 0;
2682 }
2683
2684 /* this thread gets the stream from the disk or the network */
2685 static int read_thread(void *arg)
2686 {
2687     VideoState *is = arg;
2688     AVFormatContext *ic = NULL;
2689     int err, i, ret;
2690     int st_index[AVMEDIA_TYPE_NB];
2691     AVPacket pkt1, *pkt = &pkt1;
2692     int eof = 0;
2693     int64_t stream_start_time;
2694     int pkt_in_play_range = 0;
2695     AVDictionaryEntry *t;
2696     AVDictionary **opts;
2697     int orig_nb_streams;
2698     SDL_mutex *wait_mutex = SDL_CreateMutex();
2699
2700     memset(st_index, -1, sizeof(st_index));
2701     is->last_video_stream = is->video_stream = -1;
2702     is->last_audio_stream = is->audio_stream = -1;
2703     is->last_subtitle_stream = is->subtitle_stream = -1;
2704
2705     ic = avformat_alloc_context();
2706     ic->interrupt_callback.callback = decode_interrupt_cb;
2707     ic->interrupt_callback.opaque = is;
2708     err = avformat_open_input(&ic, is->filename, is->iformat, &format_opts);
2709     if (err < 0) {
2710         print_error(is->filename, err);
2711         ret = -1;
2712         goto fail;
2713     }
2714     if ((t = av_dict_get(format_opts, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
2715         av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
2716         ret = AVERROR_OPTION_NOT_FOUND;
2717         goto fail;
2718     }
2719     is->ic = ic;
2720
2721     if (genpts)
2722         ic->flags |= AVFMT_FLAG_GENPTS;
2723
2724     opts = setup_find_stream_info_opts(ic, codec_opts);
2725     orig_nb_streams = ic->nb_streams;
2726
2727     err = avformat_find_stream_info(ic, opts);
2728     if (err < 0) {
2729         av_log(NULL, AV_LOG_WARNING,
2730                "%s: could not find codec parameters\n", is->filename);
2731         ret = -1;
2732         goto fail;
2733     }
2734     for (i = 0; i < orig_nb_streams; i++)
2735         av_dict_free(&opts[i]);
2736     av_freep(&opts);
2737
2738     if (ic->pb)
2739         ic->pb->eof_reached = 0; // FIXME hack, ffplay maybe should not use url_feof() to test for the end
2740
2741     if (seek_by_bytes < 0)
2742         seek_by_bytes = !!(ic->iformat->flags & AVFMT_TS_DISCONT) && strcmp("ogg", ic->iformat->name);
2743
2744     is->max_frame_duration = (ic->iformat->flags & AVFMT_TS_DISCONT) ? 10.0 : 3600.0;
2745
2746     if (!window_title && (t = av_dict_get(ic->metadata, "title", NULL, 0)))
2747         window_title = av_asprintf("%s - %s", t->value, input_filename);
2748
2749     /* if seeking requested, we execute it */
2750     if (start_time != AV_NOPTS_VALUE) {
2751         int64_t timestamp;
2752
2753         timestamp = start_time;
2754         /* add the stream start time */
2755         if (ic->start_time != AV_NOPTS_VALUE)
2756             timestamp += ic->start_time;
2757         ret = avformat_seek_file(ic, -1, INT64_MIN, timestamp, INT64_MAX, 0);
2758         if (ret < 0) {
2759             av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
2760                     is->filename, (double)timestamp / AV_TIME_BASE);
2761         }
2762     }
2763
2764     is->realtime = is_realtime(ic);
2765
2766     for (i = 0; i < ic->nb_streams; i++)
2767         ic->streams[i]->discard = AVDISCARD_ALL;
2768     if (!video_disable)
2769         st_index[AVMEDIA_TYPE_VIDEO] =
2770             av_find_best_stream(ic, AVMEDIA_TYPE_VIDEO,
2771                                 wanted_stream[AVMEDIA_TYPE_VIDEO], -1, NULL, 0);
2772     if (!audio_disable)
2773         st_index[AVMEDIA_TYPE_AUDIO] =
2774             av_find_best_stream(ic, AVMEDIA_TYPE_AUDIO,
2775                                 wanted_stream[AVMEDIA_TYPE_AUDIO],
2776                                 st_index[AVMEDIA_TYPE_VIDEO],
2777                                 NULL, 0);
2778     if (!video_disable && !subtitle_disable)
2779         st_index[AVMEDIA_TYPE_SUBTITLE] =
2780             av_find_best_stream(ic, AVMEDIA_TYPE_SUBTITLE,
2781                                 wanted_stream[AVMEDIA_TYPE_SUBTITLE],
2782                                 (st_index[AVMEDIA_TYPE_AUDIO] >= 0 ?
2783                                  st_index[AVMEDIA_TYPE_AUDIO] :
2784                                  st_index[AVMEDIA_TYPE_VIDEO]),
2785                                 NULL, 0);
2786     if (show_status) {
2787         av_dump_format(ic, 0, is->filename, 0);
2788     }
2789
2790     is->show_mode = show_mode;
2791
2792     /* open the streams */
2793     if (st_index[AVMEDIA_TYPE_AUDIO] >= 0) {
2794         stream_component_open(is, st_index[AVMEDIA_TYPE_AUDIO]);
2795     }
2796
2797     ret = -1;
2798     if (st_index[AVMEDIA_TYPE_VIDEO] >= 0) {
2799         ret = stream_component_open(is, st_index[AVMEDIA_TYPE_VIDEO]);
2800     }
2801     if (is->show_mode == SHOW_MODE_NONE)
2802         is->show_mode = ret >= 0 ? SHOW_MODE_VIDEO : SHOW_MODE_RDFT;
2803
2804     if (st_index[AVMEDIA_TYPE_SUBTITLE] >= 0) {
2805         stream_component_open(is, st_index[AVMEDIA_TYPE_SUBTITLE]);
2806     }
2807
2808     if (is->video_stream < 0 && is->audio_stream < 0) {
2809         av_log(NULL, AV_LOG_FATAL, "%s: could not open codecs\n", is->filename);
2810         ret = -1;
2811         goto fail;
2812     }
2813
2814     if (infinite_buffer < 0 && is->realtime)
2815         infinite_buffer = 1;
2816
2817     for (;;) {
2818         if (is->abort_request)
2819             break;
2820         if (is->paused != is->last_paused) {
2821             is->last_paused = is->paused;
2822             if (is->paused)
2823                 is->read_pause_return = av_read_pause(ic);
2824             else
2825                 av_read_play(ic);
2826         }
2827 #if CONFIG_RTSP_DEMUXER || CONFIG_MMSH_PROTOCOL
2828         if (is->paused &&
2829                 (!strcmp(ic->iformat->name, "rtsp") ||
2830                  (ic->pb && !strncmp(input_filename, "mmsh:", 5)))) {
2831             /* wait 10 ms to avoid trying to get another packet */
2832             /* XXX: horrible */
2833             SDL_Delay(10);
2834             continue;
2835         }
2836 #endif
2837         if (is->seek_req) {
2838             int64_t seek_target = is->seek_pos;
2839             int64_t seek_min    = is->seek_rel > 0 ? seek_target - is->seek_rel + 2: INT64_MIN;
2840             int64_t seek_max    = is->seek_rel < 0 ? seek_target - is->seek_rel - 2: INT64_MAX;
2841 // FIXME the +-2 is due to rounding being not done in the correct direction in generation
2842 //      of the seek_pos/seek_rel variables
2843
2844             ret = avformat_seek_file(is->ic, -1, seek_min, seek_target, seek_max, is->seek_flags);
2845             if (ret < 0) {
2846                 av_log(NULL, AV_LOG_ERROR,
2847                        "%s: error while seeking\n", is->ic->filename);
2848             } else {
2849                 if (is->audio_stream >= 0) {
2850                     packet_queue_flush(&is->audioq);
2851                     packet_queue_put(&is->audioq, &flush_pkt);
2852                 }
2853                 if (is->subtitle_stream >= 0) {
2854                     packet_queue_flush(&is->subtitleq);
2855                     packet_queue_put(&is->subtitleq, &flush_pkt);
2856                 }
2857                 if (is->video_stream >= 0) {
2858                     packet_queue_flush(&is->videoq);
2859                     packet_queue_put(&is->videoq, &flush_pkt);
2860                 }
2861                 if (is->seek_flags & AVSEEK_FLAG_BYTE) {
2862                    set_clock(&is->extclk, NAN, 0);
2863                 } else {
2864                    set_clock(&is->extclk, seek_target / (double)AV_TIME_BASE, 0);
2865                 }
2866             }
2867             is->seek_req = 0;
2868             is->queue_attachments_req = 1;
2869             eof = 0;
2870             if (is->paused)
2871                 step_to_next_frame(is);
2872         }
2873         if (is->queue_attachments_req) {
2874             if (is->video_st && is->video_st->disposition & AV_DISPOSITION_ATTACHED_PIC) {
2875                 AVPacket copy;
2876                 if ((ret = av_copy_packet(&copy, &is->video_st->attached_pic)) < 0)
2877                     goto fail;
2878                 packet_queue_put(&is->videoq, &copy);
2879             }
2880             is->queue_attachments_req = 0;
2881         }
2882
2883         /* if the queue are full, no need to read more */
2884         if (infinite_buffer<1 &&
2885               (is->audioq.size + is->videoq.size + is->subtitleq.size > MAX_QUEUE_SIZE
2886             || (   (is->audioq   .nb_packets > MIN_FRAMES || is->audio_stream < 0 || is->audioq.abort_request)
2887                 && (is->videoq   .nb_packets > MIN_FRAMES || is->video_stream < 0 || is->videoq.abort_request
2888                     || (is->video_st->disposition & AV_DISPOSITION_ATTACHED_PIC))
2889                 && (is->subtitleq.nb_packets > MIN_FRAMES || is->subtitle_stream < 0 || is->subtitleq.abort_request)))) {
2890             /* wait 10 ms */
2891             SDL_LockMutex(wait_mutex);
2892             SDL_CondWaitTimeout(is->continue_read_thread, wait_mutex, 10);
2893             SDL_UnlockMutex(wait_mutex);
2894             continue;
2895         }
2896         if (eof) {
2897             if (is->video_stream >= 0) {
2898                 av_init_packet(pkt);
2899                 pkt->data = NULL;
2900                 pkt->size = 0;
2901                 pkt->stream_index = is->video_stream;
2902                 packet_queue_put(&is->videoq, pkt);
2903             }
2904             if (is->audio_stream >= 0) {
2905                 av_init_packet(pkt);
2906                 pkt->data = NULL;
2907                 pkt->size = 0;
2908                 pkt->stream_index = is->audio_stream;
2909                 packet_queue_put(&is->audioq, pkt);
2910             }
2911             SDL_Delay(10);
2912             if (is->audioq.size + is->videoq.size + is->subtitleq.size == 0) {
2913                 if (loop != 1 && (!loop || --loop)) {
2914                     stream_seek(is, start_time != AV_NOPTS_VALUE ? start_time : 0, 0, 0);
2915                 } else if (autoexit) {
2916                     ret = AVERROR_EOF;
2917                     goto fail;
2918                 }
2919             }
2920             eof=0;
2921             continue;
2922         }
2923         ret = av_read_frame(ic, pkt);
2924         if (ret < 0) {
2925             if (ret == AVERROR_EOF || url_feof(ic->pb))
2926                 eof = 1;
2927             if (ic->pb && ic->pb->error)
2928                 break;
2929             SDL_LockMutex(wait_mutex);
2930             SDL_CondWaitTimeout(is->continue_read_thread, wait_mutex, 10);
2931             SDL_UnlockMutex(wait_mutex);
2932             continue;
2933         }
2934         /* check if packet is in play range specified by user, then queue, otherwise discard */
2935         stream_start_time = ic->streams[pkt->stream_index]->start_time;
2936         pkt_in_play_range = duration == AV_NOPTS_VALUE ||
2937                 (pkt->pts - (stream_start_time != AV_NOPTS_VALUE ? stream_start_time : 0)) *
2938                 av_q2d(ic->streams[pkt->stream_index]->time_base) -
2939                 (double)(start_time != AV_NOPTS_VALUE ? start_time : 0) / 1000000
2940                 <= ((double)duration / 1000000);
2941         if (pkt->stream_index == is->audio_stream && pkt_in_play_range) {
2942             packet_queue_put(&is->audioq, pkt);
2943         } else if (pkt->stream_index == is->video_stream && pkt_in_play_range
2944                    && !(is->video_st->disposition & AV_DISPOSITION_ATTACHED_PIC)) {
2945             packet_queue_put(&is->videoq, pkt);
2946         } else if (pkt->stream_index == is->subtitle_stream && pkt_in_play_range) {
2947             packet_queue_put(&is->subtitleq, pkt);
2948         } else {
2949             av_free_packet(pkt);
2950         }
2951     }
2952     /* wait until the end */
2953     while (!is->abort_request) {
2954         SDL_Delay(100);
2955     }
2956
2957     ret = 0;
2958  fail:
2959     /* close each stream */
2960     if (is->audio_stream >= 0)
2961         stream_component_close(is, is->audio_stream);
2962     if (is->video_stream >= 0)
2963         stream_component_close(is, is->video_stream);
2964     if (is->subtitle_stream >= 0)
2965         stream_component_close(is, is->subtitle_stream);
2966     if (is->ic) {
2967         avformat_close_input(&is->ic);
2968     }
2969
2970     if (ret != 0) {
2971         SDL_Event event;
2972
2973         event.type = FF_QUIT_EVENT;
2974         event.user.data1 = is;
2975         SDL_PushEvent(&event);
2976     }
2977     SDL_DestroyMutex(wait_mutex);
2978     return 0;
2979 }
2980
2981 static VideoState *stream_open(const char *filename, AVInputFormat *iformat)
2982 {
2983     VideoState *is;
2984
2985     is = av_mallocz(sizeof(VideoState));
2986     if (!is)
2987         return NULL;
2988     av_strlcpy(is->filename, filename, sizeof(is->filename));
2989     is->iformat = iformat;
2990     is->ytop    = 0;
2991     is->xleft   = 0;
2992
2993     /* start video display */
2994     is->pictq_mutex = SDL_CreateMutex();
2995     is->pictq_cond  = SDL_CreateCond();
2996
2997     is->subpq_mutex = SDL_CreateMutex();
2998     is->subpq_cond  = SDL_CreateCond();
2999
3000     packet_queue_init(&is->videoq);
3001     packet_queue_init(&is->audioq);
3002     packet_queue_init(&is->subtitleq);
3003
3004     is->continue_read_thread = SDL_CreateCond();
3005
3006     init_clock(&is->vidclk, &is->videoq.serial);
3007     init_clock(&is->audclk, &is->audioq.serial);
3008     init_clock(&is->extclk, &is->extclk.serial);
3009     is->audio_clock_serial = -1;
3010     is->audio_last_serial = -1;
3011     is->av_sync_type = av_sync_type;
3012     is->read_tid     = SDL_CreateThread(read_thread, is);
3013     if (!is->read_tid) {
3014         av_free(is);
3015         return NULL;
3016     }
3017     return is;
3018 }
3019
3020 static void stream_cycle_channel(VideoState *is, int codec_type)
3021 {
3022     AVFormatContext *ic = is->ic;
3023     int start_index, stream_index;
3024     int old_index;
3025     AVStream *st;
3026
3027     if (codec_type == AVMEDIA_TYPE_VIDEO) {
3028         start_index = is->last_video_stream;
3029         old_index = is->video_stream;
3030     } else if (codec_type == AVMEDIA_TYPE_AUDIO) {
3031         start_index = is->last_audio_stream;
3032         old_index = is->audio_stream;
3033     } else {
3034         start_index = is->last_subtitle_stream;
3035         old_index = is->subtitle_stream;
3036     }
3037     stream_index = start_index;
3038     for (;;) {
3039         if (++stream_index >= is->ic->nb_streams)
3040         {
3041             if (codec_type == AVMEDIA_TYPE_SUBTITLE)
3042             {
3043                 stream_index = -1;
3044                 is->last_subtitle_stream = -1;
3045                 goto the_end;
3046             }
3047             if (start_index == -1)
3048                 return;
3049             stream_index = 0;
3050         }
3051         if (stream_index == start_index)
3052             return;
3053         st = ic->streams[stream_index];
3054         if (st->codec->codec_type == codec_type) {
3055             /* check that parameters are OK */
3056             switch (codec_type) {
3057             case AVMEDIA_TYPE_AUDIO:
3058                 if (st->codec->sample_rate != 0 &&
3059                     st->codec->channels != 0)
3060                     goto the_end;
3061                 break;
3062             case AVMEDIA_TYPE_VIDEO:
3063             case AVMEDIA_TYPE_SUBTITLE:
3064                 goto the_end;
3065             default:
3066                 break;
3067             }
3068         }
3069     }
3070  the_end:
3071     stream_component_close(is, old_index);
3072     stream_component_open(is, stream_index);
3073 }
3074
3075
3076 static void toggle_full_screen(VideoState *is)
3077 {
3078 #if defined(__APPLE__) && SDL_VERSION_ATLEAST(1, 2, 14)
3079     /* OS X needs to reallocate the SDL overlays */
3080     int i;
3081     for (i = 0; i < VIDEO_PICTURE_QUEUE_SIZE; i++)
3082         is->pictq[i].reallocate = 1;
3083 #endif
3084     is_full_screen = !is_full_screen;
3085     video_open(is, 1, NULL);
3086 }
3087
3088 static void toggle_audio_display(VideoState *is)
3089 {
3090     int bgcolor = SDL_MapRGB(screen->format, 0x00, 0x00, 0x00);
3091     int next = is->show_mode;
3092     do {
3093         next = (next + 1) % SHOW_MODE_NB;
3094     } while (next != is->show_mode && (next == SHOW_MODE_VIDEO && !is->video_st || next != SHOW_MODE_VIDEO && !is->audio_st));
3095     if (is->show_mode != next) {
3096         fill_rectangle(screen,
3097                     is->xleft, is->ytop, is->width, is->height,
3098                     bgcolor, 1);
3099         is->force_refresh = 1;
3100         is->show_mode = next;
3101     }
3102 }
3103
3104 static void refresh_loop_wait_event(VideoState *is, SDL_Event *event) {
3105     double remaining_time = 0.0;
3106     SDL_PumpEvents();
3107     while (!SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_ALLEVENTS)) {
3108         if (!cursor_hidden && av_gettime() - cursor_last_shown > CURSOR_HIDE_DELAY) {
3109             SDL_ShowCursor(0);
3110             cursor_hidden = 1;
3111         }
3112         if (remaining_time > 0.0)
3113             av_usleep((int64_t)(remaining_time * 1000000.0));
3114         remaining_time = REFRESH_RATE;
3115         if (is->show_mode != SHOW_MODE_NONE && (!is->paused || is->force_refresh))
3116             video_refresh(is, &remaining_time);
3117         SDL_PumpEvents();
3118     }
3119 }
3120
3121 /* handle an event sent by the GUI */
3122 static void event_loop(VideoState *cur_stream)
3123 {
3124     SDL_Event event;
3125     double incr, pos, frac;
3126
3127     for (;;) {
3128         double x;
3129         refresh_loop_wait_event(cur_stream, &event);
3130         switch (event.type) {
3131         case SDL_KEYDOWN:
3132             if (exit_on_keydown) {
3133                 do_exit(cur_stream);
3134                 break;
3135             }
3136             switch (event.key.keysym.sym) {
3137             case SDLK_ESCAPE:
3138             case SDLK_q:
3139                 do_exit(cur_stream);
3140                 break;
3141             case SDLK_f:
3142                 toggle_full_screen(cur_stream);
3143                 cur_stream->force_refresh = 1;
3144                 break;
3145             case SDLK_p:
3146             case SDLK_SPACE:
3147                 toggle_pause(cur_stream);
3148                 break;
3149             case SDLK_s: // S: Step to next frame
3150                 step_to_next_frame(cur_stream);
3151                 break;
3152             case SDLK_a:
3153                 stream_cycle_channel(cur_stream, AVMEDIA_TYPE_AUDIO);
3154                 break;
3155             case SDLK_v:
3156                 stream_cycle_channel(cur_stream, AVMEDIA_TYPE_VIDEO);
3157                 break;
3158             case SDLK_t:
3159                 stream_cycle_channel(cur_stream, AVMEDIA_TYPE_SUBTITLE);
3160                 break;
3161             case SDLK_w:
3162                 toggle_audio_display(cur_stream);
3163                 break;
3164             case SDLK_PAGEUP:
3165                 incr = 600.0;
3166                 goto do_seek;
3167             case SDLK_PAGEDOWN:
3168                 incr = -600.0;
3169                 goto do_seek;
3170             case SDLK_LEFT:
3171                 incr = -10.0;
3172                 goto do_seek;
3173             case SDLK_RIGHT:
3174                 incr = 10.0;
3175                 goto do_seek;
3176             case SDLK_UP:
3177                 incr = 60.0;
3178                 goto do_seek;
3179             case SDLK_DOWN:
3180                 incr = -60.0;
3181             do_seek:
3182                     if (seek_by_bytes) {
3183                         if (cur_stream->video_stream >= 0 && cur_stream->video_current_pos >= 0) {
3184                             pos = cur_stream->video_current_pos;
3185                         } else if (cur_stream->audio_stream >= 0 && cur_stream->audio_pkt.pos >= 0) {
3186                             pos = cur_stream->audio_pkt.pos;
3187                         } else
3188                             pos = avio_tell(cur_stream->ic->pb);
3189                         if (cur_stream->ic->bit_rate)
3190                             incr *= cur_stream->ic->bit_rate / 8.0;
3191                         else
3192                             incr *= 180000.0;
3193                         pos += incr;
3194                         stream_seek(cur_stream, pos, incr, 1);
3195                     } else {
3196                         pos = get_master_clock(cur_stream);
3197                         if (isnan(pos))
3198                             pos = (double)cur_stream->seek_pos / AV_TIME_BASE;
3199                         pos += incr;
3200                         if (cur_stream->ic->start_time != AV_NOPTS_VALUE && pos < cur_stream->ic->start_time / (double)AV_TIME_BASE)
3201                             pos = cur_stream->ic->start_time / (double)AV_TIME_BASE;
3202                         stream_seek(cur_stream, (int64_t)(pos * AV_TIME_BASE), (int64_t)(incr * AV_TIME_BASE), 0);
3203                     }
3204                 break;
3205             default:
3206                 break;
3207             }
3208             break;
3209         case SDL_VIDEOEXPOSE:
3210             cur_stream->force_refresh = 1;
3211             break;
3212         case SDL_MOUSEBUTTONDOWN:
3213             if (exit_on_mousedown) {
3214                 do_exit(cur_stream);
3215                 break;
3216             }
3217         case SDL_MOUSEMOTION:
3218             if (cursor_hidden) {
3219                 SDL_ShowCursor(1);
3220                 cursor_hidden = 0;
3221             }
3222             cursor_last_shown = av_gettime();
3223             if (event.type == SDL_MOUSEBUTTONDOWN) {
3224                 x = event.button.x;
3225             } else {
3226                 if (event.motion.state != SDL_PRESSED)
3227                     break;
3228                 x = event.motion.x;
3229             }
3230                 if (seek_by_bytes || cur_stream->ic->duration <= 0) {
3231                     uint64_t size =  avio_size(cur_stream->ic->pb);
3232                     stream_seek(cur_stream, size*x/cur_stream->width, 0, 1);
3233                 } else {
3234                     int64_t ts;
3235                     int ns, hh, mm, ss;
3236                     int tns, thh, tmm, tss;
3237                     tns  = cur_stream->ic->duration / 1000000LL;
3238                     thh  = tns / 3600;
3239                     tmm  = (tns % 3600) / 60;
3240                     tss  = (tns % 60);
3241                     frac = x / cur_stream->width;
3242                     ns   = frac * tns;
3243                     hh   = ns / 3600;
3244                     mm   = (ns % 3600) / 60;
3245                     ss   = (ns % 60);
3246                     av_log(NULL, AV_LOG_INFO,
3247                            "Seek to %2.0f%% (%2d:%02d:%02d) of total duration (%2d:%02d:%02d)       \n", frac*100,
3248                             hh, mm, ss, thh, tmm, tss);
3249                     ts = frac * cur_stream->ic->duration;
3250                     if (cur_stream->ic->start_time != AV_NOPTS_VALUE)
3251                         ts += cur_stream->ic->start_time;
3252                     stream_seek(cur_stream, ts, 0, 0);
3253                 }
3254             break;
3255         case SDL_VIDEORESIZE:
3256                 screen = SDL_SetVideoMode(FFMIN(16383, event.resize.w), event.resize.h, 0,
3257                                           SDL_HWSURFACE|SDL_RESIZABLE|SDL_ASYNCBLIT|SDL_HWACCEL);
3258                 if (!screen) {
3259                     av_log(NULL, AV_LOG_FATAL, "Failed to set video mode\n");
3260                     do_exit(cur_stream);
3261                 }
3262                 screen_width  = cur_stream->width  = screen->w;
3263                 screen_height = cur_stream->height = screen->h;
3264                 cur_stream->force_refresh = 1;
3265             break;
3266         case SDL_QUIT:
3267         case FF_QUIT_EVENT:
3268             do_exit(cur_stream);
3269             break;
3270         case FF_ALLOC_EVENT:
3271             alloc_picture(event.user.data1);
3272             break;
3273         default:
3274             break;
3275         }
3276     }
3277 }
3278
3279 static int opt_frame_size(void *optctx, const char *opt, const char *arg)
3280 {
3281     av_log(NULL, AV_LOG_WARNING, "Option -s is deprecated, use -video_size.\n");
3282     return opt_default(NULL, "video_size", arg);
3283 }
3284
3285 static int opt_width(void *optctx, const char *opt, const char *arg)
3286 {
3287     screen_width = parse_number_or_die(opt, arg, OPT_INT64, 1, INT_MAX);
3288     return 0;
3289 }
3290
3291 static int opt_height(void *optctx, const char *opt, const char *arg)
3292 {
3293     screen_height = parse_number_or_die(opt, arg, OPT_INT64, 1, INT_MAX);
3294     return 0;
3295 }
3296
3297 static int opt_format(void *optctx, const char *opt, const char *arg)
3298 {
3299     file_iformat = av_find_input_format(arg);
3300     if (!file_iformat) {
3301         av_log(NULL, AV_LOG_FATAL, "Unknown input format: %s\n", arg);
3302         return AVERROR(EINVAL);
3303     }
3304     return 0;
3305 }
3306
3307 static int opt_frame_pix_fmt(void *optctx, const char *opt, const char *arg)
3308 {
3309     av_log(NULL, AV_LOG_WARNING, "Option -pix_fmt is deprecated, use -pixel_format.\n");
3310     return opt_default(NULL, "pixel_format", arg);
3311 }
3312
3313 static int opt_sync(void *optctx, const char *opt, const char *arg)
3314 {
3315     if (!strcmp(arg, "audio"))
3316         av_sync_type = AV_SYNC_AUDIO_MASTER;
3317     else if (!strcmp(arg, "video"))
3318         av_sync_type = AV_SYNC_VIDEO_MASTER;
3319     else if (!strcmp(arg, "ext"))
3320         av_sync_type = AV_SYNC_EXTERNAL_CLOCK;
3321     else {
3322         av_log(NULL, AV_LOG_ERROR, "Unknown value for %s: %s\n", opt, arg);
3323         exit(1);
3324     }
3325     return 0;
3326 }
3327
3328 static int opt_seek(void *optctx, const char *opt, const char *arg)
3329 {
3330     start_time = parse_time_or_die(opt, arg, 1);
3331     return 0;
3332 }
3333
3334 static int opt_duration(void *optctx, const char *opt, const char *arg)
3335 {
3336     duration = parse_time_or_die(opt, arg, 1);
3337     return 0;
3338 }
3339
3340 static int opt_show_mode(void *optctx, const char *opt, const char *arg)
3341 {
3342     show_mode = !strcmp(arg, "video") ? SHOW_MODE_VIDEO :
3343                 !strcmp(arg, "waves") ? SHOW_MODE_WAVES :
3344                 !strcmp(arg, "rdft" ) ? SHOW_MODE_RDFT  :
3345                 parse_number_or_die(opt, arg, OPT_INT, 0, SHOW_MODE_NB-1);
3346     return 0;
3347 }
3348
3349 static void opt_input_file(void *optctx, const char *filename)
3350 {
3351     if (input_filename) {
3352         av_log(NULL, AV_LOG_FATAL,
3353                "Argument '%s' provided as input filename, but '%s' was already specified.\n",
3354                 filename, input_filename);
3355         exit(1);
3356     }
3357     if (!strcmp(filename, "-"))
3358         filename = "pipe:";
3359     input_filename = filename;
3360 }
3361
3362 static int opt_codec(void *optctx, const char *opt, const char *arg)
3363 {
3364    const char *spec = strchr(opt, ':');
3365    if (!spec) {
3366        av_log(NULL, AV_LOG_ERROR,
3367               "No media specifier was specified in '%s' in option '%s'\n",
3368                arg, opt);
3369        return AVERROR(EINVAL);
3370    }
3371    spec++;
3372    switch (spec[0]) {
3373    case 'a' :    audio_codec_name = arg; break;
3374    case 's' : subtitle_codec_name = arg; break;
3375    case 'v' :    video_codec_name = arg; break;
3376    default:
3377        av_log(NULL, AV_LOG_ERROR,
3378               "Invalid media specifier '%s' in option '%s'\n", spec, opt);
3379        return AVERROR(EINVAL);
3380    }
3381    return 0;
3382 }
3383
3384 static int dummy;
3385
3386 static const OptionDef options[] = {
3387 #include "cmdutils_common_opts.h"
3388     { "x", HAS_ARG, { .func_arg = opt_width }, "force displayed width", "width" },
3389     { "y", HAS_ARG, { .func_arg = opt_height }, "force displayed height", "height" },
3390     { "s", HAS_ARG | OPT_VIDEO, { .func_arg = opt_frame_size }, "set frame size (WxH or abbreviation)", "size" },
3391     { "fs", OPT_BOOL, { &is_full_screen }, "force full screen" },
3392     { "an", OPT_BOOL, { &audio_disable }, "disable audio" },
3393     { "vn", OPT_BOOL, { &video_disable }, "disable video" },
3394     { "sn", OPT_BOOL, { &subtitle_disable }, "disable subtitling" },
3395     { "ast", OPT_INT | HAS_ARG | OPT_EXPERT, { &wanted_stream[AVMEDIA_TYPE_AUDIO] }, "select desired audio stream", "stream_number" },
3396     { "vst", OPT_INT | HAS_ARG | OPT_EXPERT, { &wanted_stream[AVMEDIA_TYPE_VIDEO] }, "select desired video stream", "stream_number" },
3397     { "sst", OPT_INT | HAS_ARG | OPT_EXPERT, { &wanted_stream[AVMEDIA_TYPE_SUBTITLE] }, "select desired subtitle stream", "stream_number" },
3398     { "ss", HAS_ARG, { .func_arg = opt_seek }, "seek to a given position in seconds", "pos" },
3399     { "t", HAS_ARG, { .func_arg = opt_duration }, "play  \"duration\" seconds of audio/video", "duration" },
3400     { "bytes", OPT_INT | HAS_ARG, { &seek_by_bytes }, "seek by bytes 0=off 1=on -1=auto", "val" },
3401     { "nodisp", OPT_BOOL, { &display_disable }, "disable graphical display" },
3402     { "f", HAS_ARG, { .func_arg = opt_format }, "force format", "fmt" },
3403     { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_frame_pix_fmt }, "set pixel format", "format" },
3404     { "stats", OPT_BOOL | OPT_EXPERT, { &show_status }, "show status", "" },
3405     { "bug", OPT_INT | HAS_ARG | OPT_EXPERT, { &workaround_bugs }, "workaround bugs", "" },
3406     { "fast", OPT_BOOL | OPT_EXPERT, { &fast }, "non spec compliant optimizations", "" },
3407     { "genpts", OPT_BOOL | OPT_EXPERT, { &genpts }, "generate pts", "" },
3408     { "drp", OPT_INT | HAS_ARG | OPT_EXPERT, { &decoder_reorder_pts }, "let decoder reorder pts 0=off 1=on -1=auto", ""},
3409     { "lowres", OPT_INT | HAS_ARG | OPT_EXPERT, { &lowres }, "", "" },
3410     { "ec", OPT_INT | HAS_ARG | OPT_EXPERT, { &error_concealment }, "set error concealment options",  "bit_mask" },
3411     { "sync", HAS_ARG | OPT_EXPERT, { .func_arg = opt_sync }, "set audio-video sync. type (type=audio/video/ext)", "type" },
3412     { "autoexit", OPT_BOOL | OPT_EXPERT, { &autoexit }, "exit at the end", "" },
3413     { "exitonkeydown", OPT_BOOL | OPT_EXPERT, { &exit_on_keydown }, "exit on key down", "" },
3414     { "exitonmousedown", OPT_BOOL | OPT_EXPERT, { &exit_on_mousedown }, "exit on mouse down", "" },
3415     { "loop", OPT_INT | HAS_ARG | OPT_EXPERT, { &loop }, "set number of times the playback shall be looped", "loop count" },
3416     { "framedrop", OPT_BOOL | OPT_EXPERT, { &framedrop }, "drop frames when cpu is too slow", "" },
3417     { "infbuf", OPT_BOOL | OPT_EXPERT, { &infinite_buffer }, "don't limit the input buffer size (useful with realtime streams)", "" },
3418     { "window_title", OPT_STRING | HAS_ARG, { &window_title }, "set window title", "window title" },
3419 #if CONFIG_AVFILTER
3420     { "vf", OPT_STRING | HAS_ARG, { &vfilters }, "set video filters", "filter_graph" },
3421     { "af", OPT_STRING | HAS_ARG, { &afilters }, "set audio filters", "filter_graph" },
3422 #endif
3423     { "rdftspeed", OPT_INT | HAS_ARG| OPT_AUDIO | OPT_EXPERT, { &rdftspeed }, "rdft speed", "msecs" },
3424     { "showmode", HAS_ARG, { .func_arg = opt_show_mode}, "select show mode (0 = video, 1 = waves, 2 = RDFT)", "mode" },
3425     { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, { .func_arg = opt_default }, "generic catch all option", "" },
3426     { "i", OPT_BOOL, { &dummy}, "read specified file", "input_file"},
3427     { "codec", HAS_ARG, { .func_arg = opt_codec}, "force decoder", "decoder_name" },
3428     { "acodec", HAS_ARG | OPT_STRING | OPT_EXPERT, {    &audio_codec_name }, "force audio decoder",    "decoder_name" },
3429     { "scodec", HAS_ARG | OPT_STRING | OPT_EXPERT, { &subtitle_codec_name }, "force subtitle decoder", "decoder_name" },
3430     { "vcodec", HAS_ARG | OPT_STRING | OPT_EXPERT, {    &video_codec_name }, "force video decoder",    "decoder_name" },
3431     { NULL, },
3432 };
3433
3434 static void show_usage(void)
3435 {
3436     av_log(NULL, AV_LOG_INFO, "Simple media player\n");
3437     av_log(NULL, AV_LOG_INFO, "usage: %s [options] input_file\n", program_name);
3438     av_log(NULL, AV_LOG_INFO, "\n");
3439 }
3440
3441 void show_help_default(const char *opt, const char *arg)
3442 {
3443     av_log_set_callback(log_callback_help);
3444     show_usage();
3445     show_help_options(options, "Main options:", 0, OPT_EXPERT, 0);
3446     show_help_options(options, "Advanced options:", OPT_EXPERT, 0, 0);
3447     printf("\n");
3448     show_help_children(avcodec_get_class(), AV_OPT_FLAG_DECODING_PARAM);
3449     show_help_children(avformat_get_class(), AV_OPT_FLAG_DECODING_PARAM);
3450 #if !CONFIG_AVFILTER
3451     show_help_children(sws_get_class(), AV_OPT_FLAG_ENCODING_PARAM);
3452 #else
3453     show_help_children(avfilter_get_class(), AV_OPT_FLAG_FILTERING_PARAM);
3454 #endif
3455     printf("\nWhile playing:\n"
3456            "q, ESC              quit\n"
3457            "f                   toggle full screen\n"
3458            "p, SPC              pause\n"
3459            "a                   cycle audio channel\n"
3460            "v                   cycle video channel\n"
3461            "t                   cycle subtitle channel\n"
3462            "w                   show audio waves\n"
3463            "s                   activate frame-step mode\n"
3464            "left/right          seek backward/forward 10 seconds\n"
3465            "down/up             seek backward/forward 1 minute\n"
3466            "page down/page up   seek backward/forward 10 minutes\n"
3467            "mouse click         seek to percentage in file corresponding to fraction of width\n"
3468            );
3469 }
3470
3471 static int lockmgr(void **mtx, enum AVLockOp op)
3472 {
3473    switch(op) {
3474       case AV_LOCK_CREATE:
3475           *mtx = SDL_CreateMutex();
3476           if(!*mtx)
3477               return 1;
3478           return 0;
3479       case AV_LOCK_OBTAIN:
3480           return !!SDL_LockMutex(*mtx);
3481       case AV_LOCK_RELEASE:
3482           return !!SDL_UnlockMutex(*mtx);
3483       case AV_LOCK_DESTROY:
3484           SDL_DestroyMutex(*mtx);
3485           return 0;
3486    }
3487    return 1;
3488 }
3489
3490 /* Called from the main */
3491 int main(int argc, char **argv)
3492 {
3493     int flags;
3494     VideoState *is;
3495     char dummy_videodriver[] = "SDL_VIDEODRIVER=dummy";
3496
3497     av_log_set_flags(AV_LOG_SKIP_REPEATED);
3498     parse_loglevel(argc, argv, options);
3499
3500     /* register all codecs, demux and protocols */
3501     avcodec_register_all();
3502 #if CONFIG_AVDEVICE
3503     avdevice_register_all();
3504 #endif
3505 #if CONFIG_AVFILTER
3506     avfilter_register_all();
3507 #endif
3508     av_register_all();
3509     avformat_network_init();
3510
3511     init_opts();
3512
3513     signal(SIGINT , sigterm_handler); /* Interrupt (ANSI).    */
3514     signal(SIGTERM, sigterm_handler); /* Termination (ANSI).  */
3515
3516     show_banner(argc, argv, options);
3517
3518     parse_options(NULL, argc, argv, options, opt_input_file);
3519
3520     if (!input_filename) {
3521         show_usage();
3522         av_log(NULL, AV_LOG_FATAL, "An input file must be specified\n");
3523         av_log(NULL, AV_LOG_FATAL,
3524                "Use -h to get full help or, even better, run 'man %s'\n", program_name);
3525         exit(1);
3526     }
3527
3528     if (display_disable) {
3529         video_disable = 1;
3530     }
3531     flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER;
3532     if (audio_disable)
3533         flags &= ~SDL_INIT_AUDIO;
3534     if (display_disable)
3535         SDL_putenv(dummy_videodriver); /* For the event queue, we always need a video driver. */
3536 #if !defined(__MINGW32__) && !defined(__APPLE__)
3537     flags |= SDL_INIT_EVENTTHREAD; /* Not supported on Windows or Mac OS X */
3538 #endif
3539     if (SDL_Init (flags)) {
3540         av_log(NULL, AV_LOG_FATAL, "Could not initialize SDL - %s\n", SDL_GetError());
3541         av_log(NULL, AV_LOG_FATAL, "(Did you set the DISPLAY variable?)\n");
3542         exit(1);
3543     }
3544
3545     if (!display_disable) {
3546         const SDL_VideoInfo *vi = SDL_GetVideoInfo();
3547         fs_screen_width = vi->current_w;
3548         fs_screen_height = vi->current_h;
3549     }
3550
3551     SDL_EventState(SDL_ACTIVEEVENT, SDL_IGNORE);
3552     SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE);
3553     SDL_EventState(SDL_USEREVENT, SDL_IGNORE);
3554
3555     if (av_lockmgr_register(lockmgr)) {
3556         av_log(NULL, AV_LOG_FATAL, "Could not initialize lock manager!\n");
3557         do_exit(NULL);
3558     }
3559
3560     av_init_packet(&flush_pkt);
3561     flush_pkt.data = (uint8_t *)&flush_pkt;
3562
3563     is = stream_open(input_filename, file_iformat);
3564     if (!is) {
3565         av_log(NULL, AV_LOG_FATAL, "Failed to initialize VideoState!\n");
3566         do_exit(NULL);
3567     }
3568
3569     event_loop(is);
3570
3571     /* never returns */
3572
3573     return 0;
3574 }