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