]> git.sesse.net Git - ffmpeg/blob - ffplay.c
Merge remote-tracking branch 'qatar/master'
[ffmpeg] / 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 } SubPicture;
138
139 typedef struct AudioParams {
140     int freq;
141     int channels;
142     int64_t channel_layout;
143     enum AVSampleFormat fmt;
144 } AudioParams;
145
146 typedef struct Clock {
147     double pts;           /* clock base */
148     double pts_drift;     /* clock base minus time at which we updated the clock */
149     double last_updated;
150     double speed;
151     int serial;           /* clock is based on a packet with this serial */
152     int paused;
153     int *queue_serial;    /* pointer to the current packet queue serial, used for obsolete clock detection */
154 } Clock;
155
156 enum {
157     AV_SYNC_AUDIO_MASTER, /* default choice */
158     AV_SYNC_VIDEO_MASTER,
159     AV_SYNC_EXTERNAL_CLOCK, /* synchronize to an external clock */
160 };
161
162 typedef struct VideoState {
163     SDL_Thread *read_tid;
164     SDL_Thread *video_tid;
165     AVInputFormat *iformat;
166     int no_background;
167     int abort_request;
168     int force_refresh;
169     int paused;
170     int last_paused;
171     int queue_attachments_req;
172     int seek_req;
173     int seek_flags;
174     int64_t seek_pos;
175     int64_t seek_rel;
176     int read_pause_return;
177     AVFormatContext *ic;
178     int realtime;
179
180     Clock audclk;
181     Clock vidclk;
182     Clock extclk;
183
184     int audio_stream;
185
186     int av_sync_type;
187
188     double audio_clock;
189     int audio_clock_serial;
190     double audio_diff_cum; /* used for AV difference average computation */
191     double audio_diff_avg_coef;
192     double audio_diff_threshold;
193     int audio_diff_avg_count;
194     AVStream *audio_st;
195     PacketQueue audioq;
196     int audio_hw_buf_size;
197     uint8_t silence_buf[SDL_AUDIO_BUFFER_SIZE];
198     uint8_t *audio_buf;
199     uint8_t *audio_buf1;
200     unsigned int audio_buf_size; /* in bytes */
201     unsigned int audio_buf1_size;
202     int audio_buf_index; /* in bytes */
203     int audio_write_buf_size;
204     int audio_buf_frames_pending;
205     AVPacket audio_pkt_temp;
206     AVPacket audio_pkt;
207     int audio_pkt_temp_serial;
208     int audio_last_serial;
209     struct AudioParams audio_src;
210 #if CONFIG_AVFILTER
211     struct AudioParams audio_filter_src;
212 #endif
213     struct AudioParams audio_tgt;
214     struct SwrContext *swr_ctx;
215     int frame_drops_early;
216     int frame_drops_late;
217     AVFrame *frame;
218
219     enum ShowMode {
220         SHOW_MODE_NONE = -1, SHOW_MODE_VIDEO = 0, SHOW_MODE_WAVES, SHOW_MODE_RDFT, SHOW_MODE_NB
221     } show_mode;
222     int16_t sample_array[SAMPLE_ARRAY_SIZE];
223     int sample_array_index;
224     int last_i_start;
225     RDFTContext *rdft;
226     int rdft_bits;
227     FFTSample *rdft_data;
228     int xpos;
229     double last_vis_time;
230
231     SDL_Thread *subtitle_tid;
232     int subtitle_stream;
233     int subtitle_stream_changed;
234     AVStream *subtitle_st;
235     PacketQueue subtitleq;
236     SubPicture subpq[SUBPICTURE_QUEUE_SIZE];
237     int subpq_size, subpq_rindex, subpq_windex;
238     SDL_mutex *subpq_mutex;
239     SDL_cond *subpq_cond;
240
241     double frame_timer;
242     double frame_last_pts;
243     double frame_last_duration;
244     double frame_last_dropped_pts;
245     double frame_last_returned_time;
246     double frame_last_filter_delay;
247     int64_t frame_last_dropped_pos;
248     int frame_last_dropped_serial;
249     int video_stream;
250     AVStream *video_st;
251     PacketQueue videoq;
252     int64_t video_current_pos;      // current displayed file pos
253     double max_frame_duration;      // maximum duration of a frame - above this, we consider the jump a timestamp discontinuity
254     VideoPicture pictq[VIDEO_PICTURE_QUEUE_SIZE];
255     int pictq_size, pictq_rindex, pictq_windex;
256     SDL_mutex *pictq_mutex;
257     SDL_cond *pictq_cond;
258 #if !CONFIG_AVFILTER
259     struct SwsContext *img_convert_ctx;
260 #endif
261     SDL_Rect last_display_rect;
262
263     char filename[1024];
264     int width, height, xleft, ytop;
265     int step;
266
267 #if CONFIG_AVFILTER
268     AVFilterContext *in_video_filter;   // the first filter in the video chain
269     AVFilterContext *out_video_filter;  // the last filter in the video chain
270     AVFilterContext *in_audio_filter;   // the first filter in the audio chain
271     AVFilterContext *out_audio_filter;  // the last filter in the audio chain
272     AVFilterGraph *agraph;              // audio filter graph
273 #endif
274
275     int last_video_stream, last_audio_stream, last_subtitle_stream;
276
277     SDL_cond *continue_read_thread;
278 } VideoState;
279
280 /* options specified by the user */
281 static AVInputFormat *file_iformat;
282 static const char *input_filename;
283 static const char *window_title;
284 static int fs_screen_width;
285 static int fs_screen_height;
286 static int default_width  = 640;
287 static int default_height = 480;
288 static int screen_width  = 0;
289 static int screen_height = 0;
290 static int audio_disable;
291 static int video_disable;
292 static int subtitle_disable;
293 static int wanted_stream[AVMEDIA_TYPE_NB] = {
294     [AVMEDIA_TYPE_AUDIO]    = -1,
295     [AVMEDIA_TYPE_VIDEO]    = -1,
296     [AVMEDIA_TYPE_SUBTITLE] = -1,
297 };
298 static int seek_by_bytes = -1;
299 static int display_disable;
300 static int show_status = 1;
301 static int av_sync_type = AV_SYNC_AUDIO_MASTER;
302 static int64_t start_time = AV_NOPTS_VALUE;
303 static int64_t duration = AV_NOPTS_VALUE;
304 static int workaround_bugs = 1;
305 static int fast = 0;
306 static int genpts = 0;
307 static int lowres = 0;
308 static int idct = FF_IDCT_AUTO;
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                 if (is->subtitle_stream_changed) {
1404                     SDL_LockMutex(is->subpq_mutex);
1405
1406                     while (is->subpq_size) {
1407                         free_subpicture(&is->subpq[is->subpq_rindex]);
1408
1409                         /* update queue size and signal for next picture */
1410                         if (++is->subpq_rindex == SUBPICTURE_QUEUE_SIZE)
1411                             is->subpq_rindex = 0;
1412
1413                         is->subpq_size--;
1414                     }
1415                     is->subtitle_stream_changed = 0;
1416
1417                     SDL_CondSignal(is->subpq_cond);
1418                     SDL_UnlockMutex(is->subpq_mutex);
1419                 } else {
1420                     if (is->subpq_size > 0) {
1421                         sp = &is->subpq[is->subpq_rindex];
1422
1423                         if (is->subpq_size > 1)
1424                             sp2 = &is->subpq[(is->subpq_rindex + 1) % SUBPICTURE_QUEUE_SIZE];
1425                         else
1426                             sp2 = NULL;
1427
1428                         if ((is->vidclk.pts > (sp->pts + ((float) sp->sub.end_display_time / 1000)))
1429                                 || (sp2 && is->vidclk.pts > (sp2->pts + ((float) sp2->sub.start_display_time / 1000))))
1430                         {
1431                             free_subpicture(sp);
1432
1433                             /* update queue size and signal for next picture */
1434                             if (++is->subpq_rindex == SUBPICTURE_QUEUE_SIZE)
1435                                 is->subpq_rindex = 0;
1436
1437                             SDL_LockMutex(is->subpq_mutex);
1438                             is->subpq_size--;
1439                             SDL_CondSignal(is->subpq_cond);
1440                             SDL_UnlockMutex(is->subpq_mutex);
1441                         }
1442                     }
1443                 }
1444             }
1445
1446 display:
1447             /* display picture */
1448             if (!display_disable && is->show_mode == SHOW_MODE_VIDEO)
1449                 video_display(is);
1450
1451             pictq_next_picture(is);
1452
1453             if (is->step && !is->paused)
1454                 stream_toggle_pause(is);
1455         }
1456     }
1457     is->force_refresh = 0;
1458     if (show_status) {
1459         static int64_t last_time;
1460         int64_t cur_time;
1461         int aqsize, vqsize, sqsize;
1462         double av_diff;
1463
1464         cur_time = av_gettime();
1465         if (!last_time || (cur_time - last_time) >= 30000) {
1466             aqsize = 0;
1467             vqsize = 0;
1468             sqsize = 0;
1469             if (is->audio_st)
1470                 aqsize = is->audioq.size;
1471             if (is->video_st)
1472                 vqsize = is->videoq.size;
1473             if (is->subtitle_st)
1474                 sqsize = is->subtitleq.size;
1475             av_diff = 0;
1476             if (is->audio_st && is->video_st)
1477                 av_diff = get_clock(&is->audclk) - get_clock(&is->vidclk);
1478             else if (is->video_st)
1479                 av_diff = get_master_clock(is) - get_clock(&is->vidclk);
1480             else if (is->audio_st)
1481                 av_diff = get_master_clock(is) - get_clock(&is->audclk);
1482             av_log(NULL, AV_LOG_INFO,
1483                    "%7.2f %s:%7.3f fd=%4d aq=%5dKB vq=%5dKB sq=%5dB f=%"PRId64"/%"PRId64"   \r",
1484                    get_master_clock(is),
1485                    (is->audio_st && is->video_st) ? "A-V" : (is->video_st ? "M-V" : (is->audio_st ? "M-A" : "   ")),
1486                    av_diff,
1487                    is->frame_drops_early + is->frame_drops_late,
1488                    aqsize / 1024,
1489                    vqsize / 1024,
1490                    sqsize,
1491                    is->video_st ? is->video_st->codec->pts_correction_num_faulty_dts : 0,
1492                    is->video_st ? is->video_st->codec->pts_correction_num_faulty_pts : 0);
1493             fflush(stdout);
1494             last_time = cur_time;
1495         }
1496     }
1497 }
1498
1499 /* allocate a picture (needs to do that in main thread to avoid
1500    potential locking problems */
1501 static void alloc_picture(VideoState *is)
1502 {
1503     VideoPicture *vp;
1504     int64_t bufferdiff;
1505
1506     vp = &is->pictq[is->pictq_windex];
1507
1508     if (vp->bmp)
1509         SDL_FreeYUVOverlay(vp->bmp);
1510
1511     video_open(is, 0, vp);
1512
1513     vp->bmp = SDL_CreateYUVOverlay(vp->width, vp->height,
1514                                    SDL_YV12_OVERLAY,
1515                                    screen);
1516     bufferdiff = vp->bmp ? FFMAX(vp->bmp->pixels[0], vp->bmp->pixels[1]) - FFMIN(vp->bmp->pixels[0], vp->bmp->pixels[1]) : 0;
1517     if (!vp->bmp || vp->bmp->pitches[0] < vp->width || bufferdiff < (int64_t)vp->height * vp->bmp->pitches[0]) {
1518         /* SDL allocates a buffer smaller than requested if the video
1519          * overlay hardware is unable to support the requested size. */
1520         av_log(NULL, AV_LOG_FATAL,
1521                "Error: the video system does not support an image\n"
1522                         "size of %dx%d pixels. Try using -lowres or -vf \"scale=w:h\"\n"
1523                         "to reduce the image size.\n", vp->width, vp->height );
1524         do_exit(is);
1525     }
1526
1527     SDL_LockMutex(is->pictq_mutex);
1528     vp->allocated = 1;
1529     SDL_CondSignal(is->pictq_cond);
1530     SDL_UnlockMutex(is->pictq_mutex);
1531 }
1532
1533 static void duplicate_right_border_pixels(SDL_Overlay *bmp) {
1534     int i, width, height;
1535     Uint8 *p, *maxp;
1536     for (i = 0; i < 3; i++) {
1537         width  = bmp->w;
1538         height = bmp->h;
1539         if (i > 0) {
1540             width  >>= 1;
1541             height >>= 1;
1542         }
1543         if (bmp->pitches[i] > width) {
1544             maxp = bmp->pixels[i] + bmp->pitches[i] * height - 1;
1545             for (p = bmp->pixels[i] + width - 1; p < maxp; p += bmp->pitches[i])
1546                 *(p+1) = *p;
1547         }
1548     }
1549 }
1550
1551 static int queue_picture(VideoState *is, AVFrame *src_frame, double pts, int64_t pos, int serial)
1552 {
1553     VideoPicture *vp;
1554
1555 #if defined(DEBUG_SYNC) && 0
1556     printf("frame_type=%c pts=%0.3f\n",
1557            av_get_picture_type_char(src_frame->pict_type), pts);
1558 #endif
1559
1560     /* wait until we have space to put a new picture */
1561     SDL_LockMutex(is->pictq_mutex);
1562
1563     /* keep the last already displayed picture in the queue */
1564     while (is->pictq_size >= VIDEO_PICTURE_QUEUE_SIZE - 1 &&
1565            !is->videoq.abort_request) {
1566         SDL_CondWait(is->pictq_cond, is->pictq_mutex);
1567     }
1568     SDL_UnlockMutex(is->pictq_mutex);
1569
1570     if (is->videoq.abort_request)
1571         return -1;
1572
1573     vp = &is->pictq[is->pictq_windex];
1574
1575     vp->sar = src_frame->sample_aspect_ratio;
1576
1577     /* alloc or resize hardware picture buffer */
1578     if (!vp->bmp || vp->reallocate || !vp->allocated ||
1579         vp->width  != src_frame->width ||
1580         vp->height != src_frame->height) {
1581         SDL_Event event;
1582
1583         vp->allocated  = 0;
1584         vp->reallocate = 0;
1585         vp->width = src_frame->width;
1586         vp->height = src_frame->height;
1587
1588         /* the allocation must be done in the main thread to avoid
1589            locking problems. */
1590         event.type = FF_ALLOC_EVENT;
1591         event.user.data1 = is;
1592         SDL_PushEvent(&event);
1593
1594         /* wait until the picture is allocated */
1595         SDL_LockMutex(is->pictq_mutex);
1596         while (!vp->allocated && !is->videoq.abort_request) {
1597             SDL_CondWait(is->pictq_cond, is->pictq_mutex);
1598         }
1599         /* if the queue is aborted, we have to pop the pending ALLOC event or wait for the allocation to complete */
1600         if (is->videoq.abort_request && SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_EVENTMASK(FF_ALLOC_EVENT)) != 1) {
1601             while (!vp->allocated) {
1602                 SDL_CondWait(is->pictq_cond, is->pictq_mutex);
1603             }
1604         }
1605         SDL_UnlockMutex(is->pictq_mutex);
1606
1607         if (is->videoq.abort_request)
1608             return -1;
1609     }
1610
1611     /* if the frame is not skipped, then display it */
1612     if (vp->bmp) {
1613         AVPicture pict = { { 0 } };
1614
1615         /* get a pointer on the bitmap */
1616         SDL_LockYUVOverlay (vp->bmp);
1617
1618         pict.data[0] = vp->bmp->pixels[0];
1619         pict.data[1] = vp->bmp->pixels[2];
1620         pict.data[2] = vp->bmp->pixels[1];
1621
1622         pict.linesize[0] = vp->bmp->pitches[0];
1623         pict.linesize[1] = vp->bmp->pitches[2];
1624         pict.linesize[2] = vp->bmp->pitches[1];
1625
1626 #if CONFIG_AVFILTER
1627         // FIXME use direct rendering
1628         av_picture_copy(&pict, (AVPicture *)src_frame,
1629                         src_frame->format, vp->width, vp->height);
1630 #else
1631         av_opt_get_int(sws_opts, "sws_flags", 0, &sws_flags);
1632         is->img_convert_ctx = sws_getCachedContext(is->img_convert_ctx,
1633             vp->width, vp->height, src_frame->format, vp->width, vp->height,
1634             AV_PIX_FMT_YUV420P, sws_flags, NULL, NULL, NULL);
1635         if (is->img_convert_ctx == NULL) {
1636             av_log(NULL, AV_LOG_FATAL, "Cannot initialize the conversion context\n");
1637             exit(1);
1638         }
1639         sws_scale(is->img_convert_ctx, src_frame->data, src_frame->linesize,
1640                   0, vp->height, pict.data, pict.linesize);
1641 #endif
1642         /* workaround SDL PITCH_WORKAROUND */
1643         duplicate_right_border_pixels(vp->bmp);
1644         /* update the bitmap content */
1645         SDL_UnlockYUVOverlay(vp->bmp);
1646
1647         vp->pts = pts;
1648         vp->pos = pos;
1649         vp->serial = serial;
1650
1651         /* now we can update the picture count */
1652         if (++is->pictq_windex == VIDEO_PICTURE_QUEUE_SIZE)
1653             is->pictq_windex = 0;
1654         SDL_LockMutex(is->pictq_mutex);
1655         is->pictq_size++;
1656         SDL_UnlockMutex(is->pictq_mutex);
1657     }
1658     return 0;
1659 }
1660
1661 static int get_video_frame(VideoState *is, AVFrame *frame, AVPacket *pkt, int *serial)
1662 {
1663     int got_picture;
1664
1665     if (packet_queue_get(&is->videoq, pkt, 1, serial) < 0)
1666         return -1;
1667
1668     if (pkt->data == flush_pkt.data) {
1669         avcodec_flush_buffers(is->video_st->codec);
1670
1671         SDL_LockMutex(is->pictq_mutex);
1672         // Make sure there are no long delay timers (ideally we should just flush the queue but that's harder)
1673         while (is->pictq_size && !is->videoq.abort_request) {
1674             SDL_CondWait(is->pictq_cond, is->pictq_mutex);
1675         }
1676         is->video_current_pos = -1;
1677         is->frame_last_pts = AV_NOPTS_VALUE;
1678         is->frame_last_duration = 0;
1679         is->frame_timer = (double)av_gettime() / 1000000.0;
1680         is->frame_last_dropped_pts = AV_NOPTS_VALUE;
1681         SDL_UnlockMutex(is->pictq_mutex);
1682         return 0;
1683     }
1684
1685     if(avcodec_decode_video2(is->video_st->codec, frame, &got_picture, pkt) < 0)
1686         return 0;
1687
1688     if (got_picture) {
1689         int ret = 1;
1690         double dpts = NAN;
1691
1692         if (decoder_reorder_pts == -1) {
1693             frame->pts = av_frame_get_best_effort_timestamp(frame);
1694         } else if (decoder_reorder_pts) {
1695             frame->pts = frame->pkt_pts;
1696         } else {
1697             frame->pts = frame->pkt_dts;
1698         }
1699
1700         if (frame->pts != AV_NOPTS_VALUE)
1701             dpts = av_q2d(is->video_st->time_base) * frame->pts;
1702
1703         frame->sample_aspect_ratio = av_guess_sample_aspect_ratio(is->ic, is->video_st, frame);
1704
1705         if (framedrop>0 || (framedrop && get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER)) {
1706             SDL_LockMutex(is->pictq_mutex);
1707             if (is->frame_last_pts != AV_NOPTS_VALUE && frame->pts != AV_NOPTS_VALUE) {
1708                 double clockdiff = get_clock(&is->vidclk) - get_master_clock(is);
1709                 double ptsdiff = dpts - is->frame_last_pts;
1710                 if (!isnan(clockdiff) && fabs(clockdiff) < AV_NOSYNC_THRESHOLD &&
1711                     !isnan(ptsdiff) && ptsdiff > 0 && ptsdiff < AV_NOSYNC_THRESHOLD &&
1712                     clockdiff + ptsdiff - is->frame_last_filter_delay < 0 &&
1713                     is->videoq.nb_packets) {
1714                     is->frame_last_dropped_pos = pkt->pos;
1715                     is->frame_last_dropped_pts = dpts;
1716                     is->frame_last_dropped_serial = *serial;
1717                     is->frame_drops_early++;
1718                     av_frame_unref(frame);
1719                     ret = 0;
1720                 }
1721             }
1722             SDL_UnlockMutex(is->pictq_mutex);
1723         }
1724
1725         return ret;
1726     }
1727     return 0;
1728 }
1729
1730 #if CONFIG_AVFILTER
1731 static int configure_filtergraph(AVFilterGraph *graph, const char *filtergraph,
1732                                  AVFilterContext *source_ctx, AVFilterContext *sink_ctx)
1733 {
1734     int ret;
1735     AVFilterInOut *outputs = NULL, *inputs = NULL;
1736
1737     if (filtergraph) {
1738         outputs = avfilter_inout_alloc();
1739         inputs  = avfilter_inout_alloc();
1740         if (!outputs || !inputs) {
1741             ret = AVERROR(ENOMEM);
1742             goto fail;
1743         }
1744
1745         outputs->name       = av_strdup("in");
1746         outputs->filter_ctx = source_ctx;
1747         outputs->pad_idx    = 0;
1748         outputs->next       = NULL;
1749
1750         inputs->name        = av_strdup("out");
1751         inputs->filter_ctx  = sink_ctx;
1752         inputs->pad_idx     = 0;
1753         inputs->next        = NULL;
1754
1755         if ((ret = avfilter_graph_parse(graph, filtergraph, &inputs, &outputs, NULL)) < 0)
1756             goto fail;
1757     } else {
1758         if ((ret = avfilter_link(source_ctx, 0, sink_ctx, 0)) < 0)
1759             goto fail;
1760     }
1761
1762     ret = avfilter_graph_config(graph, NULL);
1763 fail:
1764     avfilter_inout_free(&outputs);
1765     avfilter_inout_free(&inputs);
1766     return ret;
1767 }
1768
1769 static int configure_video_filters(AVFilterGraph *graph, VideoState *is, const char *vfilters, AVFrame *frame)
1770 {
1771     static const enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE };
1772     char sws_flags_str[128];
1773     char buffersrc_args[256];
1774     int ret;
1775     AVFilterContext *filt_src = NULL, *filt_out = NULL, *filt_crop;
1776     AVCodecContext *codec = is->video_st->codec;
1777     AVRational fr = av_guess_frame_rate(is->ic, is->video_st, NULL);
1778
1779     av_opt_get_int(sws_opts, "sws_flags", 0, &sws_flags);
1780     snprintf(sws_flags_str, sizeof(sws_flags_str), "flags=%"PRId64, sws_flags);
1781     graph->scale_sws_opts = av_strdup(sws_flags_str);
1782
1783     snprintf(buffersrc_args, sizeof(buffersrc_args),
1784              "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
1785              frame->width, frame->height, frame->format,
1786              is->video_st->time_base.num, is->video_st->time_base.den,
1787              codec->sample_aspect_ratio.num, FFMAX(codec->sample_aspect_ratio.den, 1));
1788     if (fr.num && fr.den)
1789         av_strlcatf(buffersrc_args, sizeof(buffersrc_args), ":frame_rate=%d/%d", fr.num, fr.den);
1790
1791     if ((ret = avfilter_graph_create_filter(&filt_src,
1792                                             avfilter_get_by_name("buffer"),
1793                                             "ffplay_buffer", buffersrc_args, NULL,
1794                                             graph)) < 0)
1795         goto fail;
1796
1797     ret = avfilter_graph_create_filter(&filt_out,
1798                                        avfilter_get_by_name("buffersink"),
1799                                        "ffplay_buffersink", NULL, NULL, graph);
1800     if (ret < 0)
1801         goto fail;
1802
1803     if ((ret = av_opt_set_int_list(filt_out, "pix_fmts", pix_fmts,  AV_PIX_FMT_NONE, AV_OPT_SEARCH_CHILDREN)) < 0)
1804         goto fail;
1805
1806     /* SDL YUV code is not handling odd width/height for some driver
1807      * combinations, therefore we crop the picture to an even width/height. */
1808     if ((ret = avfilter_graph_create_filter(&filt_crop,
1809                                             avfilter_get_by_name("crop"),
1810                                             "ffplay_crop", "floor(in_w/2)*2:floor(in_h/2)*2", NULL, graph)) < 0)
1811         goto fail;
1812     if ((ret = avfilter_link(filt_crop, 0, filt_out, 0)) < 0)
1813         goto fail;
1814
1815     if ((ret = configure_filtergraph(graph, vfilters, filt_src, filt_crop)) < 0)
1816         goto fail;
1817
1818     is->in_video_filter  = filt_src;
1819     is->out_video_filter = filt_out;
1820
1821 fail:
1822     return ret;
1823 }
1824
1825 static int configure_audio_filters(VideoState *is, const char *afilters, int force_output_format)
1826 {
1827     static const enum AVSampleFormat sample_fmts[] = { AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE };
1828     int sample_rates[2] = { 0, -1 };
1829     int64_t channel_layouts[2] = { 0, -1 };
1830     int channels[2] = { 0, -1 };
1831     AVFilterContext *filt_asrc = NULL, *filt_asink = NULL;
1832     char asrc_args[256];
1833     int ret;
1834
1835     avfilter_graph_free(&is->agraph);
1836     if (!(is->agraph = avfilter_graph_alloc()))
1837         return AVERROR(ENOMEM);
1838
1839     ret = snprintf(asrc_args, sizeof(asrc_args),
1840                    "sample_rate=%d:sample_fmt=%s:channels=%d:time_base=%d/%d",
1841                    is->audio_filter_src.freq, av_get_sample_fmt_name(is->audio_filter_src.fmt),
1842                    is->audio_filter_src.channels,
1843                    1, is->audio_filter_src.freq);
1844     if (is->audio_filter_src.channel_layout)
1845         snprintf(asrc_args + ret, sizeof(asrc_args) - ret,
1846                  ":channel_layout=0x%"PRIx64,  is->audio_filter_src.channel_layout);
1847
1848     ret = avfilter_graph_create_filter(&filt_asrc,
1849                                        avfilter_get_by_name("abuffer"), "ffplay_abuffer",
1850                                        asrc_args, NULL, is->agraph);
1851     if (ret < 0)
1852         goto end;
1853
1854
1855     ret = avfilter_graph_create_filter(&filt_asink,
1856                                        avfilter_get_by_name("abuffersink"), "ffplay_abuffersink",
1857                                        NULL, NULL, is->agraph);
1858     if (ret < 0)
1859         goto end;
1860
1861     if ((ret = av_opt_set_int_list(filt_asink, "sample_fmts", sample_fmts,  AV_SAMPLE_FMT_NONE, AV_OPT_SEARCH_CHILDREN)) < 0)
1862         goto end;
1863     if ((ret = av_opt_set_int(filt_asink, "all_channel_counts", 1, AV_OPT_SEARCH_CHILDREN)) < 0)
1864         goto end;
1865
1866     if (force_output_format) {
1867         channel_layouts[0] = is->audio_tgt.channel_layout;
1868         channels       [0] = is->audio_tgt.channels;
1869         sample_rates   [0] = is->audio_tgt.freq;
1870         if ((ret = av_opt_set_int(filt_asink, "all_channel_counts", 0, AV_OPT_SEARCH_CHILDREN)) < 0)
1871             goto end;
1872         if ((ret = av_opt_set_int_list(filt_asink, "channel_layouts", channel_layouts,  -1, AV_OPT_SEARCH_CHILDREN)) < 0)
1873             goto end;
1874         if ((ret = av_opt_set_int_list(filt_asink, "channel_counts" , channels       ,  -1, AV_OPT_SEARCH_CHILDREN)) < 0)
1875             goto end;
1876         if ((ret = av_opt_set_int_list(filt_asink, "sample_rates"   , sample_rates   ,  -1, AV_OPT_SEARCH_CHILDREN)) < 0)
1877             goto end;
1878     }
1879
1880
1881     if ((ret = configure_filtergraph(is->agraph, afilters, filt_asrc, filt_asink)) < 0)
1882         goto end;
1883
1884     is->in_audio_filter  = filt_asrc;
1885     is->out_audio_filter = filt_asink;
1886
1887 end:
1888     if (ret < 0)
1889         avfilter_graph_free(&is->agraph);
1890     return ret;
1891 }
1892 #endif  /* CONFIG_AVFILTER */
1893
1894 static int video_thread(void *arg)
1895 {
1896     AVPacket pkt = { 0 };
1897     VideoState *is = arg;
1898     AVFrame *frame = av_frame_alloc();
1899     double pts;
1900     int ret;
1901     int serial = 0;
1902
1903 #if CONFIG_AVFILTER
1904     AVFilterGraph *graph = avfilter_graph_alloc();
1905     AVFilterContext *filt_out = NULL, *filt_in = NULL;
1906     int last_w = 0;
1907     int last_h = 0;
1908     enum AVPixelFormat last_format = -2;
1909     int last_serial = -1;
1910 #endif
1911
1912     for (;;) {
1913         while (is->paused && !is->videoq.abort_request)
1914             SDL_Delay(10);
1915
1916         avcodec_get_frame_defaults(frame);
1917         av_free_packet(&pkt);
1918
1919         ret = get_video_frame(is, frame, &pkt, &serial);
1920         if (ret < 0)
1921             goto the_end;
1922         if (!ret)
1923             continue;
1924
1925 #if CONFIG_AVFILTER
1926         if (   last_w != frame->width
1927             || last_h != frame->height
1928             || last_format != frame->format
1929             || last_serial != serial) {
1930             av_log(NULL, AV_LOG_DEBUG,
1931                    "Video frame changed from size:%dx%d format:%s serial:%d to size:%dx%d format:%s serial:%d\n",
1932                    last_w, last_h,
1933                    (const char *)av_x_if_null(av_get_pix_fmt_name(last_format), "none"), last_serial,
1934                    frame->width, frame->height,
1935                    (const char *)av_x_if_null(av_get_pix_fmt_name(frame->format), "none"), serial);
1936             avfilter_graph_free(&graph);
1937             graph = avfilter_graph_alloc();
1938             if ((ret = configure_video_filters(graph, is, vfilters, frame)) < 0) {
1939                 SDL_Event event;
1940                 event.type = FF_QUIT_EVENT;
1941                 event.user.data1 = is;
1942                 SDL_PushEvent(&event);
1943                 av_free_packet(&pkt);
1944                 goto the_end;
1945             }
1946             filt_in  = is->in_video_filter;
1947             filt_out = is->out_video_filter;
1948             last_w = frame->width;
1949             last_h = frame->height;
1950             last_format = frame->format;
1951             last_serial = serial;
1952         }
1953
1954         ret = av_buffersrc_add_frame(filt_in, frame);
1955         if (ret < 0)
1956             goto the_end;
1957         av_frame_unref(frame);
1958         avcodec_get_frame_defaults(frame);
1959         av_free_packet(&pkt);
1960
1961         while (ret >= 0) {
1962             is->frame_last_returned_time = av_gettime() / 1000000.0;
1963
1964             ret = av_buffersink_get_frame_flags(filt_out, frame, 0);
1965             if (ret < 0) {
1966                 ret = 0;
1967                 break;
1968             }
1969
1970             is->frame_last_filter_delay = av_gettime() / 1000000.0 - is->frame_last_returned_time;
1971             if (fabs(is->frame_last_filter_delay) > AV_NOSYNC_THRESHOLD / 10.0)
1972                 is->frame_last_filter_delay = 0;
1973
1974             pts = (frame->pts == AV_NOPTS_VALUE) ? NAN : frame->pts * av_q2d(filt_out->inputs[0]->time_base);
1975             ret = queue_picture(is, frame, pts, av_frame_get_pkt_pos(frame), serial);
1976             av_frame_unref(frame);
1977         }
1978 #else
1979         pts = (frame->pts == AV_NOPTS_VALUE) ? NAN : frame->pts * av_q2d(is->video_st->time_base);
1980         ret = queue_picture(is, frame, pts, pkt.pos, serial);
1981         av_frame_unref(frame);
1982 #endif
1983
1984         if (ret < 0)
1985             goto the_end;
1986     }
1987  the_end:
1988     avcodec_flush_buffers(is->video_st->codec);
1989 #if CONFIG_AVFILTER
1990     avfilter_graph_free(&graph);
1991 #endif
1992     av_free_packet(&pkt);
1993     av_frame_free(&frame);
1994     return 0;
1995 }
1996
1997 static int subtitle_thread(void *arg)
1998 {
1999     VideoState *is = arg;
2000     SubPicture *sp;
2001     AVPacket pkt1, *pkt = &pkt1;
2002     int got_subtitle;
2003     double pts;
2004     int i, j;
2005     int r, g, b, y, u, v, a;
2006
2007     for (;;) {
2008         while (is->paused && !is->subtitleq.abort_request) {
2009             SDL_Delay(10);
2010         }
2011         if (packet_queue_get(&is->subtitleq, pkt, 1, NULL) < 0)
2012             break;
2013
2014         if (pkt->data == flush_pkt.data) {
2015             avcodec_flush_buffers(is->subtitle_st->codec);
2016             continue;
2017         }
2018         SDL_LockMutex(is->subpq_mutex);
2019         while (is->subpq_size >= SUBPICTURE_QUEUE_SIZE &&
2020                !is->subtitleq.abort_request) {
2021             SDL_CondWait(is->subpq_cond, is->subpq_mutex);
2022         }
2023         SDL_UnlockMutex(is->subpq_mutex);
2024
2025         if (is->subtitleq.abort_request)
2026             return 0;
2027
2028         sp = &is->subpq[is->subpq_windex];
2029
2030        /* NOTE: ipts is the PTS of the _first_ picture beginning in
2031            this packet, if any */
2032         pts = 0;
2033         if (pkt->pts != AV_NOPTS_VALUE)
2034             pts = av_q2d(is->subtitle_st->time_base) * pkt->pts;
2035
2036         avcodec_decode_subtitle2(is->subtitle_st->codec, &sp->sub,
2037                                  &got_subtitle, pkt);
2038         if (got_subtitle && sp->sub.format == 0) {
2039             if (sp->sub.pts != AV_NOPTS_VALUE)
2040                 pts = sp->sub.pts / (double)AV_TIME_BASE;
2041             sp->pts = pts;
2042
2043             for (i = 0; i < sp->sub.num_rects; i++)
2044             {
2045                 for (j = 0; j < sp->sub.rects[i]->nb_colors; j++)
2046                 {
2047                     RGBA_IN(r, g, b, a, (uint32_t*)sp->sub.rects[i]->pict.data[1] + j);
2048                     y = RGB_TO_Y_CCIR(r, g, b);
2049                     u = RGB_TO_U_CCIR(r, g, b, 0);
2050                     v = RGB_TO_V_CCIR(r, g, b, 0);
2051                     YUVA_OUT((uint32_t*)sp->sub.rects[i]->pict.data[1] + j, y, u, v, a);
2052                 }
2053             }
2054
2055             /* now we can update the picture count */
2056             if (++is->subpq_windex == SUBPICTURE_QUEUE_SIZE)
2057                 is->subpq_windex = 0;
2058             SDL_LockMutex(is->subpq_mutex);
2059             is->subpq_size++;
2060             SDL_UnlockMutex(is->subpq_mutex);
2061         }
2062         av_free_packet(pkt);
2063     }
2064     return 0;
2065 }
2066
2067 /* copy samples for viewing in editor window */
2068 static void update_sample_display(VideoState *is, short *samples, int samples_size)
2069 {
2070     int size, len;
2071
2072     size = samples_size / sizeof(short);
2073     while (size > 0) {
2074         len = SAMPLE_ARRAY_SIZE - is->sample_array_index;
2075         if (len > size)
2076             len = size;
2077         memcpy(is->sample_array + is->sample_array_index, samples, len * sizeof(short));
2078         samples += len;
2079         is->sample_array_index += len;
2080         if (is->sample_array_index >= SAMPLE_ARRAY_SIZE)
2081             is->sample_array_index = 0;
2082         size -= len;
2083     }
2084 }
2085
2086 /* return the wanted number of samples to get better sync if sync_type is video
2087  * or external master clock */
2088 static int synchronize_audio(VideoState *is, int nb_samples)
2089 {
2090     int wanted_nb_samples = nb_samples;
2091
2092     /* if not master, then we try to remove or add samples to correct the clock */
2093     if (get_master_sync_type(is) != AV_SYNC_AUDIO_MASTER) {
2094         double diff, avg_diff;
2095         int min_nb_samples, max_nb_samples;
2096
2097         diff = get_clock(&is->audclk) - get_master_clock(is);
2098
2099         if (!isnan(diff) && fabs(diff) < AV_NOSYNC_THRESHOLD) {
2100             is->audio_diff_cum = diff + is->audio_diff_avg_coef * is->audio_diff_cum;
2101             if (is->audio_diff_avg_count < AUDIO_DIFF_AVG_NB) {
2102                 /* not enough measures to have a correct estimate */
2103                 is->audio_diff_avg_count++;
2104             } else {
2105                 /* estimate the A-V difference */
2106                 avg_diff = is->audio_diff_cum * (1.0 - is->audio_diff_avg_coef);
2107
2108                 if (fabs(avg_diff) >= is->audio_diff_threshold) {
2109                     wanted_nb_samples = nb_samples + (int)(diff * is->audio_src.freq);
2110                     min_nb_samples = ((nb_samples * (100 - SAMPLE_CORRECTION_PERCENT_MAX) / 100));
2111                     max_nb_samples = ((nb_samples * (100 + SAMPLE_CORRECTION_PERCENT_MAX) / 100));
2112                     wanted_nb_samples = FFMIN(FFMAX(wanted_nb_samples, min_nb_samples), max_nb_samples);
2113                 }
2114                 av_dlog(NULL, "diff=%f adiff=%f sample_diff=%d apts=%0.3f %f\n",
2115                         diff, avg_diff, wanted_nb_samples - nb_samples,
2116                         is->audio_clock, is->audio_diff_threshold);
2117             }
2118         } else {
2119             /* too big difference : may be initial PTS errors, so
2120                reset A-V filter */
2121             is->audio_diff_avg_count = 0;
2122             is->audio_diff_cum       = 0;
2123         }
2124     }
2125
2126     return wanted_nb_samples;
2127 }
2128
2129 /**
2130  * Decode one audio frame and return its uncompressed size.
2131  *
2132  * The processed audio frame is decoded, converted if required, and
2133  * stored in is->audio_buf, with size in bytes given by the return
2134  * value.
2135  */
2136 static int audio_decode_frame(VideoState *is)
2137 {
2138     AVPacket *pkt_temp = &is->audio_pkt_temp;
2139     AVPacket *pkt = &is->audio_pkt;
2140     AVCodecContext *dec = is->audio_st->codec;
2141     int len1, data_size, resampled_data_size;
2142     int64_t dec_channel_layout;
2143     int got_frame;
2144     av_unused double audio_clock0;
2145     int new_packet = 0;
2146     int flush_complete = 0;
2147     int wanted_nb_samples;
2148     AVRational tb;
2149     int ret;
2150     int reconfigure;
2151
2152     for (;;) {
2153         /* NOTE: the audio packet can contain several frames */
2154         while (pkt_temp->size > 0 || (!pkt_temp->data && new_packet) || is->audio_buf_frames_pending) {
2155             if (!is->frame) {
2156                 if (!(is->frame = avcodec_alloc_frame()))
2157                     return AVERROR(ENOMEM);
2158             } else {
2159                 av_frame_unref(is->frame);
2160                 avcodec_get_frame_defaults(is->frame);
2161             }
2162
2163             if (is->audioq.serial != is->audio_pkt_temp_serial)
2164                 break;
2165
2166             if (is->paused)
2167                 return -1;
2168
2169             if (!is->audio_buf_frames_pending) {
2170                 if (flush_complete)
2171                     break;
2172                 new_packet = 0;
2173                 len1 = avcodec_decode_audio4(dec, is->frame, &got_frame, pkt_temp);
2174                 if (len1 < 0) {
2175                     /* if error, we skip the frame */
2176                     pkt_temp->size = 0;
2177                     break;
2178                 }
2179
2180                 pkt_temp->data += len1;
2181                 pkt_temp->size -= len1;
2182
2183                 if (!got_frame) {
2184                     /* stop sending empty packets if the decoder is finished */
2185                     if (!pkt_temp->data && dec->codec->capabilities & CODEC_CAP_DELAY)
2186                         flush_complete = 1;
2187                     continue;
2188                 }
2189
2190                 tb = (AVRational){1, is->frame->sample_rate};
2191                 if (is->frame->pts != AV_NOPTS_VALUE)
2192                     is->frame->pts = av_rescale_q(is->frame->pts, dec->time_base, tb);
2193                 if (is->frame->pts == AV_NOPTS_VALUE && pkt_temp->pts != AV_NOPTS_VALUE)
2194                     is->frame->pts = av_rescale_q(pkt_temp->pts, is->audio_st->time_base, tb);
2195                 if (pkt_temp->pts != AV_NOPTS_VALUE)
2196                     pkt_temp->pts += (double) is->frame->nb_samples / is->frame->sample_rate / av_q2d(is->audio_st->time_base);
2197
2198 #if CONFIG_AVFILTER
2199                 dec_channel_layout = get_valid_channel_layout(is->frame->channel_layout, av_frame_get_channels(is->frame));
2200
2201                 reconfigure =
2202                     cmp_audio_fmts(is->audio_filter_src.fmt, is->audio_filter_src.channels,
2203                                    is->frame->format, av_frame_get_channels(is->frame))    ||
2204                     is->audio_filter_src.channel_layout != dec_channel_layout ||
2205                     is->audio_filter_src.freq           != is->frame->sample_rate ||
2206                     is->audio_pkt_temp_serial           != is->audio_last_serial;
2207
2208                 if (reconfigure) {
2209                     char buf1[1024], buf2[1024];
2210                     av_get_channel_layout_string(buf1, sizeof(buf1), -1, is->audio_filter_src.channel_layout);
2211                     av_get_channel_layout_string(buf2, sizeof(buf2), -1, dec_channel_layout);
2212                     av_log(NULL, AV_LOG_DEBUG,
2213                            "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",
2214                            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,
2215                            is->frame->sample_rate, av_frame_get_channels(is->frame), av_get_sample_fmt_name(is->frame->format), buf2, is->audio_pkt_temp_serial);
2216
2217                     is->audio_filter_src.fmt            = is->frame->format;
2218                     is->audio_filter_src.channels       = av_frame_get_channels(is->frame);
2219                     is->audio_filter_src.channel_layout = dec_channel_layout;
2220                     is->audio_filter_src.freq           = is->frame->sample_rate;
2221                     is->audio_last_serial               = is->audio_pkt_temp_serial;
2222
2223                     if ((ret = configure_audio_filters(is, afilters, 1)) < 0)
2224                         return ret;
2225                 }
2226
2227                 if ((ret = av_buffersrc_add_frame(is->in_audio_filter, is->frame)) < 0)
2228                     return ret;
2229                 av_frame_unref(is->frame);
2230 #endif
2231             }
2232 #if CONFIG_AVFILTER
2233             if ((ret = av_buffersink_get_frame_flags(is->out_audio_filter, is->frame, 0)) < 0) {
2234                 if (ret == AVERROR(EAGAIN)) {
2235                     is->audio_buf_frames_pending = 0;
2236                     continue;
2237                 }
2238                 return ret;
2239             }
2240             is->audio_buf_frames_pending = 1;
2241             tb = is->out_audio_filter->inputs[0]->time_base;
2242 #endif
2243
2244             data_size = av_samples_get_buffer_size(NULL, av_frame_get_channels(is->frame),
2245                                                    is->frame->nb_samples,
2246                                                    is->frame->format, 1);
2247
2248             dec_channel_layout =
2249                 (is->frame->channel_layout && av_frame_get_channels(is->frame) == av_get_channel_layout_nb_channels(is->frame->channel_layout)) ?
2250                 is->frame->channel_layout : av_get_default_channel_layout(av_frame_get_channels(is->frame));
2251             wanted_nb_samples = synchronize_audio(is, is->frame->nb_samples);
2252
2253             if (is->frame->format        != is->audio_src.fmt            ||
2254                 dec_channel_layout       != is->audio_src.channel_layout ||
2255                 is->frame->sample_rate   != is->audio_src.freq           ||
2256                 (wanted_nb_samples       != is->frame->nb_samples && !is->swr_ctx)) {
2257                 swr_free(&is->swr_ctx);
2258                 is->swr_ctx = swr_alloc_set_opts(NULL,
2259                                                  is->audio_tgt.channel_layout, is->audio_tgt.fmt, is->audio_tgt.freq,
2260                                                  dec_channel_layout,           is->frame->format, is->frame->sample_rate,
2261                                                  0, NULL);
2262                 if (!is->swr_ctx || swr_init(is->swr_ctx) < 0) {
2263                     av_log(NULL, AV_LOG_ERROR,
2264                            "Cannot create sample rate converter for conversion of %d Hz %s %d channels to %d Hz %s %d channels!\n",
2265                             is->frame->sample_rate, av_get_sample_fmt_name(is->frame->format), av_frame_get_channels(is->frame),
2266                             is->audio_tgt.freq, av_get_sample_fmt_name(is->audio_tgt.fmt), is->audio_tgt.channels);
2267                     break;
2268                 }
2269                 is->audio_src.channel_layout = dec_channel_layout;
2270                 is->audio_src.channels       = av_frame_get_channels(is->frame);
2271                 is->audio_src.freq = is->frame->sample_rate;
2272                 is->audio_src.fmt = is->frame->format;
2273             }
2274
2275             if (is->swr_ctx) {
2276                 const uint8_t **in = (const uint8_t **)is->frame->extended_data;
2277                 uint8_t **out = &is->audio_buf1;
2278                 int out_count = (int64_t)wanted_nb_samples * is->audio_tgt.freq / is->frame->sample_rate + 256;
2279                 int out_size  = av_samples_get_buffer_size(NULL, is->audio_tgt.channels, out_count, is->audio_tgt.fmt, 0);
2280                 int len2;
2281                 if (out_size < 0) {
2282                     av_log(NULL, AV_LOG_ERROR, "av_samples_get_buffer_size() failed\n");
2283                     break;
2284                 }
2285                 if (wanted_nb_samples != is->frame->nb_samples) {
2286                     if (swr_set_compensation(is->swr_ctx, (wanted_nb_samples - is->frame->nb_samples) * is->audio_tgt.freq / is->frame->sample_rate,
2287                                                 wanted_nb_samples * is->audio_tgt.freq / is->frame->sample_rate) < 0) {
2288                         av_log(NULL, AV_LOG_ERROR, "swr_set_compensation() failed\n");
2289                         break;
2290                     }
2291                 }
2292                 av_fast_malloc(&is->audio_buf1, &is->audio_buf1_size, out_size);
2293                 if (!is->audio_buf1)
2294                     return AVERROR(ENOMEM);
2295                 len2 = swr_convert(is->swr_ctx, out, out_count, in, is->frame->nb_samples);
2296                 if (len2 < 0) {
2297                     av_log(NULL, AV_LOG_ERROR, "swr_convert() failed\n");
2298                     break;
2299                 }
2300                 if (len2 == out_count) {
2301                     av_log(NULL, AV_LOG_WARNING, "audio buffer is probably too small\n");
2302                     swr_init(is->swr_ctx);
2303                 }
2304                 is->audio_buf = is->audio_buf1;
2305                 resampled_data_size = len2 * is->audio_tgt.channels * av_get_bytes_per_sample(is->audio_tgt.fmt);
2306             } else {
2307                 is->audio_buf = is->frame->data[0];
2308                 resampled_data_size = data_size;
2309             }
2310
2311             audio_clock0 = is->audio_clock;
2312             /* update the audio clock with the pts */
2313             if (is->frame->pts != AV_NOPTS_VALUE) {
2314                 is->audio_clock = is->frame->pts * av_q2d(tb) + (double) is->frame->nb_samples / is->frame->sample_rate;
2315                 is->audio_clock_serial = is->audio_pkt_temp_serial;
2316             }
2317 #ifdef DEBUG
2318             {
2319                 static double last_clock;
2320                 printf("audio: delay=%0.3f clock=%0.3f clock0=%0.3f\n",
2321                        is->audio_clock - last_clock,
2322                        is->audio_clock, audio_clock0);
2323                 last_clock = is->audio_clock;
2324             }
2325 #endif
2326             return resampled_data_size;
2327         }
2328
2329         /* free the current packet */
2330         if (pkt->data)
2331             av_free_packet(pkt);
2332         memset(pkt_temp, 0, sizeof(*pkt_temp));
2333
2334         if (is->audioq.abort_request) {
2335             return -1;
2336         }
2337
2338         if (is->audioq.nb_packets == 0)
2339             SDL_CondSignal(is->continue_read_thread);
2340
2341         /* read next packet */
2342         if ((new_packet = packet_queue_get(&is->audioq, pkt, 1, &is->audio_pkt_temp_serial)) < 0)
2343             return -1;
2344
2345         if (pkt->data == flush_pkt.data) {
2346             avcodec_flush_buffers(dec);
2347             flush_complete = 0;
2348             is->audio_buf_frames_pending = 0;
2349         }
2350
2351         *pkt_temp = *pkt;
2352     }
2353 }
2354
2355 /* prepare a new audio buffer */
2356 static void sdl_audio_callback(void *opaque, Uint8 *stream, int len)
2357 {
2358     VideoState *is = opaque;
2359     int audio_size, len1;
2360     int bytes_per_sec;
2361     int frame_size = av_samples_get_buffer_size(NULL, is->audio_tgt.channels, 1, is->audio_tgt.fmt, 1);
2362
2363     audio_callback_time = av_gettime();
2364
2365     while (len > 0) {
2366         if (is->audio_buf_index >= is->audio_buf_size) {
2367            audio_size = audio_decode_frame(is);
2368            if (audio_size < 0) {
2369                 /* if error, just output silence */
2370                is->audio_buf      = is->silence_buf;
2371                is->audio_buf_size = sizeof(is->silence_buf) / frame_size * frame_size;
2372            } else {
2373                if (is->show_mode != SHOW_MODE_VIDEO)
2374                    update_sample_display(is, (int16_t *)is->audio_buf, audio_size);
2375                is->audio_buf_size = audio_size;
2376            }
2377            is->audio_buf_index = 0;
2378         }
2379         len1 = is->audio_buf_size - is->audio_buf_index;
2380         if (len1 > len)
2381             len1 = len;
2382         memcpy(stream, (uint8_t *)is->audio_buf + is->audio_buf_index, len1);
2383         len -= len1;
2384         stream += len1;
2385         is->audio_buf_index += len1;
2386     }
2387     bytes_per_sec = is->audio_tgt.freq * is->audio_tgt.channels * av_get_bytes_per_sample(is->audio_tgt.fmt);
2388     is->audio_write_buf_size = is->audio_buf_size - is->audio_buf_index;
2389     /* Let's assume the audio driver that is used by SDL has two periods. */
2390     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);
2391     sync_clock_to_slave(&is->extclk, &is->audclk);
2392 }
2393
2394 static int audio_open(void *opaque, int64_t wanted_channel_layout, int wanted_nb_channels, int wanted_sample_rate, struct AudioParams *audio_hw_params)
2395 {
2396     SDL_AudioSpec wanted_spec, spec;
2397     const char *env;
2398     const int next_nb_channels[] = {0, 0, 1, 6, 2, 6, 4, 6};
2399
2400     env = SDL_getenv("SDL_AUDIO_CHANNELS");
2401     if (env) {
2402         wanted_nb_channels = atoi(env);
2403         wanted_channel_layout = av_get_default_channel_layout(wanted_nb_channels);
2404     }
2405     if (!wanted_channel_layout || wanted_nb_channels != av_get_channel_layout_nb_channels(wanted_channel_layout)) {
2406         wanted_channel_layout = av_get_default_channel_layout(wanted_nb_channels);
2407         wanted_channel_layout &= ~AV_CH_LAYOUT_STEREO_DOWNMIX;
2408     }
2409     wanted_spec.channels = av_get_channel_layout_nb_channels(wanted_channel_layout);
2410     wanted_spec.freq = wanted_sample_rate;
2411     if (wanted_spec.freq <= 0 || wanted_spec.channels <= 0) {
2412         av_log(NULL, AV_LOG_ERROR, "Invalid sample rate or channel count!\n");
2413         return -1;
2414     }
2415     wanted_spec.format = AUDIO_S16SYS;
2416     wanted_spec.silence = 0;
2417     wanted_spec.samples = SDL_AUDIO_BUFFER_SIZE;
2418     wanted_spec.callback = sdl_audio_callback;
2419     wanted_spec.userdata = opaque;
2420     while (SDL_OpenAudio(&wanted_spec, &spec) < 0) {
2421         av_log(NULL, AV_LOG_WARNING, "SDL_OpenAudio (%d channels): %s\n", wanted_spec.channels, SDL_GetError());
2422         wanted_spec.channels = next_nb_channels[FFMIN(7, wanted_spec.channels)];
2423         if (!wanted_spec.channels) {
2424             av_log(NULL, AV_LOG_ERROR,
2425                    "No more channel combinations to try, audio open failed\n");
2426             return -1;
2427         }
2428         wanted_channel_layout = av_get_default_channel_layout(wanted_spec.channels);
2429     }
2430     if (spec.format != AUDIO_S16SYS) {
2431         av_log(NULL, AV_LOG_ERROR,
2432                "SDL advised audio format %d is not supported!\n", spec.format);
2433         return -1;
2434     }
2435     if (spec.channels != wanted_spec.channels) {
2436         wanted_channel_layout = av_get_default_channel_layout(spec.channels);
2437         if (!wanted_channel_layout) {
2438             av_log(NULL, AV_LOG_ERROR,
2439                    "SDL advised channel count %d is not supported!\n", spec.channels);
2440             return -1;
2441         }
2442     }
2443
2444     audio_hw_params->fmt = AV_SAMPLE_FMT_S16;
2445     audio_hw_params->freq = spec.freq;
2446     audio_hw_params->channel_layout = wanted_channel_layout;
2447     audio_hw_params->channels =  spec.channels;
2448     return spec.size;
2449 }
2450
2451 /* open a given stream. Return 0 if OK */
2452 static int stream_component_open(VideoState *is, int stream_index)
2453 {
2454     AVFormatContext *ic = is->ic;
2455     AVCodecContext *avctx;
2456     AVCodec *codec;
2457     const char *forced_codec_name = NULL;
2458     AVDictionary *opts;
2459     AVDictionaryEntry *t = NULL;
2460     int sample_rate, nb_channels;
2461     int64_t channel_layout;
2462     int ret;
2463
2464     if (stream_index < 0 || stream_index >= ic->nb_streams)
2465         return -1;
2466     avctx = ic->streams[stream_index]->codec;
2467
2468     codec = avcodec_find_decoder(avctx->codec_id);
2469
2470     switch(avctx->codec_type){
2471         case AVMEDIA_TYPE_AUDIO   : is->last_audio_stream    = stream_index; forced_codec_name =    audio_codec_name; break;
2472         case AVMEDIA_TYPE_SUBTITLE: is->last_subtitle_stream = stream_index; forced_codec_name = subtitle_codec_name; break;
2473         case AVMEDIA_TYPE_VIDEO   : is->last_video_stream    = stream_index; forced_codec_name =    video_codec_name; break;
2474     }
2475     if (forced_codec_name)
2476         codec = avcodec_find_decoder_by_name(forced_codec_name);
2477     if (!codec) {
2478         if (forced_codec_name) av_log(NULL, AV_LOG_WARNING,
2479                                       "No codec could be found with name '%s'\n", forced_codec_name);
2480         else                   av_log(NULL, AV_LOG_WARNING,
2481                                       "No codec could be found with id %d\n", avctx->codec_id);
2482         return -1;
2483     }
2484
2485     avctx->codec_id = codec->id;
2486     avctx->workaround_bugs   = workaround_bugs;
2487     avctx->lowres            = lowres;
2488     if(avctx->lowres > codec->max_lowres){
2489         av_log(avctx, AV_LOG_WARNING, "The maximum value for lowres supported by the decoder is %d\n",
2490                 codec->max_lowres);
2491         avctx->lowres= codec->max_lowres;
2492     }
2493     avctx->idct_algo         = idct;
2494     avctx->error_concealment = error_concealment;
2495
2496     if(avctx->lowres) avctx->flags |= CODEC_FLAG_EMU_EDGE;
2497     if (fast)   avctx->flags2 |= CODEC_FLAG2_FAST;
2498     if(codec->capabilities & CODEC_CAP_DR1)
2499         avctx->flags |= CODEC_FLAG_EMU_EDGE;
2500
2501     opts = filter_codec_opts(codec_opts, avctx->codec_id, ic, ic->streams[stream_index], codec);
2502     if (!av_dict_get(opts, "threads", NULL, 0))
2503         av_dict_set(&opts, "threads", "auto", 0);
2504     if (avctx->lowres)
2505         av_dict_set(&opts, "lowres", av_asprintf("%d", avctx->lowres), AV_DICT_DONT_STRDUP_VAL);
2506     if (avctx->codec_type == AVMEDIA_TYPE_VIDEO || avctx->codec_type == AVMEDIA_TYPE_AUDIO)
2507         av_dict_set(&opts, "refcounted_frames", "1", 0);
2508     if (avcodec_open2(avctx, codec, &opts) < 0)
2509         return -1;
2510     if ((t = av_dict_get(opts, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
2511         av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
2512         return AVERROR_OPTION_NOT_FOUND;
2513     }
2514
2515     ic->streams[stream_index]->discard = AVDISCARD_DEFAULT;
2516     switch (avctx->codec_type) {
2517     case AVMEDIA_TYPE_AUDIO:
2518 #if CONFIG_AVFILTER
2519         {
2520             AVFilterLink *link;
2521
2522             is->audio_filter_src.freq           = avctx->sample_rate;
2523             is->audio_filter_src.channels       = avctx->channels;
2524             is->audio_filter_src.channel_layout = get_valid_channel_layout(avctx->channel_layout, avctx->channels);
2525             is->audio_filter_src.fmt            = avctx->sample_fmt;
2526             if ((ret = configure_audio_filters(is, afilters, 0)) < 0)
2527                 return ret;
2528             link = is->out_audio_filter->inputs[0];
2529             sample_rate    = link->sample_rate;
2530             nb_channels    = link->channels;
2531             channel_layout = link->channel_layout;
2532         }
2533 #else
2534         sample_rate    = avctx->sample_rate;
2535         nb_channels    = avctx->channels;
2536         channel_layout = avctx->channel_layout;
2537 #endif
2538
2539         /* prepare audio output */
2540         if ((ret = audio_open(is, channel_layout, nb_channels, sample_rate, &is->audio_tgt)) < 0)
2541             return ret;
2542         is->audio_hw_buf_size = ret;
2543         is->audio_src = is->audio_tgt;
2544         is->audio_buf_size  = 0;
2545         is->audio_buf_index = 0;
2546
2547         /* init averaging filter */
2548         is->audio_diff_avg_coef  = exp(log(0.01) / AUDIO_DIFF_AVG_NB);
2549         is->audio_diff_avg_count = 0;
2550         /* since we do not have a precise anough audio fifo fullness,
2551            we correct audio sync only if larger than this threshold */
2552         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);
2553
2554         memset(&is->audio_pkt, 0, sizeof(is->audio_pkt));
2555         memset(&is->audio_pkt_temp, 0, sizeof(is->audio_pkt_temp));
2556
2557         is->audio_stream = stream_index;
2558         is->audio_st = ic->streams[stream_index];
2559
2560         packet_queue_start(&is->audioq);
2561         SDL_PauseAudio(0);
2562         break;
2563     case AVMEDIA_TYPE_VIDEO:
2564         is->video_stream = stream_index;
2565         is->video_st = ic->streams[stream_index];
2566
2567         packet_queue_start(&is->videoq);
2568         is->video_tid = SDL_CreateThread(video_thread, is);
2569         is->queue_attachments_req = 1;
2570         break;
2571     case AVMEDIA_TYPE_SUBTITLE:
2572         is->subtitle_stream = stream_index;
2573         is->subtitle_st = ic->streams[stream_index];
2574         packet_queue_start(&is->subtitleq);
2575
2576         is->subtitle_tid = SDL_CreateThread(subtitle_thread, is);
2577         break;
2578     default:
2579         break;
2580     }
2581     return 0;
2582 }
2583
2584 static void stream_component_close(VideoState *is, int stream_index)
2585 {
2586     AVFormatContext *ic = is->ic;
2587     AVCodecContext *avctx;
2588
2589     if (stream_index < 0 || stream_index >= ic->nb_streams)
2590         return;
2591     avctx = ic->streams[stream_index]->codec;
2592
2593     switch (avctx->codec_type) {
2594     case AVMEDIA_TYPE_AUDIO:
2595         packet_queue_abort(&is->audioq);
2596
2597         SDL_CloseAudio();
2598
2599         packet_queue_flush(&is->audioq);
2600         av_free_packet(&is->audio_pkt);
2601         swr_free(&is->swr_ctx);
2602         av_freep(&is->audio_buf1);
2603         is->audio_buf1_size = 0;
2604         is->audio_buf = NULL;
2605         av_frame_free(&is->frame);
2606
2607         if (is->rdft) {
2608             av_rdft_end(is->rdft);
2609             av_freep(&is->rdft_data);
2610             is->rdft = NULL;
2611             is->rdft_bits = 0;
2612         }
2613 #if CONFIG_AVFILTER
2614         avfilter_graph_free(&is->agraph);
2615 #endif
2616         break;
2617     case AVMEDIA_TYPE_VIDEO:
2618         packet_queue_abort(&is->videoq);
2619
2620         /* note: we also signal this mutex to make sure we deblock the
2621            video thread in all cases */
2622         SDL_LockMutex(is->pictq_mutex);
2623         SDL_CondSignal(is->pictq_cond);
2624         SDL_UnlockMutex(is->pictq_mutex);
2625
2626         SDL_WaitThread(is->video_tid, NULL);
2627
2628         packet_queue_flush(&is->videoq);
2629         break;
2630     case AVMEDIA_TYPE_SUBTITLE:
2631         packet_queue_abort(&is->subtitleq);
2632
2633         /* note: we also signal this mutex to make sure we deblock the
2634            video thread in all cases */
2635         SDL_LockMutex(is->subpq_mutex);
2636         is->subtitle_stream_changed = 1;
2637
2638         SDL_CondSignal(is->subpq_cond);
2639         SDL_UnlockMutex(is->subpq_mutex);
2640
2641         SDL_WaitThread(is->subtitle_tid, NULL);
2642
2643         packet_queue_flush(&is->subtitleq);
2644         break;
2645     default:
2646         break;
2647     }
2648
2649     ic->streams[stream_index]->discard = AVDISCARD_ALL;
2650     avcodec_close(avctx);
2651     switch (avctx->codec_type) {
2652     case AVMEDIA_TYPE_AUDIO:
2653         is->audio_st = NULL;
2654         is->audio_stream = -1;
2655         break;
2656     case AVMEDIA_TYPE_VIDEO:
2657         is->video_st = NULL;
2658         is->video_stream = -1;
2659         break;
2660     case AVMEDIA_TYPE_SUBTITLE:
2661         is->subtitle_st = NULL;
2662         is->subtitle_stream = -1;
2663         break;
2664     default:
2665         break;
2666     }
2667 }
2668
2669 static int decode_interrupt_cb(void *ctx)
2670 {
2671     VideoState *is = ctx;
2672     return is->abort_request;
2673 }
2674
2675 static int is_realtime(AVFormatContext *s)
2676 {
2677     if(   !strcmp(s->iformat->name, "rtp")
2678        || !strcmp(s->iformat->name, "rtsp")
2679        || !strcmp(s->iformat->name, "sdp")
2680     )
2681         return 1;
2682
2683     if(s->pb && (   !strncmp(s->filename, "rtp:", 4)
2684                  || !strncmp(s->filename, "udp:", 4)
2685                 )
2686     )
2687         return 1;
2688     return 0;
2689 }
2690
2691 /* this thread gets the stream from the disk or the network */
2692 static int read_thread(void *arg)
2693 {
2694     VideoState *is = arg;
2695     AVFormatContext *ic = NULL;
2696     int err, i, ret;
2697     int st_index[AVMEDIA_TYPE_NB];
2698     AVPacket pkt1, *pkt = &pkt1;
2699     int eof = 0;
2700     int pkt_in_play_range = 0;
2701     AVDictionaryEntry *t;
2702     AVDictionary **opts;
2703     int orig_nb_streams;
2704     SDL_mutex *wait_mutex = SDL_CreateMutex();
2705
2706     memset(st_index, -1, sizeof(st_index));
2707     is->last_video_stream = is->video_stream = -1;
2708     is->last_audio_stream = is->audio_stream = -1;
2709     is->last_subtitle_stream = is->subtitle_stream = -1;
2710
2711     ic = avformat_alloc_context();
2712     ic->interrupt_callback.callback = decode_interrupt_cb;
2713     ic->interrupt_callback.opaque = is;
2714     err = avformat_open_input(&ic, is->filename, is->iformat, &format_opts);
2715     if (err < 0) {
2716         print_error(is->filename, err);
2717         ret = -1;
2718         goto fail;
2719     }
2720     if ((t = av_dict_get(format_opts, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
2721         av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
2722         ret = AVERROR_OPTION_NOT_FOUND;
2723         goto fail;
2724     }
2725     is->ic = ic;
2726
2727     if (genpts)
2728         ic->flags |= AVFMT_FLAG_GENPTS;
2729
2730     opts = setup_find_stream_info_opts(ic, codec_opts);
2731     orig_nb_streams = ic->nb_streams;
2732
2733     err = avformat_find_stream_info(ic, opts);
2734     if (err < 0) {
2735         av_log(NULL, AV_LOG_WARNING,
2736                "%s: could not find codec parameters\n", is->filename);
2737         ret = -1;
2738         goto fail;
2739     }
2740     for (i = 0; i < orig_nb_streams; i++)
2741         av_dict_free(&opts[i]);
2742     av_freep(&opts);
2743
2744     if (ic->pb)
2745         ic->pb->eof_reached = 0; // FIXME hack, ffplay maybe should not use url_feof() to test for the end
2746
2747     if (seek_by_bytes < 0)
2748         seek_by_bytes = !!(ic->iformat->flags & AVFMT_TS_DISCONT) && strcmp("ogg", ic->iformat->name);
2749
2750     is->max_frame_duration = (ic->iformat->flags & AVFMT_TS_DISCONT) ? 10.0 : 3600.0;
2751
2752     if (!window_title && (t = av_dict_get(ic->metadata, "title", NULL, 0)))
2753         window_title = av_asprintf("%s - %s", t->value, input_filename);
2754
2755     /* if seeking requested, we execute it */
2756     if (start_time != AV_NOPTS_VALUE) {
2757         int64_t timestamp;
2758
2759         timestamp = start_time;
2760         /* add the stream start time */
2761         if (ic->start_time != AV_NOPTS_VALUE)
2762             timestamp += ic->start_time;
2763         ret = avformat_seek_file(ic, -1, INT64_MIN, timestamp, INT64_MAX, 0);
2764         if (ret < 0) {
2765             av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
2766                     is->filename, (double)timestamp / AV_TIME_BASE);
2767         }
2768     }
2769
2770     is->realtime = is_realtime(ic);
2771
2772     for (i = 0; i < ic->nb_streams; i++)
2773         ic->streams[i]->discard = AVDISCARD_ALL;
2774     if (!video_disable)
2775         st_index[AVMEDIA_TYPE_VIDEO] =
2776             av_find_best_stream(ic, AVMEDIA_TYPE_VIDEO,
2777                                 wanted_stream[AVMEDIA_TYPE_VIDEO], -1, NULL, 0);
2778     if (!audio_disable)
2779         st_index[AVMEDIA_TYPE_AUDIO] =
2780             av_find_best_stream(ic, AVMEDIA_TYPE_AUDIO,
2781                                 wanted_stream[AVMEDIA_TYPE_AUDIO],
2782                                 st_index[AVMEDIA_TYPE_VIDEO],
2783                                 NULL, 0);
2784     if (!video_disable && !subtitle_disable)
2785         st_index[AVMEDIA_TYPE_SUBTITLE] =
2786             av_find_best_stream(ic, AVMEDIA_TYPE_SUBTITLE,
2787                                 wanted_stream[AVMEDIA_TYPE_SUBTITLE],
2788                                 (st_index[AVMEDIA_TYPE_AUDIO] >= 0 ?
2789                                  st_index[AVMEDIA_TYPE_AUDIO] :
2790                                  st_index[AVMEDIA_TYPE_VIDEO]),
2791                                 NULL, 0);
2792     if (show_status) {
2793         av_dump_format(ic, 0, is->filename, 0);
2794     }
2795
2796     is->show_mode = show_mode;
2797
2798     /* open the streams */
2799     if (st_index[AVMEDIA_TYPE_AUDIO] >= 0) {
2800         stream_component_open(is, st_index[AVMEDIA_TYPE_AUDIO]);
2801     }
2802
2803     ret = -1;
2804     if (st_index[AVMEDIA_TYPE_VIDEO] >= 0) {
2805         ret = stream_component_open(is, st_index[AVMEDIA_TYPE_VIDEO]);
2806     }
2807     if (is->show_mode == SHOW_MODE_NONE)
2808         is->show_mode = ret >= 0 ? SHOW_MODE_VIDEO : SHOW_MODE_RDFT;
2809
2810     if (st_index[AVMEDIA_TYPE_SUBTITLE] >= 0) {
2811         stream_component_open(is, st_index[AVMEDIA_TYPE_SUBTITLE]);
2812     }
2813
2814     if (is->video_stream < 0 && is->audio_stream < 0) {
2815         av_log(NULL, AV_LOG_FATAL, "%s: could not open codecs\n", is->filename);
2816         ret = -1;
2817         goto fail;
2818     }
2819
2820     if (infinite_buffer < 0 && is->realtime)
2821         infinite_buffer = 1;
2822
2823     for (;;) {
2824         if (is->abort_request)
2825             break;
2826         if (is->paused != is->last_paused) {
2827             is->last_paused = is->paused;
2828             if (is->paused)
2829                 is->read_pause_return = av_read_pause(ic);
2830             else
2831                 av_read_play(ic);
2832         }
2833 #if CONFIG_RTSP_DEMUXER || CONFIG_MMSH_PROTOCOL
2834         if (is->paused &&
2835                 (!strcmp(ic->iformat->name, "rtsp") ||
2836                  (ic->pb && !strncmp(input_filename, "mmsh:", 5)))) {
2837             /* wait 10 ms to avoid trying to get another packet */
2838             /* XXX: horrible */
2839             SDL_Delay(10);
2840             continue;
2841         }
2842 #endif
2843         if (is->seek_req) {
2844             int64_t seek_target = is->seek_pos;
2845             int64_t seek_min    = is->seek_rel > 0 ? seek_target - is->seek_rel + 2: INT64_MIN;
2846             int64_t seek_max    = is->seek_rel < 0 ? seek_target - is->seek_rel - 2: INT64_MAX;
2847 // FIXME the +-2 is due to rounding being not done in the correct direction in generation
2848 //      of the seek_pos/seek_rel variables
2849
2850             ret = avformat_seek_file(is->ic, -1, seek_min, seek_target, seek_max, is->seek_flags);
2851             if (ret < 0) {
2852                 av_log(NULL, AV_LOG_ERROR,
2853                        "%s: error while seeking\n", is->ic->filename);
2854             } else {
2855                 if (is->audio_stream >= 0) {
2856                     packet_queue_flush(&is->audioq);
2857                     packet_queue_put(&is->audioq, &flush_pkt);
2858                 }
2859                 if (is->subtitle_stream >= 0) {
2860                     packet_queue_flush(&is->subtitleq);
2861                     packet_queue_put(&is->subtitleq, &flush_pkt);
2862                 }
2863                 if (is->video_stream >= 0) {
2864                     packet_queue_flush(&is->videoq);
2865                     packet_queue_put(&is->videoq, &flush_pkt);
2866                 }
2867                 if (is->seek_flags & AVSEEK_FLAG_BYTE) {
2868                    set_clock(&is->extclk, NAN, 0);
2869                 } else {
2870                    set_clock(&is->extclk, seek_target / (double)AV_TIME_BASE, 0);
2871                 }
2872             }
2873             is->seek_req = 0;
2874             is->queue_attachments_req = 1;
2875             eof = 0;
2876             if (is->paused)
2877                 step_to_next_frame(is);
2878         }
2879         if (is->queue_attachments_req) {
2880             if (is->video_st && is->video_st->disposition & AV_DISPOSITION_ATTACHED_PIC) {
2881                 AVPacket copy;
2882                 if ((ret = av_copy_packet(&copy, &is->video_st->attached_pic)) < 0)
2883                     goto fail;
2884                 packet_queue_put(&is->videoq, &copy);
2885             }
2886             is->queue_attachments_req = 0;
2887         }
2888
2889         /* if the queue are full, no need to read more */
2890         if (infinite_buffer<1 &&
2891               (is->audioq.size + is->videoq.size + is->subtitleq.size > MAX_QUEUE_SIZE
2892             || (   (is->audioq   .nb_packets > MIN_FRAMES || is->audio_stream < 0 || is->audioq.abort_request)
2893                 && (is->videoq   .nb_packets > MIN_FRAMES || is->video_stream < 0 || is->videoq.abort_request
2894                     || (is->video_st->disposition & AV_DISPOSITION_ATTACHED_PIC))
2895                 && (is->subtitleq.nb_packets > MIN_FRAMES || is->subtitle_stream < 0 || is->subtitleq.abort_request)))) {
2896             /* wait 10 ms */
2897             SDL_LockMutex(wait_mutex);
2898             SDL_CondWaitTimeout(is->continue_read_thread, wait_mutex, 10);
2899             SDL_UnlockMutex(wait_mutex);
2900             continue;
2901         }
2902         if (eof) {
2903             if (is->video_stream >= 0) {
2904                 av_init_packet(pkt);
2905                 pkt->data = NULL;
2906                 pkt->size = 0;
2907                 pkt->stream_index = is->video_stream;
2908                 packet_queue_put(&is->videoq, pkt);
2909             }
2910             if (is->audio_stream >= 0 &&
2911                 is->audio_st->codec->codec->capabilities & CODEC_CAP_DELAY) {
2912                 av_init_packet(pkt);
2913                 pkt->data = NULL;
2914                 pkt->size = 0;
2915                 pkt->stream_index = is->audio_stream;
2916                 packet_queue_put(&is->audioq, pkt);
2917             }
2918             SDL_Delay(10);
2919             if (is->audioq.size + is->videoq.size + is->subtitleq.size == 0) {
2920                 if (loop != 1 && (!loop || --loop)) {
2921                     stream_seek(is, start_time != AV_NOPTS_VALUE ? start_time : 0, 0, 0);
2922                 } else if (autoexit) {
2923                     ret = AVERROR_EOF;
2924                     goto fail;
2925                 }
2926             }
2927             eof=0;
2928             continue;
2929         }
2930         ret = av_read_frame(ic, pkt);
2931         if (ret < 0) {
2932             if (ret == AVERROR_EOF || url_feof(ic->pb))
2933                 eof = 1;
2934             if (ic->pb && ic->pb->error)
2935                 break;
2936             SDL_LockMutex(wait_mutex);
2937             SDL_CondWaitTimeout(is->continue_read_thread, wait_mutex, 10);
2938             SDL_UnlockMutex(wait_mutex);
2939             continue;
2940         }
2941         /* check if packet is in play range specified by user, then queue, otherwise discard */
2942         pkt_in_play_range = duration == AV_NOPTS_VALUE ||
2943                 (pkt->pts - ic->streams[pkt->stream_index]->start_time) *
2944                 av_q2d(ic->streams[pkt->stream_index]->time_base) -
2945                 (double)(start_time != AV_NOPTS_VALUE ? start_time : 0) / 1000000
2946                 <= ((double)duration / 1000000);
2947         if (pkt->stream_index == is->audio_stream && pkt_in_play_range) {
2948             packet_queue_put(&is->audioq, pkt);
2949         } else if (pkt->stream_index == is->video_stream && pkt_in_play_range
2950                    && !(is->video_st->disposition & AV_DISPOSITION_ATTACHED_PIC)) {
2951             packet_queue_put(&is->videoq, pkt);
2952         } else if (pkt->stream_index == is->subtitle_stream && pkt_in_play_range) {
2953             packet_queue_put(&is->subtitleq, pkt);
2954         } else {
2955             av_free_packet(pkt);
2956         }
2957     }
2958     /* wait until the end */
2959     while (!is->abort_request) {
2960         SDL_Delay(100);
2961     }
2962
2963     ret = 0;
2964  fail:
2965     /* close each stream */
2966     if (is->audio_stream >= 0)
2967         stream_component_close(is, is->audio_stream);
2968     if (is->video_stream >= 0)
2969         stream_component_close(is, is->video_stream);
2970     if (is->subtitle_stream >= 0)
2971         stream_component_close(is, is->subtitle_stream);
2972     if (is->ic) {
2973         avformat_close_input(&is->ic);
2974     }
2975
2976     if (ret != 0) {
2977         SDL_Event event;
2978
2979         event.type = FF_QUIT_EVENT;
2980         event.user.data1 = is;
2981         SDL_PushEvent(&event);
2982     }
2983     SDL_DestroyMutex(wait_mutex);
2984     return 0;
2985 }
2986
2987 static VideoState *stream_open(const char *filename, AVInputFormat *iformat)
2988 {
2989     VideoState *is;
2990
2991     is = av_mallocz(sizeof(VideoState));
2992     if (!is)
2993         return NULL;
2994     av_strlcpy(is->filename, filename, sizeof(is->filename));
2995     is->iformat = iformat;
2996     is->ytop    = 0;
2997     is->xleft   = 0;
2998
2999     /* start video display */
3000     is->pictq_mutex = SDL_CreateMutex();
3001     is->pictq_cond  = SDL_CreateCond();
3002
3003     is->subpq_mutex = SDL_CreateMutex();
3004     is->subpq_cond  = SDL_CreateCond();
3005
3006     packet_queue_init(&is->videoq);
3007     packet_queue_init(&is->audioq);
3008     packet_queue_init(&is->subtitleq);
3009
3010     is->continue_read_thread = SDL_CreateCond();
3011
3012     init_clock(&is->vidclk, &is->videoq.serial);
3013     init_clock(&is->audclk, &is->audioq.serial);
3014     init_clock(&is->extclk, &is->extclk.serial);
3015     is->audio_clock_serial = -1;
3016     is->audio_last_serial = -1;
3017     is->av_sync_type = av_sync_type;
3018     is->read_tid     = SDL_CreateThread(read_thread, is);
3019     if (!is->read_tid) {
3020         av_free(is);
3021         return NULL;
3022     }
3023     return is;
3024 }
3025
3026 static void stream_cycle_channel(VideoState *is, int codec_type)
3027 {
3028     AVFormatContext *ic = is->ic;
3029     int start_index, stream_index;
3030     int old_index;
3031     AVStream *st;
3032
3033     if (codec_type == AVMEDIA_TYPE_VIDEO) {
3034         start_index = is->last_video_stream;
3035         old_index = is->video_stream;
3036     } else if (codec_type == AVMEDIA_TYPE_AUDIO) {
3037         start_index = is->last_audio_stream;
3038         old_index = is->audio_stream;
3039     } else {
3040         start_index = is->last_subtitle_stream;
3041         old_index = is->subtitle_stream;
3042     }
3043     stream_index = start_index;
3044     for (;;) {
3045         if (++stream_index >= is->ic->nb_streams)
3046         {
3047             if (codec_type == AVMEDIA_TYPE_SUBTITLE)
3048             {
3049                 stream_index = -1;
3050                 is->last_subtitle_stream = -1;
3051                 goto the_end;
3052             }
3053             if (start_index == -1)
3054                 return;
3055             stream_index = 0;
3056         }
3057         if (stream_index == start_index)
3058             return;
3059         st = ic->streams[stream_index];
3060         if (st->codec->codec_type == codec_type) {
3061             /* check that parameters are OK */
3062             switch (codec_type) {
3063             case AVMEDIA_TYPE_AUDIO:
3064                 if (st->codec->sample_rate != 0 &&
3065                     st->codec->channels != 0)
3066                     goto the_end;
3067                 break;
3068             case AVMEDIA_TYPE_VIDEO:
3069             case AVMEDIA_TYPE_SUBTITLE:
3070                 goto the_end;
3071             default:
3072                 break;
3073             }
3074         }
3075     }
3076  the_end:
3077     stream_component_close(is, old_index);
3078     stream_component_open(is, stream_index);
3079 }
3080
3081
3082 static void toggle_full_screen(VideoState *is)
3083 {
3084 #if defined(__APPLE__) && SDL_VERSION_ATLEAST(1, 2, 14)
3085     /* OS X needs to reallocate the SDL overlays */
3086     int i;
3087     for (i = 0; i < VIDEO_PICTURE_QUEUE_SIZE; i++)
3088         is->pictq[i].reallocate = 1;
3089 #endif
3090     is_full_screen = !is_full_screen;
3091     video_open(is, 1, NULL);
3092 }
3093
3094 static void toggle_audio_display(VideoState *is)
3095 {
3096     int bgcolor = SDL_MapRGB(screen->format, 0x00, 0x00, 0x00);
3097     int next = is->show_mode;
3098     do {
3099         next = (next + 1) % SHOW_MODE_NB;
3100     } while (next != is->show_mode && (next == SHOW_MODE_VIDEO && !is->video_st || next != SHOW_MODE_VIDEO && !is->audio_st));
3101     if (is->show_mode != next) {
3102         fill_rectangle(screen,
3103                     is->xleft, is->ytop, is->width, is->height,
3104                     bgcolor, 1);
3105         is->force_refresh = 1;
3106         is->show_mode = next;
3107     }
3108 }
3109
3110 static void refresh_loop_wait_event(VideoState *is, SDL_Event *event) {
3111     double remaining_time = 0.0;
3112     SDL_PumpEvents();
3113     while (!SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_ALLEVENTS)) {
3114         if (!cursor_hidden && av_gettime() - cursor_last_shown > CURSOR_HIDE_DELAY) {
3115             SDL_ShowCursor(0);
3116             cursor_hidden = 1;
3117         }
3118         if (remaining_time > 0.0)
3119             av_usleep((int64_t)(remaining_time * 1000000.0));
3120         remaining_time = REFRESH_RATE;
3121         if (is->show_mode != SHOW_MODE_NONE && (!is->paused || is->force_refresh))
3122             video_refresh(is, &remaining_time);
3123         SDL_PumpEvents();
3124     }
3125 }
3126
3127 /* handle an event sent by the GUI */
3128 static void event_loop(VideoState *cur_stream)
3129 {
3130     SDL_Event event;
3131     double incr, pos, frac;
3132
3133     for (;;) {
3134         double x;
3135         refresh_loop_wait_event(cur_stream, &event);
3136         switch (event.type) {
3137         case SDL_KEYDOWN:
3138             if (exit_on_keydown) {
3139                 do_exit(cur_stream);
3140                 break;
3141             }
3142             switch (event.key.keysym.sym) {
3143             case SDLK_ESCAPE:
3144             case SDLK_q:
3145                 do_exit(cur_stream);
3146                 break;
3147             case SDLK_f:
3148                 toggle_full_screen(cur_stream);
3149                 cur_stream->force_refresh = 1;
3150                 break;
3151             case SDLK_p:
3152             case SDLK_SPACE:
3153                 toggle_pause(cur_stream);
3154                 break;
3155             case SDLK_s: // S: Step to next frame
3156                 step_to_next_frame(cur_stream);
3157                 break;
3158             case SDLK_a:
3159                 stream_cycle_channel(cur_stream, AVMEDIA_TYPE_AUDIO);
3160                 break;
3161             case SDLK_v:
3162                 stream_cycle_channel(cur_stream, AVMEDIA_TYPE_VIDEO);
3163                 break;
3164             case SDLK_t:
3165                 stream_cycle_channel(cur_stream, AVMEDIA_TYPE_SUBTITLE);
3166                 break;
3167             case SDLK_w:
3168                 toggle_audio_display(cur_stream);
3169                 break;
3170             case SDLK_PAGEUP:
3171                 incr = 600.0;
3172                 goto do_seek;
3173             case SDLK_PAGEDOWN:
3174                 incr = -600.0;
3175                 goto do_seek;
3176             case SDLK_LEFT:
3177                 incr = -10.0;
3178                 goto do_seek;
3179             case SDLK_RIGHT:
3180                 incr = 10.0;
3181                 goto do_seek;
3182             case SDLK_UP:
3183                 incr = 60.0;
3184                 goto do_seek;
3185             case SDLK_DOWN:
3186                 incr = -60.0;
3187             do_seek:
3188                     if (seek_by_bytes) {
3189                         if (cur_stream->video_stream >= 0 && cur_stream->video_current_pos >= 0) {
3190                             pos = cur_stream->video_current_pos;
3191                         } else if (cur_stream->audio_stream >= 0 && cur_stream->audio_pkt.pos >= 0) {
3192                             pos = cur_stream->audio_pkt.pos;
3193                         } else
3194                             pos = avio_tell(cur_stream->ic->pb);
3195                         if (cur_stream->ic->bit_rate)
3196                             incr *= cur_stream->ic->bit_rate / 8.0;
3197                         else
3198                             incr *= 180000.0;
3199                         pos += incr;
3200                         stream_seek(cur_stream, pos, incr, 1);
3201                     } else {
3202                         pos = get_master_clock(cur_stream);
3203                         if (isnan(pos))
3204                             pos = (double)cur_stream->seek_pos / AV_TIME_BASE;
3205                         pos += incr;
3206                         if (cur_stream->ic->start_time != AV_NOPTS_VALUE && pos < cur_stream->ic->start_time / (double)AV_TIME_BASE)
3207                             pos = cur_stream->ic->start_time / (double)AV_TIME_BASE;
3208                         stream_seek(cur_stream, (int64_t)(pos * AV_TIME_BASE), (int64_t)(incr * AV_TIME_BASE), 0);
3209                     }
3210                 break;
3211             default:
3212                 break;
3213             }
3214             break;
3215         case SDL_VIDEOEXPOSE:
3216             cur_stream->force_refresh = 1;
3217             break;
3218         case SDL_MOUSEBUTTONDOWN:
3219             if (exit_on_mousedown) {
3220                 do_exit(cur_stream);
3221                 break;
3222             }
3223         case SDL_MOUSEMOTION:
3224             if (cursor_hidden) {
3225                 SDL_ShowCursor(1);
3226                 cursor_hidden = 0;
3227             }
3228             cursor_last_shown = av_gettime();
3229             if (event.type == SDL_MOUSEBUTTONDOWN) {
3230                 x = event.button.x;
3231             } else {
3232                 if (event.motion.state != SDL_PRESSED)
3233                     break;
3234                 x = event.motion.x;
3235             }
3236                 if (seek_by_bytes || cur_stream->ic->duration <= 0) {
3237                     uint64_t size =  avio_size(cur_stream->ic->pb);
3238                     stream_seek(cur_stream, size*x/cur_stream->width, 0, 1);
3239                 } else {
3240                     int64_t ts;
3241                     int ns, hh, mm, ss;
3242                     int tns, thh, tmm, tss;
3243                     tns  = cur_stream->ic->duration / 1000000LL;
3244                     thh  = tns / 3600;
3245                     tmm  = (tns % 3600) / 60;
3246                     tss  = (tns % 60);
3247                     frac = x / cur_stream->width;
3248                     ns   = frac * tns;
3249                     hh   = ns / 3600;
3250                     mm   = (ns % 3600) / 60;
3251                     ss   = (ns % 60);
3252                     av_log(NULL, AV_LOG_INFO,
3253                            "Seek to %2.0f%% (%2d:%02d:%02d) of total duration (%2d:%02d:%02d)       \n", frac*100,
3254                             hh, mm, ss, thh, tmm, tss);
3255                     ts = frac * cur_stream->ic->duration;
3256                     if (cur_stream->ic->start_time != AV_NOPTS_VALUE)
3257                         ts += cur_stream->ic->start_time;
3258                     stream_seek(cur_stream, ts, 0, 0);
3259                 }
3260             break;
3261         case SDL_VIDEORESIZE:
3262                 screen = SDL_SetVideoMode(FFMIN(16383, event.resize.w), event.resize.h, 0,
3263                                           SDL_HWSURFACE|SDL_RESIZABLE|SDL_ASYNCBLIT|SDL_HWACCEL);
3264                 if (!screen) {
3265                     av_log(NULL, AV_LOG_FATAL, "Failed to set video mode\n");
3266                     do_exit(cur_stream);
3267                 }
3268                 screen_width  = cur_stream->width  = screen->w;
3269                 screen_height = cur_stream->height = screen->h;
3270                 cur_stream->force_refresh = 1;
3271             break;
3272         case SDL_QUIT:
3273         case FF_QUIT_EVENT:
3274             do_exit(cur_stream);
3275             break;
3276         case FF_ALLOC_EVENT:
3277             alloc_picture(event.user.data1);
3278             break;
3279         default:
3280             break;
3281         }
3282     }
3283 }
3284
3285 static int opt_frame_size(void *optctx, const char *opt, const char *arg)
3286 {
3287     av_log(NULL, AV_LOG_WARNING, "Option -s is deprecated, use -video_size.\n");
3288     return opt_default(NULL, "video_size", arg);
3289 }
3290
3291 static int opt_width(void *optctx, const char *opt, const char *arg)
3292 {
3293     screen_width = parse_number_or_die(opt, arg, OPT_INT64, 1, INT_MAX);
3294     return 0;
3295 }
3296
3297 static int opt_height(void *optctx, const char *opt, const char *arg)
3298 {
3299     screen_height = parse_number_or_die(opt, arg, OPT_INT64, 1, INT_MAX);
3300     return 0;
3301 }
3302
3303 static int opt_format(void *optctx, const char *opt, const char *arg)
3304 {
3305     file_iformat = av_find_input_format(arg);
3306     if (!file_iformat) {
3307         av_log(NULL, AV_LOG_FATAL, "Unknown input format: %s\n", arg);
3308         return AVERROR(EINVAL);
3309     }
3310     return 0;
3311 }
3312
3313 static int opt_frame_pix_fmt(void *optctx, const char *opt, const char *arg)
3314 {
3315     av_log(NULL, AV_LOG_WARNING, "Option -pix_fmt is deprecated, use -pixel_format.\n");
3316     return opt_default(NULL, "pixel_format", arg);
3317 }
3318
3319 static int opt_sync(void *optctx, const char *opt, const char *arg)
3320 {
3321     if (!strcmp(arg, "audio"))
3322         av_sync_type = AV_SYNC_AUDIO_MASTER;
3323     else if (!strcmp(arg, "video"))
3324         av_sync_type = AV_SYNC_VIDEO_MASTER;
3325     else if (!strcmp(arg, "ext"))
3326         av_sync_type = AV_SYNC_EXTERNAL_CLOCK;
3327     else {
3328         av_log(NULL, AV_LOG_ERROR, "Unknown value for %s: %s\n", opt, arg);
3329         exit(1);
3330     }
3331     return 0;
3332 }
3333
3334 static int opt_seek(void *optctx, const char *opt, const char *arg)
3335 {
3336     start_time = parse_time_or_die(opt, arg, 1);
3337     return 0;
3338 }
3339
3340 static int opt_duration(void *optctx, const char *opt, const char *arg)
3341 {
3342     duration = parse_time_or_die(opt, arg, 1);
3343     return 0;
3344 }
3345
3346 static int opt_show_mode(void *optctx, const char *opt, const char *arg)
3347 {
3348     show_mode = !strcmp(arg, "video") ? SHOW_MODE_VIDEO :
3349                 !strcmp(arg, "waves") ? SHOW_MODE_WAVES :
3350                 !strcmp(arg, "rdft" ) ? SHOW_MODE_RDFT  :
3351                 parse_number_or_die(opt, arg, OPT_INT, 0, SHOW_MODE_NB-1);
3352     return 0;
3353 }
3354
3355 static void opt_input_file(void *optctx, const char *filename)
3356 {
3357     if (input_filename) {
3358         av_log(NULL, AV_LOG_FATAL,
3359                "Argument '%s' provided as input filename, but '%s' was already specified.\n",
3360                 filename, input_filename);
3361         exit(1);
3362     }
3363     if (!strcmp(filename, "-"))
3364         filename = "pipe:";
3365     input_filename = filename;
3366 }
3367
3368 static int opt_codec(void *optctx, const char *opt, const char *arg)
3369 {
3370    const char *spec = strchr(opt, ':');
3371    if (!spec) {
3372        av_log(NULL, AV_LOG_ERROR,
3373               "No media specifier was specified in '%s' in option '%s'\n",
3374                arg, opt);
3375        return AVERROR(EINVAL);
3376    }
3377    spec++;
3378    switch (spec[0]) {
3379    case 'a' :    audio_codec_name = arg; break;
3380    case 's' : subtitle_codec_name = arg; break;
3381    case 'v' :    video_codec_name = arg; break;
3382    default:
3383        av_log(NULL, AV_LOG_ERROR,
3384               "Invalid media specifier '%s' in option '%s'\n", spec, opt);
3385        return AVERROR(EINVAL);
3386    }
3387    return 0;
3388 }
3389
3390 static int dummy;
3391
3392 static const OptionDef options[] = {
3393 #include "cmdutils_common_opts.h"
3394     { "x", HAS_ARG, { .func_arg = opt_width }, "force displayed width", "width" },
3395     { "y", HAS_ARG, { .func_arg = opt_height }, "force displayed height", "height" },
3396     { "s", HAS_ARG | OPT_VIDEO, { .func_arg = opt_frame_size }, "set frame size (WxH or abbreviation)", "size" },
3397     { "fs", OPT_BOOL, { &is_full_screen }, "force full screen" },
3398     { "an", OPT_BOOL, { &audio_disable }, "disable audio" },
3399     { "vn", OPT_BOOL, { &video_disable }, "disable video" },
3400     { "sn", OPT_BOOL, { &subtitle_disable }, "disable subtitling" },
3401     { "ast", OPT_INT | HAS_ARG | OPT_EXPERT, { &wanted_stream[AVMEDIA_TYPE_AUDIO] }, "select desired audio stream", "stream_number" },
3402     { "vst", OPT_INT | HAS_ARG | OPT_EXPERT, { &wanted_stream[AVMEDIA_TYPE_VIDEO] }, "select desired video stream", "stream_number" },
3403     { "sst", OPT_INT | HAS_ARG | OPT_EXPERT, { &wanted_stream[AVMEDIA_TYPE_SUBTITLE] }, "select desired subtitle stream", "stream_number" },
3404     { "ss", HAS_ARG, { .func_arg = opt_seek }, "seek to a given position in seconds", "pos" },
3405     { "t", HAS_ARG, { .func_arg = opt_duration }, "play  \"duration\" seconds of audio/video", "duration" },
3406     { "bytes", OPT_INT | HAS_ARG, { &seek_by_bytes }, "seek by bytes 0=off 1=on -1=auto", "val" },
3407     { "nodisp", OPT_BOOL, { &display_disable }, "disable graphical display" },
3408     { "f", HAS_ARG, { .func_arg = opt_format }, "force format", "fmt" },
3409     { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_frame_pix_fmt }, "set pixel format", "format" },
3410     { "stats", OPT_BOOL | OPT_EXPERT, { &show_status }, "show status", "" },
3411     { "bug", OPT_INT | HAS_ARG | OPT_EXPERT, { &workaround_bugs }, "workaround bugs", "" },
3412     { "fast", OPT_BOOL | OPT_EXPERT, { &fast }, "non spec compliant optimizations", "" },
3413     { "genpts", OPT_BOOL | OPT_EXPERT, { &genpts }, "generate pts", "" },
3414     { "drp", OPT_INT | HAS_ARG | OPT_EXPERT, { &decoder_reorder_pts }, "let decoder reorder pts 0=off 1=on -1=auto", ""},
3415     { "lowres", OPT_INT | HAS_ARG | OPT_EXPERT, { &lowres }, "", "" },
3416     { "idct", OPT_INT | HAS_ARG | OPT_EXPERT, { &idct }, "set idct algo",  "algo" },
3417     { "ec", OPT_INT | HAS_ARG | OPT_EXPERT, { &error_concealment }, "set error concealment options",  "bit_mask" },
3418     { "sync", HAS_ARG | OPT_EXPERT, { .func_arg = opt_sync }, "set audio-video sync. type (type=audio/video/ext)", "type" },
3419     { "autoexit", OPT_BOOL | OPT_EXPERT, { &autoexit }, "exit at the end", "" },
3420     { "exitonkeydown", OPT_BOOL | OPT_EXPERT, { &exit_on_keydown }, "exit on key down", "" },
3421     { "exitonmousedown", OPT_BOOL | OPT_EXPERT, { &exit_on_mousedown }, "exit on mouse down", "" },
3422     { "loop", OPT_INT | HAS_ARG | OPT_EXPERT, { &loop }, "set number of times the playback shall be looped", "loop count" },
3423     { "framedrop", OPT_BOOL | OPT_EXPERT, { &framedrop }, "drop frames when cpu is too slow", "" },
3424     { "infbuf", OPT_BOOL | OPT_EXPERT, { &infinite_buffer }, "don't limit the input buffer size (useful with realtime streams)", "" },
3425     { "window_title", OPT_STRING | HAS_ARG, { &window_title }, "set window title", "window title" },
3426 #if CONFIG_AVFILTER
3427     { "vf", OPT_STRING | HAS_ARG, { &vfilters }, "set video filters", "filter_graph" },
3428     { "af", OPT_STRING | HAS_ARG, { &afilters }, "set audio filters", "filter_graph" },
3429 #endif
3430     { "rdftspeed", OPT_INT | HAS_ARG| OPT_AUDIO | OPT_EXPERT, { &rdftspeed }, "rdft speed", "msecs" },
3431     { "showmode", HAS_ARG, { .func_arg = opt_show_mode}, "select show mode (0 = video, 1 = waves, 2 = RDFT)", "mode" },
3432     { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, { .func_arg = opt_default }, "generic catch all option", "" },
3433     { "i", OPT_BOOL, { &dummy}, "read specified file", "input_file"},
3434     { "codec", HAS_ARG, { .func_arg = opt_codec}, "force decoder", "decoder_name" },
3435     { "acodec", HAS_ARG | OPT_STRING | OPT_EXPERT, {    &audio_codec_name }, "force audio decoder",    "decoder_name" },
3436     { "scodec", HAS_ARG | OPT_STRING | OPT_EXPERT, { &subtitle_codec_name }, "force subtitle decoder", "decoder_name" },
3437     { "vcodec", HAS_ARG | OPT_STRING | OPT_EXPERT, {    &video_codec_name }, "force video decoder",    "decoder_name" },
3438     { NULL, },
3439 };
3440
3441 static void show_usage(void)
3442 {
3443     av_log(NULL, AV_LOG_INFO, "Simple media player\n");
3444     av_log(NULL, AV_LOG_INFO, "usage: %s [options] input_file\n", program_name);
3445     av_log(NULL, AV_LOG_INFO, "\n");
3446 }
3447
3448 void show_help_default(const char *opt, const char *arg)
3449 {
3450     av_log_set_callback(log_callback_help);
3451     show_usage();
3452     show_help_options(options, "Main options:", 0, OPT_EXPERT, 0);
3453     show_help_options(options, "Advanced options:", OPT_EXPERT, 0, 0);
3454     printf("\n");
3455     show_help_children(avcodec_get_class(), AV_OPT_FLAG_DECODING_PARAM);
3456     show_help_children(avformat_get_class(), AV_OPT_FLAG_DECODING_PARAM);
3457 #if !CONFIG_AVFILTER
3458     show_help_children(sws_get_class(), AV_OPT_FLAG_ENCODING_PARAM);
3459 #else
3460     show_help_children(avfilter_get_class(), AV_OPT_FLAG_FILTERING_PARAM);
3461 #endif
3462     printf("\nWhile playing:\n"
3463            "q, ESC              quit\n"
3464            "f                   toggle full screen\n"
3465            "p, SPC              pause\n"
3466            "a                   cycle audio channel\n"
3467            "v                   cycle video channel\n"
3468            "t                   cycle subtitle channel\n"
3469            "w                   show audio waves\n"
3470            "s                   activate frame-step mode\n"
3471            "left/right          seek backward/forward 10 seconds\n"
3472            "down/up             seek backward/forward 1 minute\n"
3473            "page down/page up   seek backward/forward 10 minutes\n"
3474            "mouse click         seek to percentage in file corresponding to fraction of width\n"
3475            );
3476 }
3477
3478 static int lockmgr(void **mtx, enum AVLockOp op)
3479 {
3480    switch(op) {
3481       case AV_LOCK_CREATE:
3482           *mtx = SDL_CreateMutex();
3483           if(!*mtx)
3484               return 1;
3485           return 0;
3486       case AV_LOCK_OBTAIN:
3487           return !!SDL_LockMutex(*mtx);
3488       case AV_LOCK_RELEASE:
3489           return !!SDL_UnlockMutex(*mtx);
3490       case AV_LOCK_DESTROY:
3491           SDL_DestroyMutex(*mtx);
3492           return 0;
3493    }
3494    return 1;
3495 }
3496
3497 /* Called from the main */
3498 int main(int argc, char **argv)
3499 {
3500     int flags;
3501     VideoState *is;
3502     char dummy_videodriver[] = "SDL_VIDEODRIVER=dummy";
3503
3504     av_log_set_flags(AV_LOG_SKIP_REPEATED);
3505     parse_loglevel(argc, argv, options);
3506
3507     /* register all codecs, demux and protocols */
3508     avcodec_register_all();
3509 #if CONFIG_AVDEVICE
3510     avdevice_register_all();
3511 #endif
3512 #if CONFIG_AVFILTER
3513     avfilter_register_all();
3514 #endif
3515     av_register_all();
3516     avformat_network_init();
3517
3518     init_opts();
3519
3520     signal(SIGINT , sigterm_handler); /* Interrupt (ANSI).    */
3521     signal(SIGTERM, sigterm_handler); /* Termination (ANSI).  */
3522
3523     show_banner(argc, argv, options);
3524
3525     parse_options(NULL, argc, argv, options, opt_input_file);
3526
3527     if (!input_filename) {
3528         show_usage();
3529         av_log(NULL, AV_LOG_FATAL, "An input file must be specified\n");
3530         av_log(NULL, AV_LOG_FATAL,
3531                "Use -h to get full help or, even better, run 'man %s'\n", program_name);
3532         exit(1);
3533     }
3534
3535     if (display_disable) {
3536         video_disable = 1;
3537     }
3538     flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER;
3539     if (audio_disable)
3540         flags &= ~SDL_INIT_AUDIO;
3541     if (display_disable)
3542         SDL_putenv(dummy_videodriver); /* For the event queue, we always need a video driver. */
3543 #if !defined(__MINGW32__) && !defined(__APPLE__)
3544     flags |= SDL_INIT_EVENTTHREAD; /* Not supported on Windows or Mac OS X */
3545 #endif
3546     if (SDL_Init (flags)) {
3547         av_log(NULL, AV_LOG_FATAL, "Could not initialize SDL - %s\n", SDL_GetError());
3548         av_log(NULL, AV_LOG_FATAL, "(Did you set the DISPLAY variable?)\n");
3549         exit(1);
3550     }
3551
3552     if (!display_disable) {
3553         const SDL_VideoInfo *vi = SDL_GetVideoInfo();
3554         fs_screen_width = vi->current_w;
3555         fs_screen_height = vi->current_h;
3556     }
3557
3558     SDL_EventState(SDL_ACTIVEEVENT, SDL_IGNORE);
3559     SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE);
3560     SDL_EventState(SDL_USEREVENT, SDL_IGNORE);
3561
3562     if (av_lockmgr_register(lockmgr)) {
3563         av_log(NULL, AV_LOG_FATAL, "Could not initialize lock manager!\n");
3564         do_exit(NULL);
3565     }
3566
3567     av_init_packet(&flush_pkt);
3568     flush_pkt.data = (uint8_t *)&flush_pkt;
3569
3570     is = stream_open(input_filename, file_iformat);
3571     if (!is) {
3572         av_log(NULL, AV_LOG_FATAL, "Failed to initialize VideoState!\n");
3573         do_exit(NULL);
3574     }
3575
3576     event_loop(is);
3577
3578     /* never returns */
3579
3580     return 0;
3581 }