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