Merge remote-tracking branch 'cus/stable'
[ffmpeg.git] / ffplay.c
1 /*
2  * Copyright (c) 2003 Fabrice Bellard
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20
21 /**
22  * @file
23  * simple media player based on the FFmpeg libraries
24  */
25
26 #include "config.h"
27 #include <inttypes.h>
28 #include <math.h>
29 #include <limits.h>
30 #include <signal.h>
31 #include "libavutil/avstring.h"
32 #include "libavutil/colorspace.h"
33 #include "libavutil/mathematics.h"
34 #include "libavutil/pixdesc.h"
35 #include "libavutil/imgutils.h"
36 #include "libavutil/dict.h"
37 #include "libavutil/parseutils.h"
38 #include "libavutil/samplefmt.h"
39 #include "libavutil/avassert.h"
40 #include "libavutil/time.h"
41 #include "libavformat/avformat.h"
42 #include "libavdevice/avdevice.h"
43 #include "libswscale/swscale.h"
44 #include "libavutil/opt.h"
45 #include "libavcodec/avfft.h"
46 #include "libswresample/swresample.h"
47
48 #if CONFIG_AVFILTER
49 # include "libavfilter/avcodec.h"
50 # include "libavfilter/avfilter.h"
51 # include "libavfilter/avfiltergraph.h"
52 # include "libavfilter/buffersink.h"
53 # include "libavfilter/buffersrc.h"
54 #endif
55
56 #include <SDL.h>
57 #include <SDL_thread.h>
58
59 #include "cmdutils.h"
60
61 #include <assert.h>
62
63 const char program_name[] = "ffplay";
64 const int program_birth_year = 2003;
65
66 #define MAX_QUEUE_SIZE (15 * 1024 * 1024)
67 #define MIN_FRAMES 5
68
69 /* SDL audio buffer size, in samples. Should be small to have precise
70    A/V sync as SDL does not have hardware buffer fullness info. */
71 #define SDL_AUDIO_BUFFER_SIZE 1024
72
73 /* no AV sync correction is done if below the AV sync threshold */
74 #define AV_SYNC_THRESHOLD 0.01
75 /* no AV correction is done if too big error */
76 #define AV_NOSYNC_THRESHOLD 10.0
77
78 /* maximum audio speed change to get correct sync */
79 #define SAMPLE_CORRECTION_PERCENT_MAX 10
80
81 /* external clock speed adjustment constants for realtime sources based on buffer fullness */
82 #define EXTERNAL_CLOCK_SPEED_MIN  0.900
83 #define EXTERNAL_CLOCK_SPEED_MAX  1.010
84 #define EXTERNAL_CLOCK_SPEED_STEP 0.001
85
86 /* we use about AUDIO_DIFF_AVG_NB A-V differences to make the average */
87 #define AUDIO_DIFF_AVG_NB   20
88
89 /* 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     if (is->img_convert_ctx)
998         sws_freeContext(is->img_convert_ctx);
999 #endif
1000     av_free(is);
1001 }
1002
1003 static void do_exit(VideoState *is)
1004 {
1005     if (is) {
1006         stream_close(is);
1007     }
1008     av_lockmgr_register(NULL);
1009     uninit_opts();
1010 #if CONFIG_AVFILTER
1011     avfilter_uninit();
1012     av_freep(&vfilters);
1013 #endif
1014     avformat_network_deinit();
1015     if (show_status)
1016         printf("\n");
1017     SDL_Quit();
1018     av_log(NULL, AV_LOG_QUIET, "%s", "");
1019     exit(0);
1020 }
1021
1022 static void sigterm_handler(int sig)
1023 {
1024     exit(123);
1025 }
1026
1027 static int video_open(VideoState *is, int force_set_video_mode, VideoPicture *vp)
1028 {
1029     int flags = SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_HWACCEL;
1030     int w,h;
1031     SDL_Rect rect;
1032
1033     if (is_full_screen) flags |= SDL_FULLSCREEN;
1034     else                flags |= SDL_RESIZABLE;
1035
1036     if (vp && vp->width) {
1037         calculate_display_rect(&rect, 0, 0, INT_MAX, vp->height, vp);
1038         default_width  = rect.w;
1039         default_height = rect.h;
1040     }
1041
1042     if (is_full_screen && fs_screen_width) {
1043         w = fs_screen_width;
1044         h = fs_screen_height;
1045     } else if (!is_full_screen && screen_width) {
1046         w = screen_width;
1047         h = screen_height;
1048     } else {
1049         w = default_width;
1050         h = default_height;
1051     }
1052     if (screen && is->width == screen->w && screen->w == w
1053        && is->height== screen->h && screen->h == h && !force_set_video_mode)
1054         return 0;
1055     screen = SDL_SetVideoMode(w, h, 0, flags);
1056     if (!screen) {
1057         fprintf(stderr, "SDL: could not set video mode - exiting\n");
1058         do_exit(is);
1059     }
1060     if (!window_title)
1061         window_title = input_filename;
1062     SDL_WM_SetCaption(window_title, window_title);
1063
1064     is->width  = screen->w;
1065     is->height = screen->h;
1066
1067     return 0;
1068 }
1069
1070 /* display the current picture, if any */
1071 static void video_display(VideoState *is)
1072 {
1073     if (!screen)
1074         video_open(is, 0, NULL);
1075     if (is->audio_st && is->show_mode != SHOW_MODE_VIDEO)
1076         video_audio_display(is);
1077     else if (is->video_st)
1078         video_image_display(is);
1079 }
1080
1081 static int refresh_thread(void *opaque)
1082 {
1083     VideoState *is= opaque;
1084     while (!is->abort_request) {
1085         SDL_Event event;
1086         event.type = FF_REFRESH_EVENT;
1087         event.user.data1 = opaque;
1088         if (!is->refresh && (!is->paused || is->force_refresh)) {
1089             is->refresh = 1;
1090             SDL_PushEvent(&event);
1091         }
1092         //FIXME ideally we should wait the correct time but SDLs event passing is so slow it would be silly
1093         av_usleep(is->audio_st && is->show_mode != SHOW_MODE_VIDEO ? rdftspeed*1000 : 5000);
1094     }
1095     return 0;
1096 }
1097
1098 /* get the current audio clock value */
1099 static double get_audio_clock(VideoState *is)
1100 {
1101     if (is->paused) {
1102         return is->audio_current_pts;
1103     } else {
1104         return is->audio_current_pts_drift + av_gettime() / 1000000.0;
1105     }
1106 }
1107
1108 /* get the current video clock value */
1109 static double get_video_clock(VideoState *is)
1110 {
1111     if (is->paused) {
1112         return is->video_current_pts;
1113     } else {
1114         return is->video_current_pts_drift + av_gettime() / 1000000.0;
1115     }
1116 }
1117
1118 /* get the current external clock value */
1119 static double get_external_clock(VideoState *is)
1120 {
1121     if (is->paused) {
1122         return is->external_clock;
1123     } else {
1124         double time = av_gettime() / 1000000.0;
1125         return is->external_clock_drift + time - (time - is->external_clock_time / 1000000.0) * (1.0 - is->external_clock_speed);
1126     }
1127 }
1128
1129 static int get_master_sync_type(VideoState *is) {
1130     if (is->av_sync_type == AV_SYNC_VIDEO_MASTER) {
1131         if (is->video_st)
1132             return AV_SYNC_VIDEO_MASTER;
1133         else
1134             return AV_SYNC_AUDIO_MASTER;
1135     } else if (is->av_sync_type == AV_SYNC_AUDIO_MASTER) {
1136         if (is->audio_st)
1137             return AV_SYNC_AUDIO_MASTER;
1138         else
1139             return AV_SYNC_EXTERNAL_CLOCK;
1140     } else {
1141         return AV_SYNC_EXTERNAL_CLOCK;
1142     }
1143 }
1144
1145 /* get the current master clock value */
1146 static double get_master_clock(VideoState *is)
1147 {
1148     double val;
1149
1150     switch (get_master_sync_type(is)) {
1151         case AV_SYNC_VIDEO_MASTER:
1152             val = get_video_clock(is);
1153             break;
1154         case AV_SYNC_AUDIO_MASTER:
1155             val = get_audio_clock(is);
1156             break;
1157         default:
1158             val = get_external_clock(is);
1159             break;
1160     }
1161     return val;
1162 }
1163
1164 static void update_external_clock_pts(VideoState *is, double pts)
1165 {
1166    is->external_clock_time = av_gettime();
1167    is->external_clock = pts;
1168    is->external_clock_drift = pts - is->external_clock_time / 1000000.0;
1169 }
1170
1171 static void check_external_clock_sync(VideoState *is, double pts) {
1172     if (fabs(get_external_clock(is) - pts) > AV_NOSYNC_THRESHOLD) {
1173         update_external_clock_pts(is, pts);
1174     }
1175 }
1176
1177 static void update_external_clock_speed(VideoState *is, double speed) {
1178     update_external_clock_pts(is, get_external_clock(is));
1179     is->external_clock_speed = speed;
1180 }
1181
1182 static void check_external_clock_speed(VideoState *is) {
1183    if (is->video_stream >= 0 && is->videoq.nb_packets <= MIN_FRAMES / 2 ||
1184        is->audio_stream >= 0 && is->audioq.nb_packets <= MIN_FRAMES / 2) {
1185        update_external_clock_speed(is, FFMAX(EXTERNAL_CLOCK_SPEED_MIN, is->external_clock_speed - EXTERNAL_CLOCK_SPEED_STEP));
1186    } else if ((is->video_stream < 0 || is->videoq.nb_packets > MIN_FRAMES * 2) &&
1187               (is->audio_stream < 0 || is->audioq.nb_packets > MIN_FRAMES * 2)) {
1188        update_external_clock_speed(is, FFMIN(EXTERNAL_CLOCK_SPEED_MAX, is->external_clock_speed + EXTERNAL_CLOCK_SPEED_STEP));
1189    } else {
1190        double speed = is->external_clock_speed;
1191        if (speed != 1.0)
1192            update_external_clock_speed(is, speed + EXTERNAL_CLOCK_SPEED_STEP * (1.0 - speed) / fabs(1.0 - speed));
1193    }
1194 }
1195
1196 /* seek in the stream */
1197 static void stream_seek(VideoState *is, int64_t pos, int64_t rel, int seek_by_bytes)
1198 {
1199     if (!is->seek_req) {
1200         is->seek_pos = pos;
1201         is->seek_rel = rel;
1202         is->seek_flags &= ~AVSEEK_FLAG_BYTE;
1203         if (seek_by_bytes)
1204             is->seek_flags |= AVSEEK_FLAG_BYTE;
1205         is->seek_req = 1;
1206     }
1207 }
1208
1209 /* pause or resume the video */
1210 static void stream_toggle_pause(VideoState *is)
1211 {
1212     if (is->paused) {
1213         is->frame_timer += av_gettime() / 1000000.0 + is->video_current_pts_drift - is->video_current_pts;
1214         if (is->read_pause_return != AVERROR(ENOSYS)) {
1215             is->video_current_pts = is->video_current_pts_drift + av_gettime() / 1000000.0;
1216         }
1217         is->video_current_pts_drift = is->video_current_pts - av_gettime() / 1000000.0;
1218     }
1219     update_external_clock_pts(is, get_external_clock(is));
1220     is->paused = !is->paused;
1221 }
1222
1223 static void toggle_pause(VideoState *is)
1224 {
1225     stream_toggle_pause(is);
1226     is->step = 0;
1227 }
1228
1229 static void step_to_next_frame(VideoState *is)
1230 {
1231     /* if the stream is paused unpause it, then step */
1232     if (is->paused)
1233         stream_toggle_pause(is);
1234     is->step = 1;
1235 }
1236
1237 static double compute_target_delay(double delay, VideoState *is)
1238 {
1239     double sync_threshold, diff;
1240
1241     /* update delay to follow master synchronisation source */
1242     if (get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER) {
1243         /* if video is slave, we try to correct big delays by
1244            duplicating or deleting a frame */
1245         diff = get_video_clock(is) - get_master_clock(is);
1246
1247         /* skip or repeat frame. We take into account the
1248            delay to compute the threshold. I still don't know
1249            if it is the best guess */
1250         sync_threshold = FFMAX(AV_SYNC_THRESHOLD, delay);
1251         if (fabs(diff) < AV_NOSYNC_THRESHOLD) {
1252             if (diff <= -sync_threshold)
1253                 delay = 0;
1254             else if (diff >= sync_threshold)
1255                 delay = 2 * delay;
1256         }
1257     }
1258
1259     av_dlog(NULL, "video: delay=%0.3f A-V=%f\n",
1260             delay, -diff);
1261
1262     return delay;
1263 }
1264
1265 static void pictq_next_picture(VideoState *is) {
1266     /* update queue size and signal for next picture */
1267     if (++is->pictq_rindex == VIDEO_PICTURE_QUEUE_SIZE)
1268         is->pictq_rindex = 0;
1269
1270     SDL_LockMutex(is->pictq_mutex);
1271     is->pictq_size--;
1272     SDL_CondSignal(is->pictq_cond);
1273     SDL_UnlockMutex(is->pictq_mutex);
1274 }
1275
1276 static void pictq_prev_picture(VideoState *is) {
1277     VideoPicture *prevvp;
1278     /* update queue size and signal for the previous picture */
1279     prevvp = &is->pictq[(is->pictq_rindex + VIDEO_PICTURE_QUEUE_SIZE - 1) % VIDEO_PICTURE_QUEUE_SIZE];
1280     if (prevvp->allocated && prevvp->serial == is->videoq.serial) {
1281         SDL_LockMutex(is->pictq_mutex);
1282         if (is->pictq_size < VIDEO_PICTURE_QUEUE_SIZE - 1) {
1283             if (--is->pictq_rindex == -1)
1284                 is->pictq_rindex = VIDEO_PICTURE_QUEUE_SIZE - 1;
1285             is->pictq_size++;
1286         }
1287         SDL_CondSignal(is->pictq_cond);
1288         SDL_UnlockMutex(is->pictq_mutex);
1289     }
1290 }
1291
1292 static void update_video_pts(VideoState *is, double pts, int64_t pos, int serial) {
1293     double time = av_gettime() / 1000000.0;
1294     /* update current video pts */
1295     is->video_current_pts = pts;
1296     is->video_current_pts_drift = is->video_current_pts - time;
1297     is->video_current_pos = pos;
1298     is->frame_last_pts = pts;
1299     if (is->videoq.serial == serial)
1300         check_external_clock_sync(is, is->video_current_pts);
1301 }
1302
1303 /* called to display each frame */
1304 static void video_refresh(void *opaque)
1305 {
1306     VideoState *is = opaque;
1307     VideoPicture *vp;
1308     double time;
1309
1310     SubPicture *sp, *sp2;
1311
1312     if (!is->paused && get_master_sync_type(is) == AV_SYNC_EXTERNAL_CLOCK && is->realtime)
1313         check_external_clock_speed(is);
1314
1315     if (!display_disable && is->show_mode != SHOW_MODE_VIDEO && is->audio_st)
1316         video_display(is);
1317
1318     if (is->video_st) {
1319         if (is->force_refresh)
1320             pictq_prev_picture(is);
1321 retry:
1322         if (is->pictq_size == 0) {
1323             SDL_LockMutex(is->pictq_mutex);
1324             if (is->frame_last_dropped_pts != AV_NOPTS_VALUE && is->frame_last_dropped_pts > is->frame_last_pts) {
1325                 update_video_pts(is, is->frame_last_dropped_pts, is->frame_last_dropped_pos, 0);
1326                 is->frame_last_dropped_pts = AV_NOPTS_VALUE;
1327             }
1328             SDL_UnlockMutex(is->pictq_mutex);
1329             // nothing to do, no picture to display in the queue
1330         } else {
1331             double last_duration, duration, delay;
1332             /* dequeue the picture */
1333             vp = &is->pictq[is->pictq_rindex];
1334
1335             if (vp->serial != is->videoq.serial) {
1336                 pictq_next_picture(is);
1337                 goto retry;
1338             }
1339
1340             if (is->paused)
1341                 goto display;
1342
1343             /* compute nominal last_duration */
1344             last_duration = vp->pts - is->frame_last_pts;
1345             if (last_duration > 0 && last_duration < is->max_frame_duration) {
1346                 /* if duration of the last frame was sane, update last_duration in video state */
1347                 is->frame_last_duration = last_duration;
1348             }
1349             delay = compute_target_delay(is->frame_last_duration, is);
1350
1351             time= av_gettime()/1000000.0;
1352             if (time < is->frame_timer + delay)
1353                 return;
1354
1355             if (delay > 0)
1356                 is->frame_timer += delay * FFMAX(1, floor((time-is->frame_timer) / delay));
1357
1358             SDL_LockMutex(is->pictq_mutex);
1359             update_video_pts(is, vp->pts, vp->pos, vp->serial);
1360             SDL_UnlockMutex(is->pictq_mutex);
1361
1362             if (is->pictq_size > 1) {
1363                 VideoPicture *nextvp = &is->pictq[(is->pictq_rindex + 1) % VIDEO_PICTURE_QUEUE_SIZE];
1364                 duration = nextvp->pts - vp->pts;
1365                 if(!is->step && (framedrop>0 || (framedrop && get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER)) && time > is->frame_timer + duration){
1366                     is->frame_drops_late++;
1367                     pictq_next_picture(is);
1368                     goto retry;
1369                 }
1370             }
1371
1372             if (is->subtitle_st) {
1373                 if (is->subtitle_stream_changed) {
1374                     SDL_LockMutex(is->subpq_mutex);
1375
1376                     while (is->subpq_size) {
1377                         free_subpicture(&is->subpq[is->subpq_rindex]);
1378
1379                         /* update queue size and signal for next picture */
1380                         if (++is->subpq_rindex == SUBPICTURE_QUEUE_SIZE)
1381                             is->subpq_rindex = 0;
1382
1383                         is->subpq_size--;
1384                     }
1385                     is->subtitle_stream_changed = 0;
1386
1387                     SDL_CondSignal(is->subpq_cond);
1388                     SDL_UnlockMutex(is->subpq_mutex);
1389                 } else {
1390                     if (is->subpq_size > 0) {
1391                         sp = &is->subpq[is->subpq_rindex];
1392
1393                         if (is->subpq_size > 1)
1394                             sp2 = &is->subpq[(is->subpq_rindex + 1) % SUBPICTURE_QUEUE_SIZE];
1395                         else
1396                             sp2 = NULL;
1397
1398                         if ((is->video_current_pts > (sp->pts + ((float) sp->sub.end_display_time / 1000)))
1399                                 || (sp2 && is->video_current_pts > (sp2->pts + ((float) sp2->sub.start_display_time / 1000))))
1400                         {
1401                             free_subpicture(sp);
1402
1403                             /* update queue size and signal for next picture */
1404                             if (++is->subpq_rindex == SUBPICTURE_QUEUE_SIZE)
1405                                 is->subpq_rindex = 0;
1406
1407                             SDL_LockMutex(is->subpq_mutex);
1408                             is->subpq_size--;
1409                             SDL_CondSignal(is->subpq_cond);
1410                             SDL_UnlockMutex(is->subpq_mutex);
1411                         }
1412                     }
1413                 }
1414             }
1415
1416 display:
1417             /* display picture */
1418             if (!display_disable && is->show_mode == SHOW_MODE_VIDEO)
1419                 video_display(is);
1420
1421             pictq_next_picture(is);
1422
1423             if (is->step && !is->paused)
1424                 stream_toggle_pause(is);
1425         }
1426     }
1427     is->force_refresh = 0;
1428     if (show_status) {
1429         static int64_t last_time;
1430         int64_t cur_time;
1431         int aqsize, vqsize, sqsize;
1432         double av_diff;
1433
1434         cur_time = av_gettime();
1435         if (!last_time || (cur_time - last_time) >= 30000) {
1436             aqsize = 0;
1437             vqsize = 0;
1438             sqsize = 0;
1439             if (is->audio_st)
1440                 aqsize = is->audioq.size;
1441             if (is->video_st)
1442                 vqsize = is->videoq.size;
1443             if (is->subtitle_st)
1444                 sqsize = is->subtitleq.size;
1445             av_diff = 0;
1446             if (is->audio_st && is->video_st)
1447                 av_diff = get_audio_clock(is) - get_video_clock(is);
1448             printf("%7.2f A-V:%7.3f fd=%4d aq=%5dKB vq=%5dKB sq=%5dB f=%"PRId64"/%"PRId64"   \r",
1449                    get_master_clock(is),
1450                    av_diff,
1451                    is->frame_drops_early + is->frame_drops_late,
1452                    aqsize / 1024,
1453                    vqsize / 1024,
1454                    sqsize,
1455                    is->video_st ? is->video_st->codec->pts_correction_num_faulty_dts : 0,
1456                    is->video_st ? is->video_st->codec->pts_correction_num_faulty_pts : 0);
1457             fflush(stdout);
1458             last_time = cur_time;
1459         }
1460     }
1461 }
1462
1463 /* allocate a picture (needs to do that in main thread to avoid
1464    potential locking problems */
1465 static void alloc_picture(VideoState *is)
1466 {
1467     VideoPicture *vp;
1468
1469     vp = &is->pictq[is->pictq_windex];
1470
1471     if (vp->bmp)
1472         SDL_FreeYUVOverlay(vp->bmp);
1473
1474 #if CONFIG_AVFILTER
1475     avfilter_unref_bufferp(&vp->picref);
1476 #endif
1477
1478     video_open(is, 0, vp);
1479
1480     vp->bmp = SDL_CreateYUVOverlay(vp->width, vp->height,
1481                                    SDL_YV12_OVERLAY,
1482                                    screen);
1483     if (!vp->bmp || vp->bmp->pitches[0] < vp->width) {
1484         /* SDL allocates a buffer smaller than requested if the video
1485          * overlay hardware is unable to support the requested size. */
1486         fprintf(stderr, "Error: the video system does not support an image\n"
1487                         "size of %dx%d pixels. Try using -lowres or -vf \"scale=w:h\"\n"
1488                         "to reduce the image size.\n", vp->width, vp->height );
1489         do_exit(is);
1490     }
1491
1492     SDL_LockMutex(is->pictq_mutex);
1493     vp->allocated = 1;
1494     SDL_CondSignal(is->pictq_cond);
1495     SDL_UnlockMutex(is->pictq_mutex);
1496 }
1497
1498 static void duplicate_right_border_pixels(SDL_Overlay *bmp) {
1499     int i, width, height;
1500     Uint8 *p, *maxp;
1501     for (i = 0; i < 3; i++) {
1502         width  = bmp->w;
1503         height = bmp->h;
1504         if (i > 0) {
1505             width  >>= 1;
1506             height >>= 1;
1507         }
1508         if (bmp->pitches[i] > width) {
1509             maxp = bmp->pixels[i] + bmp->pitches[i] * height - 1;
1510             for (p = bmp->pixels[i] + width - 1; p < maxp; p += bmp->pitches[i])
1511                 *(p+1) = *p;
1512         }
1513     }
1514 }
1515
1516 static int queue_picture(VideoState *is, AVFrame *src_frame, double pts1, int64_t pos, int serial)
1517 {
1518     VideoPicture *vp;
1519     double frame_delay, pts = pts1;
1520
1521     /* compute the exact PTS for the picture if it is omitted in the stream
1522      * pts1 is the dts of the pkt / pts of the frame */
1523     if (pts != 0) {
1524         /* update video clock with pts, if present */
1525         is->video_clock = pts;
1526     } else {
1527         pts = is->video_clock;
1528     }
1529     /* update video clock for next frame */
1530     frame_delay = av_q2d(is->video_st->codec->time_base);
1531     /* for MPEG2, the frame can be repeated, so we update the
1532        clock accordingly */
1533     frame_delay += src_frame->repeat_pict * (frame_delay * 0.5);
1534     is->video_clock += frame_delay;
1535
1536 #if defined(DEBUG_SYNC) && 0
1537     printf("frame_type=%c clock=%0.3f pts=%0.3f\n",
1538            av_get_picture_type_char(src_frame->pict_type), pts, pts1);
1539 #endif
1540
1541     /* wait until we have space to put a new picture */
1542     SDL_LockMutex(is->pictq_mutex);
1543
1544     /* keep the last already displayed picture in the queue */
1545     while (is->pictq_size >= VIDEO_PICTURE_QUEUE_SIZE - 2 &&
1546            !is->videoq.abort_request) {
1547         SDL_CondWait(is->pictq_cond, is->pictq_mutex);
1548     }
1549     SDL_UnlockMutex(is->pictq_mutex);
1550
1551     if (is->videoq.abort_request)
1552         return -1;
1553
1554     vp = &is->pictq[is->pictq_windex];
1555
1556 #if CONFIG_AVFILTER
1557     vp->sample_aspect_ratio = ((AVFilterBufferRef *)src_frame->opaque)->video->sample_aspect_ratio;
1558 #else
1559     vp->sample_aspect_ratio = av_guess_sample_aspect_ratio(is->ic, is->video_st, src_frame);
1560 #endif
1561
1562     /* alloc or resize hardware picture buffer */
1563     if (!vp->bmp || vp->reallocate || !vp->allocated ||
1564         vp->width  != src_frame->width ||
1565         vp->height != src_frame->height) {
1566         SDL_Event event;
1567
1568         vp->allocated  = 0;
1569         vp->reallocate = 0;
1570         vp->width = src_frame->width;
1571         vp->height = src_frame->height;
1572
1573         /* the allocation must be done in the main thread to avoid
1574            locking problems. */
1575         event.type = FF_ALLOC_EVENT;
1576         event.user.data1 = is;
1577         SDL_PushEvent(&event);
1578
1579         /* wait until the picture is allocated */
1580         SDL_LockMutex(is->pictq_mutex);
1581         while (!vp->allocated && !is->videoq.abort_request) {
1582             SDL_CondWait(is->pictq_cond, is->pictq_mutex);
1583         }
1584         /* if the queue is aborted, we have to pop the pending ALLOC event or wait for the allocation to complete */
1585         if (is->videoq.abort_request && SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_EVENTMASK(FF_ALLOC_EVENT)) != 1) {
1586             while (!vp->allocated) {
1587                 SDL_CondWait(is->pictq_cond, is->pictq_mutex);
1588             }
1589         }
1590         SDL_UnlockMutex(is->pictq_mutex);
1591
1592         if (is->videoq.abort_request)
1593             return -1;
1594     }
1595
1596     /* if the frame is not skipped, then display it */
1597     if (vp->bmp) {
1598         AVPicture pict = { { 0 } };
1599 #if CONFIG_AVFILTER
1600         avfilter_unref_bufferp(&vp->picref);
1601         vp->picref = src_frame->opaque;
1602 #endif
1603
1604         /* get a pointer on the bitmap */
1605         SDL_LockYUVOverlay (vp->bmp);
1606
1607         pict.data[0] = vp->bmp->pixels[0];
1608         pict.data[1] = vp->bmp->pixels[2];
1609         pict.data[2] = vp->bmp->pixels[1];
1610
1611         pict.linesize[0] = vp->bmp->pitches[0];
1612         pict.linesize[1] = vp->bmp->pitches[2];
1613         pict.linesize[2] = vp->bmp->pitches[1];
1614
1615 #if CONFIG_AVFILTER
1616         // FIXME use direct rendering
1617         av_picture_copy(&pict, (AVPicture *)src_frame,
1618                         src_frame->format, vp->width, vp->height);
1619 #else
1620         av_opt_get_int(sws_opts, "sws_flags", 0, &sws_flags);
1621         is->img_convert_ctx = sws_getCachedContext(is->img_convert_ctx,
1622             vp->width, vp->height, src_frame->format, vp->width, vp->height,
1623             AV_PIX_FMT_YUV420P, sws_flags, NULL, NULL, NULL);
1624         if (is->img_convert_ctx == NULL) {
1625             fprintf(stderr, "Cannot initialize the conversion context\n");
1626             exit(1);
1627         }
1628         sws_scale(is->img_convert_ctx, src_frame->data, src_frame->linesize,
1629                   0, vp->height, pict.data, pict.linesize);
1630 #endif
1631         /* workaround SDL PITCH_WORKAROUND */
1632         duplicate_right_border_pixels(vp->bmp);
1633         /* update the bitmap content */
1634         SDL_UnlockYUVOverlay(vp->bmp);
1635
1636         vp->pts = pts;
1637         vp->pos = pos;
1638         vp->serial = serial;
1639
1640         /* now we can update the picture count */
1641         if (++is->pictq_windex == VIDEO_PICTURE_QUEUE_SIZE)
1642             is->pictq_windex = 0;
1643         SDL_LockMutex(is->pictq_mutex);
1644         is->pictq_size++;
1645         SDL_UnlockMutex(is->pictq_mutex);
1646     }
1647     return 0;
1648 }
1649
1650 static int get_video_frame(VideoState *is, AVFrame *frame, int64_t *pts, AVPacket *pkt, int *serial)
1651 {
1652     int got_picture;
1653
1654     if (packet_queue_get(&is->videoq, pkt, 1, serial) < 0)
1655         return -1;
1656
1657     if (pkt->data == flush_pkt.data) {
1658         avcodec_flush_buffers(is->video_st->codec);
1659
1660         SDL_LockMutex(is->pictq_mutex);
1661         // Make sure there are no long delay timers (ideally we should just flush the queue but that's harder)
1662         while (is->pictq_size && !is->videoq.abort_request) {
1663             SDL_CondWait(is->pictq_cond, is->pictq_mutex);
1664         }
1665         is->video_current_pos = -1;
1666         is->frame_last_pts = AV_NOPTS_VALUE;
1667         is->frame_last_duration = 0;
1668         is->frame_timer = (double)av_gettime() / 1000000.0;
1669         is->frame_last_dropped_pts = AV_NOPTS_VALUE;
1670         SDL_UnlockMutex(is->pictq_mutex);
1671
1672         return 0;
1673     }
1674
1675     if(avcodec_decode_video2(is->video_st->codec, frame, &got_picture, pkt) < 0)
1676         return 0;
1677
1678     if (got_picture) {
1679         int ret = 1;
1680
1681         if (decoder_reorder_pts == -1) {
1682             *pts = av_frame_get_best_effort_timestamp(frame);
1683         } else if (decoder_reorder_pts) {
1684             *pts = frame->pkt_pts;
1685         } else {
1686             *pts = frame->pkt_dts;
1687         }
1688
1689         if (*pts == AV_NOPTS_VALUE) {
1690             *pts = 0;
1691         }
1692
1693         if (framedrop>0 || (framedrop && get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER)) {
1694             SDL_LockMutex(is->pictq_mutex);
1695             if (is->frame_last_pts != AV_NOPTS_VALUE && *pts) {
1696                 double clockdiff = get_video_clock(is) - get_master_clock(is);
1697                 double dpts = av_q2d(is->video_st->time_base) * *pts;
1698                 double ptsdiff = dpts - is->frame_last_pts;
1699                 if (fabs(clockdiff) < AV_NOSYNC_THRESHOLD &&
1700                      ptsdiff > 0 && ptsdiff < AV_NOSYNC_THRESHOLD &&
1701                      clockdiff + ptsdiff - is->frame_last_filter_delay < 0) {
1702                     is->frame_last_dropped_pos = pkt->pos;
1703                     is->frame_last_dropped_pts = dpts;
1704                     is->frame_drops_early++;
1705                     ret = 0;
1706                 }
1707             }
1708             SDL_UnlockMutex(is->pictq_mutex);
1709         }
1710
1711         return ret;
1712     }
1713     return 0;
1714 }
1715
1716 #if CONFIG_AVFILTER
1717 static int configure_filtergraph(AVFilterGraph *graph, const char *filtergraph,
1718                                  AVFilterContext *source_ctx, AVFilterContext *sink_ctx)
1719 {
1720     int ret;
1721     AVFilterInOut *outputs = NULL, *inputs = NULL;
1722
1723     if (filtergraph) {
1724         outputs = avfilter_inout_alloc();
1725         inputs  = avfilter_inout_alloc();
1726         if (!outputs || !inputs) {
1727             ret = AVERROR(ENOMEM);
1728             goto fail;
1729         }
1730
1731         outputs->name       = av_strdup("in");
1732         outputs->filter_ctx = source_ctx;
1733         outputs->pad_idx    = 0;
1734         outputs->next       = NULL;
1735
1736         inputs->name        = av_strdup("out");
1737         inputs->filter_ctx  = sink_ctx;
1738         inputs->pad_idx     = 0;
1739         inputs->next        = NULL;
1740
1741         if ((ret = avfilter_graph_parse(graph, filtergraph, &inputs, &outputs, NULL)) < 0)
1742             goto fail;
1743     } else {
1744         if ((ret = avfilter_link(source_ctx, 0, sink_ctx, 0)) < 0)
1745             goto fail;
1746     }
1747
1748     ret = avfilter_graph_config(graph, NULL);
1749 fail:
1750     avfilter_inout_free(&outputs);
1751     avfilter_inout_free(&inputs);
1752     return ret;
1753 }
1754
1755 static int configure_video_filters(AVFilterGraph *graph, VideoState *is, const char *vfilters, AVFrame *frame)
1756 {
1757     static const enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE };
1758     char sws_flags_str[128];
1759     char buffersrc_args[256];
1760     int ret;
1761     AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
1762     AVFilterContext *filt_src = NULL, *filt_out = NULL, *filt_crop;
1763     AVCodecContext *codec = is->video_st->codec;
1764
1765     if (!buffersink_params)
1766         return AVERROR(ENOMEM);
1767
1768     av_opt_get_int(sws_opts, "sws_flags", 0, &sws_flags);
1769     snprintf(sws_flags_str, sizeof(sws_flags_str), "flags=%"PRId64, sws_flags);
1770     graph->scale_sws_opts = av_strdup(sws_flags_str);
1771
1772     snprintf(buffersrc_args, sizeof(buffersrc_args),
1773              "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
1774              frame->width, frame->height, frame->format,
1775              is->video_st->time_base.num, is->video_st->time_base.den,
1776              codec->sample_aspect_ratio.num, FFMAX(codec->sample_aspect_ratio.den, 1));
1777
1778     if ((ret = avfilter_graph_create_filter(&filt_src,
1779                                             avfilter_get_by_name("buffer"),
1780                                             "ffplay_buffer", buffersrc_args, NULL,
1781                                             graph)) < 0)
1782         goto fail;
1783
1784     buffersink_params->pixel_fmts = pix_fmts;
1785     ret = avfilter_graph_create_filter(&filt_out,
1786                                        avfilter_get_by_name("ffbuffersink"),
1787                                        "ffplay_buffersink", NULL, buffersink_params, graph);
1788     if (ret < 0)
1789         goto fail;
1790
1791     /* SDL YUV code is not handling odd width/height for some driver
1792      * combinations, therefore we crop the picture to an even width/height. */
1793     if ((ret = avfilter_graph_create_filter(&filt_crop,
1794                                             avfilter_get_by_name("crop"),
1795                                             "ffplay_crop", "floor(in_w/2)*2:floor(in_h/2)*2", NULL, graph)) < 0)
1796         goto fail;
1797     if ((ret = avfilter_link(filt_crop, 0, filt_out, 0)) < 0)
1798         goto fail;
1799
1800     if ((ret = configure_filtergraph(graph, vfilters, filt_src, filt_crop)) < 0)
1801         goto fail;
1802
1803     is->in_video_filter  = filt_src;
1804     is->out_video_filter = filt_out;
1805
1806 fail:
1807     av_freep(&buffersink_params);
1808     return ret;
1809 }
1810
1811 #endif  /* CONFIG_AVFILTER */
1812
1813 static int video_thread(void *arg)
1814 {
1815     AVPacket pkt = { 0 };
1816     VideoState *is = arg;
1817     AVFrame *frame = avcodec_alloc_frame();
1818     int64_t pts_int = AV_NOPTS_VALUE, pos = -1;
1819     double pts;
1820     int ret;
1821     int serial = 0;
1822
1823 #if CONFIG_AVFILTER
1824     AVCodecContext *codec = is->video_st->codec;
1825     AVFilterGraph *graph = avfilter_graph_alloc();
1826     AVFilterContext *filt_out = NULL, *filt_in = NULL;
1827     int last_w = 0;
1828     int last_h = 0;
1829     enum AVPixelFormat last_format = -2;
1830     int last_serial = -1;
1831
1832     if (codec->codec->capabilities & CODEC_CAP_DR1) {
1833         is->use_dr1 = 1;
1834         codec->get_buffer     = codec_get_buffer;
1835         codec->release_buffer = codec_release_buffer;
1836         codec->opaque         = &is->buffer_pool;
1837     }
1838 #endif
1839
1840     for (;;) {
1841 #if CONFIG_AVFILTER
1842         AVFilterBufferRef *picref;
1843         AVRational tb;
1844 #endif
1845         while (is->paused && !is->videoq.abort_request)
1846             SDL_Delay(10);
1847
1848         avcodec_get_frame_defaults(frame);
1849         av_free_packet(&pkt);
1850
1851         ret = get_video_frame(is, frame, &pts_int, &pkt, &serial);
1852         if (ret < 0)
1853             goto the_end;
1854
1855         if (!ret)
1856             continue;
1857
1858 #if CONFIG_AVFILTER
1859         if (   last_w != frame->width
1860             || last_h != frame->height
1861             || last_format != frame->format
1862             || last_serial != serial) {
1863             av_log(NULL, AV_LOG_INFO, "Frame changed from size:%dx%d to size:%dx%d\n",
1864                    last_w, last_h, frame->width, frame->height);
1865             avfilter_graph_free(&graph);
1866             graph = avfilter_graph_alloc();
1867             if ((ret = configure_video_filters(graph, is, vfilters, frame)) < 0) {
1868                 SDL_Event event;
1869                 event.type = FF_QUIT_EVENT;
1870                 event.user.data1 = is;
1871                 SDL_PushEvent(&event);
1872                 av_free_packet(&pkt);
1873                 goto the_end;
1874             }
1875             filt_in  = is->in_video_filter;
1876             filt_out = is->out_video_filter;
1877             last_w = frame->width;
1878             last_h = frame->height;
1879             last_format = frame->format;
1880             last_serial = serial;
1881         }
1882
1883         frame->pts = pts_int;
1884         frame->sample_aspect_ratio = av_guess_sample_aspect_ratio(is->ic, is->video_st, frame);
1885         if (is->use_dr1 && frame->opaque) {
1886             FrameBuffer      *buf = frame->opaque;
1887             AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
1888                                         frame->data, frame->linesize,
1889                                         AV_PERM_READ | AV_PERM_PRESERVE,
1890                                         frame->width, frame->height,
1891                                         frame->format);
1892
1893             avfilter_copy_frame_props(fb, frame);
1894             fb->buf->priv           = buf;
1895             fb->buf->free           = filter_release_buffer;
1896
1897             buf->refcount++;
1898             av_buffersrc_add_ref(filt_in, fb, AV_BUFFERSRC_FLAG_NO_COPY);
1899
1900         } else
1901             av_buffersrc_write_frame(filt_in, frame);
1902
1903         av_free_packet(&pkt);
1904
1905         while (ret >= 0) {
1906             is->frame_last_returned_time = av_gettime() / 1000000.0;
1907
1908             ret = av_buffersink_get_buffer_ref(filt_out, &picref, 0);
1909             if (ret < 0) {
1910                 ret = 0;
1911                 break;
1912             }
1913
1914             is->frame_last_filter_delay = av_gettime() / 1000000.0 - is->frame_last_returned_time;
1915             if (fabs(is->frame_last_filter_delay) > AV_NOSYNC_THRESHOLD / 10.0)
1916                 is->frame_last_filter_delay = 0;
1917
1918             avfilter_copy_buf_props(frame, picref);
1919
1920             pts_int = picref->pts;
1921             tb      = filt_out->inputs[0]->time_base;
1922             pos     = picref->pos;
1923             frame->opaque = picref;
1924
1925             if (av_cmp_q(tb, is->video_st->time_base)) {
1926                 av_unused int64_t pts1 = pts_int;
1927                 pts_int = av_rescale_q(pts_int, tb, is->video_st->time_base);
1928                 av_dlog(NULL, "video_thread(): "
1929                         "tb:%d/%d pts:%"PRId64" -> tb:%d/%d pts:%"PRId64"\n",
1930                         tb.num, tb.den, pts1,
1931                         is->video_st->time_base.num, is->video_st->time_base.den, pts_int);
1932             }
1933             pts = pts_int * av_q2d(is->video_st->time_base);
1934             ret = queue_picture(is, frame, pts, pos, serial);
1935         }
1936 #else
1937         pts = pts_int * av_q2d(is->video_st->time_base);
1938         ret = queue_picture(is, frame, pts, pkt.pos, serial);
1939 #endif
1940
1941         if (ret < 0)
1942             goto the_end;
1943     }
1944  the_end:
1945     avcodec_flush_buffers(is->video_st->codec);
1946 #if CONFIG_AVFILTER
1947     avfilter_graph_free(&graph);
1948 #endif
1949     av_free_packet(&pkt);
1950     avcodec_free_frame(&frame);
1951     return 0;
1952 }
1953
1954 static int subtitle_thread(void *arg)
1955 {
1956     VideoState *is = arg;
1957     SubPicture *sp;
1958     AVPacket pkt1, *pkt = &pkt1;
1959     int got_subtitle;
1960     double pts;
1961     int i, j;
1962     int r, g, b, y, u, v, a;
1963
1964     for (;;) {
1965         while (is->paused && !is->subtitleq.abort_request) {
1966             SDL_Delay(10);
1967         }
1968         if (packet_queue_get(&is->subtitleq, pkt, 1, NULL) < 0)
1969             break;
1970
1971         if (pkt->data == flush_pkt.data) {
1972             avcodec_flush_buffers(is->subtitle_st->codec);
1973             continue;
1974         }
1975         SDL_LockMutex(is->subpq_mutex);
1976         while (is->subpq_size >= SUBPICTURE_QUEUE_SIZE &&
1977                !is->subtitleq.abort_request) {
1978             SDL_CondWait(is->subpq_cond, is->subpq_mutex);
1979         }
1980         SDL_UnlockMutex(is->subpq_mutex);
1981
1982         if (is->subtitleq.abort_request)
1983             return 0;
1984
1985         sp = &is->subpq[is->subpq_windex];
1986
1987        /* NOTE: ipts is the PTS of the _first_ picture beginning in
1988            this packet, if any */
1989         pts = 0;
1990         if (pkt->pts != AV_NOPTS_VALUE)
1991             pts = av_q2d(is->subtitle_st->time_base) * pkt->pts;
1992
1993         avcodec_decode_subtitle2(is->subtitle_st->codec, &sp->sub,
1994                                  &got_subtitle, pkt);
1995         if (got_subtitle && sp->sub.format == 0) {
1996             if (sp->sub.pts != AV_NOPTS_VALUE)
1997                 pts = sp->sub.pts / (double)AV_TIME_BASE;
1998             sp->pts = pts;
1999
2000             for (i = 0; i < sp->sub.num_rects; i++)
2001             {
2002                 for (j = 0; j < sp->sub.rects[i]->nb_colors; j++)
2003                 {
2004                     RGBA_IN(r, g, b, a, (uint32_t*)sp->sub.rects[i]->pict.data[1] + j);
2005                     y = RGB_TO_Y_CCIR(r, g, b);
2006                     u = RGB_TO_U_CCIR(r, g, b, 0);
2007                     v = RGB_TO_V_CCIR(r, g, b, 0);
2008                     YUVA_OUT((uint32_t*)sp->sub.rects[i]->pict.data[1] + j, y, u, v, a);
2009                 }
2010             }
2011
2012             /* now we can update the picture count */
2013             if (++is->subpq_windex == SUBPICTURE_QUEUE_SIZE)
2014                 is->subpq_windex = 0;
2015             SDL_LockMutex(is->subpq_mutex);
2016             is->subpq_size++;
2017             SDL_UnlockMutex(is->subpq_mutex);
2018         }
2019         av_free_packet(pkt);
2020     }
2021     return 0;
2022 }
2023
2024 /* copy samples for viewing in editor window */
2025 static void update_sample_display(VideoState *is, short *samples, int samples_size)
2026 {
2027     int size, len;
2028
2029     size = samples_size / sizeof(short);
2030     while (size > 0) {
2031         len = SAMPLE_ARRAY_SIZE - is->sample_array_index;
2032         if (len > size)
2033             len = size;
2034         memcpy(is->sample_array + is->sample_array_index, samples, len * sizeof(short));
2035         samples += len;
2036         is->sample_array_index += len;
2037         if (is->sample_array_index >= SAMPLE_ARRAY_SIZE)
2038             is->sample_array_index = 0;
2039         size -= len;
2040     }
2041 }
2042
2043 /* return the wanted number of samples to get better sync if sync_type is video
2044  * or external master clock */
2045 static int synchronize_audio(VideoState *is, int nb_samples)
2046 {
2047     int wanted_nb_samples = nb_samples;
2048
2049     /* if not master, then we try to remove or add samples to correct the clock */
2050     if (get_master_sync_type(is) != AV_SYNC_AUDIO_MASTER) {
2051         double diff, avg_diff;
2052         int min_nb_samples, max_nb_samples;
2053
2054         diff = get_audio_clock(is) - get_master_clock(is);
2055
2056         if (fabs(diff) < AV_NOSYNC_THRESHOLD) {
2057             is->audio_diff_cum = diff + is->audio_diff_avg_coef * is->audio_diff_cum;
2058             if (is->audio_diff_avg_count < AUDIO_DIFF_AVG_NB) {
2059                 /* not enough measures to have a correct estimate */
2060                 is->audio_diff_avg_count++;
2061             } else {
2062                 /* estimate the A-V difference */
2063                 avg_diff = is->audio_diff_cum * (1.0 - is->audio_diff_avg_coef);
2064
2065                 if (fabs(avg_diff) >= is->audio_diff_threshold) {
2066                     wanted_nb_samples = nb_samples + (int)(diff * is->audio_src.freq);
2067                     min_nb_samples = ((nb_samples * (100 - SAMPLE_CORRECTION_PERCENT_MAX) / 100));
2068                     max_nb_samples = ((nb_samples * (100 + SAMPLE_CORRECTION_PERCENT_MAX) / 100));
2069                     wanted_nb_samples = FFMIN(FFMAX(wanted_nb_samples, min_nb_samples), max_nb_samples);
2070                 }
2071                 av_dlog(NULL, "diff=%f adiff=%f sample_diff=%d apts=%0.3f vpts=%0.3f %f\n",
2072                         diff, avg_diff, wanted_nb_samples - nb_samples,
2073                         is->audio_clock, is->video_clock, is->audio_diff_threshold);
2074             }
2075         } else {
2076             /* too big difference : may be initial PTS errors, so
2077                reset A-V filter */
2078             is->audio_diff_avg_count = 0;
2079             is->audio_diff_cum       = 0;
2080         }
2081     }
2082
2083     return wanted_nb_samples;
2084 }
2085
2086 /**
2087  * Decode one audio frame and return its uncompressed size.
2088  *
2089  * The processed audio frame is decoded, converted if required, and
2090  * stored in is->audio_buf, with size in bytes given by the return
2091  * value.
2092  */
2093 static int audio_decode_frame(VideoState *is, double *pts_ptr)
2094 {
2095     AVPacket *pkt_temp = &is->audio_pkt_temp;
2096     AVPacket *pkt = &is->audio_pkt;
2097     AVCodecContext *dec = is->audio_st->codec;
2098     int len1, len2, data_size, resampled_data_size;
2099     int64_t dec_channel_layout;
2100     int got_frame;
2101     double pts;
2102     int new_packet = 0;
2103     int flush_complete = 0;
2104     int wanted_nb_samples;
2105
2106     for (;;) {
2107         /* NOTE: the audio packet can contain several frames */
2108         while (pkt_temp->size > 0 || (!pkt_temp->data && new_packet)) {
2109             if (!is->frame) {
2110                 if (!(is->frame = avcodec_alloc_frame()))
2111                     return AVERROR(ENOMEM);
2112             } else
2113                 avcodec_get_frame_defaults(is->frame);
2114
2115             if (is->paused)
2116                 return -1;
2117
2118             if (flush_complete)
2119                 break;
2120             new_packet = 0;
2121             len1 = avcodec_decode_audio4(dec, is->frame, &got_frame, pkt_temp);
2122             if (len1 < 0) {
2123                 /* if error, we skip the frame */
2124                 pkt_temp->size = 0;
2125                 break;
2126             }
2127
2128             pkt_temp->data += len1;
2129             pkt_temp->size -= len1;
2130
2131             if (!got_frame) {
2132                 /* stop sending empty packets if the decoder is finished */
2133                 if (!pkt_temp->data && dec->codec->capabilities & CODEC_CAP_DELAY)
2134                     flush_complete = 1;
2135                 continue;
2136             }
2137             data_size = av_samples_get_buffer_size(NULL, is->frame->channels,
2138                                                    is->frame->nb_samples,
2139                                                    is->frame->format, 1);
2140
2141             dec_channel_layout =
2142                 (is->frame->channel_layout && is->frame->channels == av_get_channel_layout_nb_channels(is->frame->channel_layout)) ?
2143                 is->frame->channel_layout : av_get_default_channel_layout(is->frame->channels);
2144             wanted_nb_samples = synchronize_audio(is, is->frame->nb_samples);
2145
2146             if (is->frame->format        != is->audio_src.fmt            ||
2147                 dec_channel_layout       != is->audio_src.channel_layout ||
2148                 is->frame->sample_rate   != is->audio_src.freq           ||
2149                 (wanted_nb_samples       != is->frame->nb_samples && !is->swr_ctx)) {
2150                 swr_free(&is->swr_ctx);
2151                 is->swr_ctx = swr_alloc_set_opts(NULL,
2152                                                  is->audio_tgt.channel_layout, is->audio_tgt.fmt, is->audio_tgt.freq,
2153                                                  dec_channel_layout,           is->frame->format, is->frame->sample_rate,
2154                                                  0, NULL);
2155                 if (!is->swr_ctx || swr_init(is->swr_ctx) < 0) {
2156                     fprintf(stderr, "Cannot create sample rate converter for conversion of %d Hz %s %d channels to %d Hz %s %d channels!\n",
2157                         is->frame->sample_rate,   av_get_sample_fmt_name(is->frame->format), (int)is->frame->channels,
2158                         is->audio_tgt.freq, av_get_sample_fmt_name(is->audio_tgt.fmt), is->audio_tgt.channels);
2159                     break;
2160                 }
2161                 is->audio_src.channel_layout = dec_channel_layout;
2162                 is->audio_src.channels = is->frame->channels;
2163                 is->audio_src.freq = is->frame->sample_rate;
2164                 is->audio_src.fmt = is->frame->format;
2165             }
2166
2167             if (is->swr_ctx) {
2168                 const uint8_t **in = (const uint8_t **)is->frame->extended_data;
2169                 uint8_t **out = &is->audio_buf1;
2170                 int out_count = (int64_t)wanted_nb_samples * is->audio_tgt.freq / is->frame->sample_rate + 256;
2171                 int out_size  = av_samples_get_buffer_size(NULL, is->audio_tgt.channels, out_count, is->audio_tgt.fmt, 0);
2172                 if (wanted_nb_samples != is->frame->nb_samples) {
2173                     if (swr_set_compensation(is->swr_ctx, (wanted_nb_samples - is->frame->nb_samples) * is->audio_tgt.freq / is->frame->sample_rate,
2174                                                 wanted_nb_samples * is->audio_tgt.freq / is->frame->sample_rate) < 0) {
2175                         fprintf(stderr, "swr_set_compensation() failed\n");
2176                         break;
2177                     }
2178                 }
2179                 av_fast_malloc(&is->audio_buf1, &is->audio_buf1_size, out_size);
2180                 if (!is->audio_buf1)
2181                     return AVERROR(ENOMEM);
2182                 len2 = swr_convert(is->swr_ctx, out, out_count, in, is->frame->nb_samples);
2183                 if (len2 < 0) {
2184                     fprintf(stderr, "swr_convert() failed\n");
2185                     break;
2186                 }
2187                 if (len2 == out_count) {
2188                     fprintf(stderr, "warning: audio buffer is probably too small\n");
2189                     swr_init(is->swr_ctx);
2190                 }
2191                 is->audio_buf = is->audio_buf1;
2192                 resampled_data_size = len2 * is->audio_tgt.channels * av_get_bytes_per_sample(is->audio_tgt.fmt);
2193             } else {
2194                 is->audio_buf = is->frame->data[0];
2195                 resampled_data_size = data_size;
2196             }
2197
2198             /* if no pts, then compute it */
2199             pts = is->audio_clock;
2200             *pts_ptr = pts;
2201             is->audio_clock += (double)data_size /
2202                 (is->frame->channels * is->frame->sample_rate * av_get_bytes_per_sample(is->frame->format));
2203 #ifdef DEBUG
2204             {
2205                 static double last_clock;
2206                 printf("audio: delay=%0.3f clock=%0.3f pts=%0.3f\n",
2207                        is->audio_clock - last_clock,
2208                        is->audio_clock, pts);
2209                 last_clock = is->audio_clock;
2210             }
2211 #endif
2212             return resampled_data_size;
2213         }
2214
2215         /* free the current packet */
2216         if (pkt->data)
2217             av_free_packet(pkt);
2218         memset(pkt_temp, 0, sizeof(*pkt_temp));
2219
2220         if (is->paused || is->audioq.abort_request) {
2221             return -1;
2222         }
2223
2224         if (is->audioq.nb_packets == 0)
2225             SDL_CondSignal(is->continue_read_thread);
2226
2227         /* read next packet */
2228         if ((new_packet = packet_queue_get(&is->audioq, pkt, 1, &is->audio_pkt_temp_serial)) < 0)
2229             return -1;
2230
2231         if (pkt->data == flush_pkt.data) {
2232             avcodec_flush_buffers(dec);
2233             flush_complete = 0;
2234         }
2235
2236         *pkt_temp = *pkt;
2237
2238         /* if update the audio clock with the pts */
2239         if (pkt->pts != AV_NOPTS_VALUE) {
2240             is->audio_clock = av_q2d(is->audio_st->time_base)*pkt->pts;
2241         }
2242     }
2243 }
2244
2245 /* prepare a new audio buffer */
2246 static void sdl_audio_callback(void *opaque, Uint8 *stream, int len)
2247 {
2248     VideoState *is = opaque;
2249     int audio_size, len1;
2250     int bytes_per_sec;
2251     int frame_size = av_samples_get_buffer_size(NULL, is->audio_tgt.channels, 1, is->audio_tgt.fmt, 1);
2252     double pts;
2253
2254     audio_callback_time = av_gettime();
2255
2256     while (len > 0) {
2257         if (is->audio_buf_index >= is->audio_buf_size) {
2258            audio_size = audio_decode_frame(is, &pts);
2259            if (audio_size < 0) {
2260                 /* if error, just output silence */
2261                is->audio_buf      = is->silence_buf;
2262                is->audio_buf_size = sizeof(is->silence_buf) / frame_size * frame_size;
2263            } else {
2264                if (is->show_mode != SHOW_MODE_VIDEO)
2265                    update_sample_display(is, (int16_t *)is->audio_buf, audio_size);
2266                is->audio_buf_size = audio_size;
2267            }
2268            is->audio_buf_index = 0;
2269         }
2270         len1 = is->audio_buf_size - is->audio_buf_index;
2271         if (len1 > len)
2272             len1 = len;
2273         memcpy(stream, (uint8_t *)is->audio_buf + is->audio_buf_index, len1);
2274         len -= len1;
2275         stream += len1;
2276         is->audio_buf_index += len1;
2277     }
2278     bytes_per_sec = is->audio_tgt.freq * is->audio_tgt.channels * av_get_bytes_per_sample(is->audio_tgt.fmt);
2279     is->audio_write_buf_size = is->audio_buf_size - is->audio_buf_index;
2280     /* Let's assume the audio driver that is used by SDL has two periods. */
2281     is->audio_current_pts = is->audio_clock - (double)(2 * is->audio_hw_buf_size + is->audio_write_buf_size) / bytes_per_sec;
2282     is->audio_current_pts_drift = is->audio_current_pts - audio_callback_time / 1000000.0;
2283     if (is->audioq.serial == is->audio_pkt_temp_serial)
2284         check_external_clock_sync(is, is->audio_current_pts);
2285 }
2286
2287 static int audio_open(void *opaque, int64_t wanted_channel_layout, int wanted_nb_channels, int wanted_sample_rate, struct AudioParams *audio_hw_params)
2288 {
2289     SDL_AudioSpec wanted_spec, spec;
2290     const char *env;
2291     const int next_nb_channels[] = {0, 0, 1, 6, 2, 6, 4, 6};
2292
2293     env = SDL_getenv("SDL_AUDIO_CHANNELS");
2294     if (env) {
2295         wanted_nb_channels = atoi(env);
2296         wanted_channel_layout = av_get_default_channel_layout(wanted_nb_channels);
2297     }
2298     if (!wanted_channel_layout || wanted_nb_channels != av_get_channel_layout_nb_channels(wanted_channel_layout)) {
2299         wanted_channel_layout = av_get_default_channel_layout(wanted_nb_channels);
2300         wanted_channel_layout &= ~AV_CH_LAYOUT_STEREO_DOWNMIX;
2301     }
2302     wanted_spec.channels = av_get_channel_layout_nb_channels(wanted_channel_layout);
2303     wanted_spec.freq = wanted_sample_rate;
2304     if (wanted_spec.freq <= 0 || wanted_spec.channels <= 0) {
2305         fprintf(stderr, "Invalid sample rate or channel count!\n");
2306         return -1;
2307     }
2308     wanted_spec.format = AUDIO_S16SYS;
2309     wanted_spec.silence = 0;
2310     wanted_spec.samples = SDL_AUDIO_BUFFER_SIZE;
2311     wanted_spec.callback = sdl_audio_callback;
2312     wanted_spec.userdata = opaque;
2313     while (SDL_OpenAudio(&wanted_spec, &spec) < 0) {
2314         fprintf(stderr, "SDL_OpenAudio (%d channels): %s\n", wanted_spec.channels, SDL_GetError());
2315         wanted_spec.channels = next_nb_channels[FFMIN(7, wanted_spec.channels)];
2316         if (!wanted_spec.channels) {
2317             fprintf(stderr, "No more channel combinations to try, audio open failed\n");
2318             return -1;
2319         }
2320         wanted_channel_layout = av_get_default_channel_layout(wanted_spec.channels);
2321     }
2322     if (spec.format != AUDIO_S16SYS) {
2323         fprintf(stderr, "SDL advised audio format %d is not supported!\n", spec.format);
2324         return -1;
2325     }
2326     if (spec.channels != wanted_spec.channels) {
2327         wanted_channel_layout = av_get_default_channel_layout(spec.channels);
2328         if (!wanted_channel_layout) {
2329             fprintf(stderr, "SDL advised channel count %d is not supported!\n", spec.channels);
2330             return -1;
2331         }
2332     }
2333
2334     audio_hw_params->fmt = AV_SAMPLE_FMT_S16;
2335     audio_hw_params->freq = spec.freq;
2336     audio_hw_params->channel_layout = wanted_channel_layout;
2337     audio_hw_params->channels =  spec.channels;
2338     return spec.size;
2339 }
2340
2341 /* open a given stream. Return 0 if OK */
2342 static int stream_component_open(VideoState *is, int stream_index)
2343 {
2344     AVFormatContext *ic = is->ic;
2345     AVCodecContext *avctx;
2346     AVCodec *codec;
2347     const char *forced_codec_name = NULL;
2348     AVDictionary *opts;
2349     AVDictionaryEntry *t = NULL;
2350
2351     if (stream_index < 0 || stream_index >= ic->nb_streams)
2352         return -1;
2353     avctx = ic->streams[stream_index]->codec;
2354
2355     codec = avcodec_find_decoder(avctx->codec_id);
2356
2357     switch(avctx->codec_type){
2358         case AVMEDIA_TYPE_AUDIO   : is->last_audio_stream    = stream_index; forced_codec_name =    audio_codec_name; break;
2359         case AVMEDIA_TYPE_SUBTITLE: is->last_subtitle_stream = stream_index; forced_codec_name = subtitle_codec_name; break;
2360         case AVMEDIA_TYPE_VIDEO   : is->last_video_stream    = stream_index; forced_codec_name =    video_codec_name; break;
2361     }
2362     if (forced_codec_name)
2363         codec = avcodec_find_decoder_by_name(forced_codec_name);
2364     if (!codec) {
2365         if (forced_codec_name) fprintf(stderr, "No codec could be found with name '%s'\n", forced_codec_name);
2366         else                   fprintf(stderr, "No codec could be found with id %d\n", avctx->codec_id);
2367         return -1;
2368     }
2369
2370     avctx->codec_id = codec->id;
2371     avctx->workaround_bugs   = workaround_bugs;
2372     avctx->lowres            = lowres;
2373     if(avctx->lowres > codec->max_lowres){
2374         av_log(avctx, AV_LOG_WARNING, "The maximum value for lowres supported by the decoder is %d\n",
2375                 codec->max_lowres);
2376         avctx->lowres= codec->max_lowres;
2377     }
2378     avctx->idct_algo         = idct;
2379     avctx->skip_frame        = skip_frame;
2380     avctx->skip_idct         = skip_idct;
2381     avctx->skip_loop_filter  = skip_loop_filter;
2382     avctx->error_concealment = error_concealment;
2383
2384     if(avctx->lowres) avctx->flags |= CODEC_FLAG_EMU_EDGE;
2385     if (fast)   avctx->flags2 |= CODEC_FLAG2_FAST;
2386     if(codec->capabilities & CODEC_CAP_DR1)
2387         avctx->flags |= CODEC_FLAG_EMU_EDGE;
2388
2389     opts = filter_codec_opts(codec_opts, avctx->codec_id, ic, ic->streams[stream_index], codec);
2390     if (!av_dict_get(opts, "threads", NULL, 0))
2391         av_dict_set(&opts, "threads", "auto", 0);
2392     if (avcodec_open2(avctx, codec, &opts) < 0)
2393         return -1;
2394     if ((t = av_dict_get(opts, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
2395         av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
2396         return AVERROR_OPTION_NOT_FOUND;
2397     }
2398
2399     /* prepare audio output */
2400     if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
2401         int audio_hw_buf_size = audio_open(is, avctx->channel_layout, avctx->channels, avctx->sample_rate, &is->audio_src);
2402         if (audio_hw_buf_size < 0)
2403             return -1;
2404         is->audio_hw_buf_size = audio_hw_buf_size;
2405         is->audio_tgt = is->audio_src;
2406     }
2407
2408     ic->streams[stream_index]->discard = AVDISCARD_DEFAULT;
2409     switch (avctx->codec_type) {
2410     case AVMEDIA_TYPE_AUDIO:
2411         is->audio_stream = stream_index;
2412         is->audio_st = ic->streams[stream_index];
2413         is->audio_buf_size  = 0;
2414         is->audio_buf_index = 0;
2415
2416         /* init averaging filter */
2417         is->audio_diff_avg_coef  = exp(log(0.01) / AUDIO_DIFF_AVG_NB);
2418         is->audio_diff_avg_count = 0;
2419         /* since we do not have a precise anough audio fifo fullness,
2420            we correct audio sync only if larger than this threshold */
2421         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);
2422
2423         memset(&is->audio_pkt, 0, sizeof(is->audio_pkt));
2424         memset(&is->audio_pkt_temp, 0, sizeof(is->audio_pkt_temp));
2425         packet_queue_start(&is->audioq);
2426         SDL_PauseAudio(0);
2427         break;
2428     case AVMEDIA_TYPE_VIDEO:
2429         is->video_stream = stream_index;
2430         is->video_st = ic->streams[stream_index];
2431
2432         packet_queue_start(&is->videoq);
2433         is->video_tid = SDL_CreateThread(video_thread, is);
2434         break;
2435     case AVMEDIA_TYPE_SUBTITLE:
2436         is->subtitle_stream = stream_index;
2437         is->subtitle_st = ic->streams[stream_index];
2438         packet_queue_start(&is->subtitleq);
2439
2440         is->subtitle_tid = SDL_CreateThread(subtitle_thread, is);
2441         break;
2442     default:
2443         break;
2444     }
2445     return 0;
2446 }
2447
2448 static void stream_component_close(VideoState *is, int stream_index)
2449 {
2450     AVFormatContext *ic = is->ic;
2451     AVCodecContext *avctx;
2452
2453     if (stream_index < 0 || stream_index >= ic->nb_streams)
2454         return;
2455     avctx = ic->streams[stream_index]->codec;
2456
2457     switch (avctx->codec_type) {
2458     case AVMEDIA_TYPE_AUDIO:
2459         packet_queue_abort(&is->audioq);
2460
2461         SDL_CloseAudio();
2462
2463         packet_queue_flush(&is->audioq);
2464         av_free_packet(&is->audio_pkt);
2465         swr_free(&is->swr_ctx);
2466         av_freep(&is->audio_buf1);
2467         is->audio_buf1_size = 0;
2468         is->audio_buf = NULL;
2469         avcodec_free_frame(&is->frame);
2470
2471         if (is->rdft) {
2472             av_rdft_end(is->rdft);
2473             av_freep(&is->rdft_data);
2474             is->rdft = NULL;
2475             is->rdft_bits = 0;
2476         }
2477         break;
2478     case AVMEDIA_TYPE_VIDEO:
2479         packet_queue_abort(&is->videoq);
2480
2481         /* note: we also signal this mutex to make sure we deblock the
2482            video thread in all cases */
2483         SDL_LockMutex(is->pictq_mutex);
2484         SDL_CondSignal(is->pictq_cond);
2485         SDL_UnlockMutex(is->pictq_mutex);
2486
2487         SDL_WaitThread(is->video_tid, NULL);
2488
2489         packet_queue_flush(&is->videoq);
2490         break;
2491     case AVMEDIA_TYPE_SUBTITLE:
2492         packet_queue_abort(&is->subtitleq);
2493
2494         /* note: we also signal this mutex to make sure we deblock the
2495            video thread in all cases */
2496         SDL_LockMutex(is->subpq_mutex);
2497         is->subtitle_stream_changed = 1;
2498
2499         SDL_CondSignal(is->subpq_cond);
2500         SDL_UnlockMutex(is->subpq_mutex);
2501
2502         SDL_WaitThread(is->subtitle_tid, NULL);
2503
2504         packet_queue_flush(&is->subtitleq);
2505         break;
2506     default:
2507         break;
2508     }
2509
2510     ic->streams[stream_index]->discard = AVDISCARD_ALL;
2511     avcodec_close(avctx);
2512 #if CONFIG_AVFILTER
2513     free_buffer_pool(&is->buffer_pool);
2514 #endif
2515     switch (avctx->codec_type) {
2516     case AVMEDIA_TYPE_AUDIO:
2517         is->audio_st = NULL;
2518         is->audio_stream = -1;
2519         break;
2520     case AVMEDIA_TYPE_VIDEO:
2521         is->video_st = NULL;
2522         is->video_stream = -1;
2523         break;
2524     case AVMEDIA_TYPE_SUBTITLE:
2525         is->subtitle_st = NULL;
2526         is->subtitle_stream = -1;
2527         break;
2528     default:
2529         break;
2530     }
2531 }
2532
2533 static int decode_interrupt_cb(void *ctx)
2534 {
2535     VideoState *is = ctx;
2536     return is->abort_request;
2537 }
2538
2539 static int is_realtime(AVFormatContext *s)
2540 {
2541     if(   !strcmp(s->iformat->name, "rtp")
2542        || !strcmp(s->iformat->name, "rtsp")
2543        || !strcmp(s->iformat->name, "sdp")
2544     )
2545         return 1;
2546
2547     if(s->pb && (   !strncmp(s->filename, "rtp:", 4)
2548                  || !strncmp(s->filename, "udp:", 4)
2549                 )
2550     )
2551         return 1;
2552     return 0;
2553 }
2554
2555 /* this thread gets the stream from the disk or the network */
2556 static int read_thread(void *arg)
2557 {
2558     VideoState *is = arg;
2559     AVFormatContext *ic = NULL;
2560     int err, i, ret;
2561     int st_index[AVMEDIA_TYPE_NB];
2562     AVPacket pkt1, *pkt = &pkt1;
2563     int eof = 0;
2564     int pkt_in_play_range = 0;
2565     AVDictionaryEntry *t;
2566     AVDictionary **opts;
2567     int orig_nb_streams;
2568     SDL_mutex *wait_mutex = SDL_CreateMutex();
2569
2570     memset(st_index, -1, sizeof(st_index));
2571     is->last_video_stream = is->video_stream = -1;
2572     is->last_audio_stream = is->audio_stream = -1;
2573     is->last_subtitle_stream = is->subtitle_stream = -1;
2574
2575     ic = avformat_alloc_context();
2576     ic->interrupt_callback.callback = decode_interrupt_cb;
2577     ic->interrupt_callback.opaque = is;
2578     err = avformat_open_input(&ic, is->filename, is->iformat, &format_opts);
2579     if (err < 0) {
2580         print_error(is->filename, err);
2581         ret = -1;
2582         goto fail;
2583     }
2584     if ((t = av_dict_get(format_opts, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
2585         av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
2586         ret = AVERROR_OPTION_NOT_FOUND;
2587         goto fail;
2588     }
2589     is->ic = ic;
2590
2591     if (genpts)
2592         ic->flags |= AVFMT_FLAG_GENPTS;
2593
2594     opts = setup_find_stream_info_opts(ic, codec_opts);
2595     orig_nb_streams = ic->nb_streams;
2596
2597     err = avformat_find_stream_info(ic, opts);
2598     if (err < 0) {
2599         fprintf(stderr, "%s: could not find codec parameters\n", is->filename);
2600         ret = -1;
2601         goto fail;
2602     }
2603     for (i = 0; i < orig_nb_streams; i++)
2604         av_dict_free(&opts[i]);
2605     av_freep(&opts);
2606
2607     if (ic->pb)
2608         ic->pb->eof_reached = 0; // FIXME hack, ffplay maybe should not use url_feof() to test for the end
2609
2610     if (seek_by_bytes < 0)
2611         seek_by_bytes = !!(ic->iformat->flags & AVFMT_TS_DISCONT);
2612
2613     is->max_frame_duration = (ic->iformat->flags & AVFMT_TS_DISCONT) ? 10.0 : 3600.0;
2614
2615     /* if seeking requested, we execute it */
2616     if (start_time != AV_NOPTS_VALUE) {
2617         int64_t timestamp;
2618
2619         timestamp = start_time;
2620         /* add the stream start time */
2621         if (ic->start_time != AV_NOPTS_VALUE)
2622             timestamp += ic->start_time;
2623         ret = avformat_seek_file(ic, -1, INT64_MIN, timestamp, INT64_MAX, 0);
2624         if (ret < 0) {
2625             fprintf(stderr, "%s: could not seek to position %0.3f\n",
2626                     is->filename, (double)timestamp / AV_TIME_BASE);
2627         }
2628     }
2629
2630     is->realtime = is_realtime(ic);
2631
2632     for (i = 0; i < ic->nb_streams; i++)
2633         ic->streams[i]->discard = AVDISCARD_ALL;
2634     if (!video_disable)
2635         st_index[AVMEDIA_TYPE_VIDEO] =
2636             av_find_best_stream(ic, AVMEDIA_TYPE_VIDEO,
2637                                 wanted_stream[AVMEDIA_TYPE_VIDEO], -1, NULL, 0);
2638     if (!audio_disable)
2639         st_index[AVMEDIA_TYPE_AUDIO] =
2640             av_find_best_stream(ic, AVMEDIA_TYPE_AUDIO,
2641                                 wanted_stream[AVMEDIA_TYPE_AUDIO],
2642                                 st_index[AVMEDIA_TYPE_VIDEO],
2643                                 NULL, 0);
2644     if (!video_disable)
2645         st_index[AVMEDIA_TYPE_SUBTITLE] =
2646             av_find_best_stream(ic, AVMEDIA_TYPE_SUBTITLE,
2647                                 wanted_stream[AVMEDIA_TYPE_SUBTITLE],
2648                                 (st_index[AVMEDIA_TYPE_AUDIO] >= 0 ?
2649                                  st_index[AVMEDIA_TYPE_AUDIO] :
2650                                  st_index[AVMEDIA_TYPE_VIDEO]),
2651                                 NULL, 0);
2652     if (show_status) {
2653         av_dump_format(ic, 0, is->filename, 0);
2654     }
2655
2656     is->show_mode = show_mode;
2657
2658     /* open the streams */
2659     if (st_index[AVMEDIA_TYPE_AUDIO] >= 0) {
2660         stream_component_open(is, st_index[AVMEDIA_TYPE_AUDIO]);
2661     }
2662
2663     ret = -1;
2664     if (st_index[AVMEDIA_TYPE_VIDEO] >= 0) {
2665         ret = stream_component_open(is, st_index[AVMEDIA_TYPE_VIDEO]);
2666     }
2667     if (is->show_mode == SHOW_MODE_NONE)
2668         is->show_mode = ret >= 0 ? SHOW_MODE_VIDEO : SHOW_MODE_RDFT;
2669
2670     is->refresh_tid = SDL_CreateThread(refresh_thread, is);
2671
2672     if (st_index[AVMEDIA_TYPE_SUBTITLE] >= 0) {
2673         stream_component_open(is, st_index[AVMEDIA_TYPE_SUBTITLE]);
2674     }
2675
2676     if (is->video_stream < 0 && is->audio_stream < 0) {
2677         fprintf(stderr, "%s: could not open codecs\n", is->filename);
2678         ret = -1;
2679         goto fail;
2680     }
2681
2682     if (infinite_buffer < 0 && is->realtime)
2683         infinite_buffer = 1;
2684
2685     for (;;) {
2686         if (is->abort_request)
2687             break;
2688         if (is->paused != is->last_paused) {
2689             is->last_paused = is->paused;
2690             if (is->paused)
2691                 is->read_pause_return = av_read_pause(ic);
2692             else
2693                 av_read_play(ic);
2694         }
2695 #if CONFIG_RTSP_DEMUXER || CONFIG_MMSH_PROTOCOL
2696         if (is->paused &&
2697                 (!strcmp(ic->iformat->name, "rtsp") ||
2698                  (ic->pb && !strncmp(input_filename, "mmsh:", 5)))) {
2699             /* wait 10 ms to avoid trying to get another packet */
2700             /* XXX: horrible */
2701             SDL_Delay(10);
2702             continue;
2703         }
2704 #endif
2705         if (is->seek_req) {
2706             int64_t seek_target = is->seek_pos;
2707             int64_t seek_min    = is->seek_rel > 0 ? seek_target - is->seek_rel + 2: INT64_MIN;
2708             int64_t seek_max    = is->seek_rel < 0 ? seek_target - is->seek_rel - 2: INT64_MAX;
2709 // FIXME the +-2 is due to rounding being not done in the correct direction in generation
2710 //      of the seek_pos/seek_rel variables
2711
2712             ret = avformat_seek_file(is->ic, -1, seek_min, seek_target, seek_max, is->seek_flags);
2713             if (ret < 0) {
2714                 fprintf(stderr, "%s: error while seeking\n", is->ic->filename);
2715             } else {
2716                 if (is->audio_stream >= 0) {
2717                     packet_queue_flush(&is->audioq);
2718                     packet_queue_put(&is->audioq, &flush_pkt);
2719                 }
2720                 if (is->subtitle_stream >= 0) {
2721                     packet_queue_flush(&is->subtitleq);
2722                     packet_queue_put(&is->subtitleq, &flush_pkt);
2723                 }
2724                 if (is->video_stream >= 0) {
2725                     packet_queue_flush(&is->videoq);
2726                     packet_queue_put(&is->videoq, &flush_pkt);
2727                 }
2728                 if (is->seek_flags & AVSEEK_FLAG_BYTE) {
2729                    //FIXME: use a cleaner way to signal obsolete external clock...
2730                    update_external_clock_pts(is, (double)AV_NOPTS_VALUE);
2731                 } else {
2732                    update_external_clock_pts(is, seek_target / (double)AV_TIME_BASE);
2733                 }
2734             }
2735             is->seek_req = 0;
2736             eof = 0;
2737             if (is->paused)
2738                 step_to_next_frame(is);
2739         }
2740         if (is->queue_attachments_req) {
2741             avformat_queue_attached_pictures(ic);
2742             is->queue_attachments_req = 0;
2743         }
2744
2745         /* if the queue are full, no need to read more */
2746         if (infinite_buffer<1 &&
2747               (is->audioq.size + is->videoq.size + is->subtitleq.size > MAX_QUEUE_SIZE
2748             || (   (is->audioq   .nb_packets > MIN_FRAMES || is->audio_stream < 0 || is->audioq.abort_request)
2749                 && (is->videoq   .nb_packets > MIN_FRAMES || is->video_stream < 0 || is->videoq.abort_request)
2750                 && (is->subtitleq.nb_packets > MIN_FRAMES || is->subtitle_stream < 0 || is->subtitleq.abort_request)))) {
2751             /* wait 10 ms */
2752             SDL_LockMutex(wait_mutex);
2753             SDL_CondWaitTimeout(is->continue_read_thread, wait_mutex, 10);
2754             SDL_UnlockMutex(wait_mutex);
2755             continue;
2756         }
2757         if (eof) {
2758             if (is->video_stream >= 0) {
2759                 av_init_packet(pkt);
2760                 pkt->data = NULL;
2761                 pkt->size = 0;
2762                 pkt->stream_index = is->video_stream;
2763                 packet_queue_put(&is->videoq, pkt);
2764             }
2765             if (is->audio_stream >= 0 &&
2766                 is->audio_st->codec->codec->capabilities & CODEC_CAP_DELAY) {
2767                 av_init_packet(pkt);
2768                 pkt->data = NULL;
2769                 pkt->size = 0;
2770                 pkt->stream_index = is->audio_stream;
2771                 packet_queue_put(&is->audioq, pkt);
2772             }
2773             SDL_Delay(10);
2774             if (is->audioq.size + is->videoq.size + is->subtitleq.size == 0) {
2775                 if (loop != 1 && (!loop || --loop)) {
2776                     stream_seek(is, start_time != AV_NOPTS_VALUE ? start_time : 0, 0, 0);
2777                 } else if (autoexit) {
2778                     ret = AVERROR_EOF;
2779                     goto fail;
2780                 }
2781             }
2782             eof=0;
2783             continue;
2784         }
2785         ret = av_read_frame(ic, pkt);
2786         if (ret < 0) {
2787             if (ret == AVERROR_EOF || url_feof(ic->pb))
2788                 eof = 1;
2789             if (ic->pb && ic->pb->error)
2790                 break;
2791             SDL_LockMutex(wait_mutex);
2792             SDL_CondWaitTimeout(is->continue_read_thread, wait_mutex, 10);
2793             SDL_UnlockMutex(wait_mutex);
2794             continue;
2795         }
2796         /* check if packet is in play range specified by user, then queue, otherwise discard */
2797         pkt_in_play_range = duration == AV_NOPTS_VALUE ||
2798                 (pkt->pts - ic->streams[pkt->stream_index]->start_time) *
2799                 av_q2d(ic->streams[pkt->stream_index]->time_base) -
2800                 (double)(start_time != AV_NOPTS_VALUE ? start_time : 0) / 1000000
2801                 <= ((double)duration / 1000000);
2802         if (pkt->stream_index == is->audio_stream && pkt_in_play_range) {
2803             packet_queue_put(&is->audioq, pkt);
2804         } else if (pkt->stream_index == is->video_stream && pkt_in_play_range) {
2805             packet_queue_put(&is->videoq, pkt);
2806         } else if (pkt->stream_index == is->subtitle_stream && pkt_in_play_range) {
2807             packet_queue_put(&is->subtitleq, pkt);
2808         } else {
2809             av_free_packet(pkt);
2810         }
2811     }
2812     /* wait until the end */
2813     while (!is->abort_request) {
2814         SDL_Delay(100);
2815     }
2816
2817     ret = 0;
2818  fail:
2819     /* close each stream */
2820     if (is->audio_stream >= 0)
2821         stream_component_close(is, is->audio_stream);
2822     if (is->video_stream >= 0)
2823         stream_component_close(is, is->video_stream);
2824     if (is->subtitle_stream >= 0)
2825         stream_component_close(is, is->subtitle_stream);
2826     if (is->ic) {
2827         avformat_close_input(&is->ic);
2828     }
2829
2830     if (ret != 0) {
2831         SDL_Event event;
2832
2833         event.type = FF_QUIT_EVENT;
2834         event.user.data1 = is;
2835         SDL_PushEvent(&event);
2836     }
2837     SDL_DestroyMutex(wait_mutex);
2838     return 0;
2839 }
2840
2841 static VideoState *stream_open(const char *filename, AVInputFormat *iformat)
2842 {
2843     VideoState *is;
2844
2845     is = av_mallocz(sizeof(VideoState));
2846     if (!is)
2847         return NULL;
2848     av_strlcpy(is->filename, filename, sizeof(is->filename));
2849     is->iformat = iformat;
2850     is->ytop    = 0;
2851     is->xleft   = 0;
2852
2853     /* start video display */
2854     is->pictq_mutex = SDL_CreateMutex();
2855     is->pictq_cond  = SDL_CreateCond();
2856
2857     is->subpq_mutex = SDL_CreateMutex();
2858     is->subpq_cond  = SDL_CreateCond();
2859
2860     packet_queue_init(&is->videoq);
2861     packet_queue_init(&is->audioq);
2862     packet_queue_init(&is->subtitleq);
2863
2864     is->continue_read_thread = SDL_CreateCond();
2865
2866     //FIXME: use a cleaner way to signal obsolete external clock...
2867     update_external_clock_pts(is, (double)AV_NOPTS_VALUE);
2868     update_external_clock_speed(is, 1.0);
2869     is->audio_current_pts_drift = -av_gettime() / 1000000.0;
2870     is->video_current_pts_drift = is->audio_current_pts_drift;
2871     is->av_sync_type = av_sync_type;
2872     is->read_tid     = SDL_CreateThread(read_thread, is);
2873     if (!is->read_tid) {
2874         av_free(is);
2875         return NULL;
2876     }
2877     return is;
2878 }
2879
2880 static void stream_cycle_channel(VideoState *is, int codec_type)
2881 {
2882     AVFormatContext *ic = is->ic;
2883     int start_index, stream_index;
2884     int old_index;
2885     AVStream *st;
2886
2887     if (codec_type == AVMEDIA_TYPE_VIDEO) {
2888         start_index = is->last_video_stream;
2889         old_index = is->video_stream;
2890     } else if (codec_type == AVMEDIA_TYPE_AUDIO) {
2891         start_index = is->last_audio_stream;
2892         old_index = is->audio_stream;
2893     } else {
2894         start_index = is->last_subtitle_stream;
2895         old_index = is->subtitle_stream;
2896     }
2897     stream_index = start_index;
2898     for (;;) {
2899         if (++stream_index >= is->ic->nb_streams)
2900         {
2901             if (codec_type == AVMEDIA_TYPE_SUBTITLE)
2902             {
2903                 stream_index = -1;
2904                 is->last_subtitle_stream = -1;
2905                 goto the_end;
2906             }
2907             if (start_index == -1)
2908                 return;
2909             stream_index = 0;
2910         }
2911         if (stream_index == start_index)
2912             return;
2913         st = ic->streams[stream_index];
2914         if (st->codec->codec_type == codec_type) {
2915             /* check that parameters are OK */
2916             switch (codec_type) {
2917             case AVMEDIA_TYPE_AUDIO:
2918                 if (st->codec->sample_rate != 0 &&
2919                     st->codec->channels != 0)
2920                     goto the_end;
2921                 break;
2922             case AVMEDIA_TYPE_VIDEO:
2923             case AVMEDIA_TYPE_SUBTITLE:
2924                 goto the_end;
2925             default:
2926                 break;
2927             }
2928         }
2929     }
2930  the_end:
2931     stream_component_close(is, old_index);
2932     stream_component_open(is, stream_index);
2933     if (codec_type == AVMEDIA_TYPE_VIDEO)
2934         is->queue_attachments_req = 1;
2935 }
2936
2937
2938 static void toggle_full_screen(VideoState *is)
2939 {
2940 #if defined(__APPLE__) && SDL_VERSION_ATLEAST(1, 2, 14)
2941     /* OS X needs to reallocate the SDL overlays */
2942     int i;
2943     for (i = 0; i < VIDEO_PICTURE_QUEUE_SIZE; i++)
2944         is->pictq[i].reallocate = 1;
2945 #endif
2946     is_full_screen = !is_full_screen;
2947     video_open(is, 1, NULL);
2948 }
2949
2950 static void toggle_audio_display(VideoState *is)
2951 {
2952     int bgcolor = SDL_MapRGB(screen->format, 0x00, 0x00, 0x00);
2953     is->show_mode = (is->show_mode + 1) % SHOW_MODE_NB;
2954     fill_rectangle(screen,
2955                 is->xleft, is->ytop, is->width, is->height,
2956                 bgcolor, 1);
2957 }
2958
2959 /* handle an event sent by the GUI */
2960 static void event_loop(VideoState *cur_stream)
2961 {
2962     SDL_Event event;
2963     double incr, pos, frac;
2964
2965     for (;;) {
2966         double x;
2967         SDL_WaitEvent(&event);
2968         switch (event.type) {
2969         case SDL_KEYDOWN:
2970             if (exit_on_keydown) {
2971                 do_exit(cur_stream);
2972                 break;
2973             }
2974             switch (event.key.keysym.sym) {
2975             case SDLK_ESCAPE:
2976             case SDLK_q:
2977                 do_exit(cur_stream);
2978                 break;
2979             case SDLK_f:
2980                 toggle_full_screen(cur_stream);
2981                 cur_stream->force_refresh = 1;
2982                 break;
2983             case SDLK_p:
2984             case SDLK_SPACE:
2985                 toggle_pause(cur_stream);
2986                 break;
2987             case SDLK_s: // S: Step to next frame
2988                 step_to_next_frame(cur_stream);
2989                 break;
2990             case SDLK_a:
2991                 stream_cycle_channel(cur_stream, AVMEDIA_TYPE_AUDIO);
2992                 break;
2993             case SDLK_v:
2994                 stream_cycle_channel(cur_stream, AVMEDIA_TYPE_VIDEO);
2995                 break;
2996             case SDLK_t:
2997                 stream_cycle_channel(cur_stream, AVMEDIA_TYPE_SUBTITLE);
2998                 break;
2999             case SDLK_w:
3000                 toggle_audio_display(cur_stream);
3001                 cur_stream->force_refresh = 1;
3002                 break;
3003             case SDLK_PAGEUP:
3004                 incr = 600.0;
3005                 goto do_seek;
3006             case SDLK_PAGEDOWN:
3007                 incr = -600.0;
3008                 goto do_seek;
3009             case SDLK_LEFT:
3010                 incr = -10.0;
3011                 goto do_seek;
3012             case SDLK_RIGHT:
3013                 incr = 10.0;
3014                 goto do_seek;
3015             case SDLK_UP:
3016                 incr = 60.0;
3017                 goto do_seek;
3018             case SDLK_DOWN:
3019                 incr = -60.0;
3020             do_seek:
3021                     if (seek_by_bytes) {
3022                         if (cur_stream->video_stream >= 0 && cur_stream->video_current_pos >= 0) {
3023                             pos = cur_stream->video_current_pos;
3024                         } else if (cur_stream->audio_stream >= 0 && cur_stream->audio_pkt.pos >= 0) {
3025                             pos = cur_stream->audio_pkt.pos;
3026                         } else
3027                             pos = avio_tell(cur_stream->ic->pb);
3028                         if (cur_stream->ic->bit_rate)
3029                             incr *= cur_stream->ic->bit_rate / 8.0;
3030                         else
3031                             incr *= 180000.0;
3032                         pos += incr;
3033                         stream_seek(cur_stream, pos, incr, 1);
3034                     } else {
3035                         pos = get_master_clock(cur_stream);
3036                         pos += incr;
3037                         if (cur_stream->ic->start_time != AV_NOPTS_VALUE && pos < cur_stream->ic->start_time / (double)AV_TIME_BASE)
3038                             pos = cur_stream->ic->start_time / (double)AV_TIME_BASE;
3039                         stream_seek(cur_stream, (int64_t)(pos * AV_TIME_BASE), (int64_t)(incr * AV_TIME_BASE), 0);
3040                     }
3041                 break;
3042             default:
3043                 break;
3044             }
3045             break;
3046         case SDL_VIDEOEXPOSE:
3047             cur_stream->force_refresh = 1;
3048             break;
3049         case SDL_MOUSEBUTTONDOWN:
3050             if (exit_on_mousedown) {
3051                 do_exit(cur_stream);
3052                 break;
3053             }
3054         case SDL_MOUSEMOTION:
3055             if (cursor_hidden) {
3056                 SDL_ShowCursor(1);
3057                 cursor_hidden = 0;
3058             }
3059             cursor_last_shown = av_gettime();
3060             if (event.type == SDL_MOUSEBUTTONDOWN) {
3061                 x = event.button.x;
3062             } else {
3063                 if (event.motion.state != SDL_PRESSED)
3064                     break;
3065                 x = event.motion.x;
3066             }
3067                 if (seek_by_bytes || cur_stream->ic->duration <= 0) {
3068                     uint64_t size =  avio_size(cur_stream->ic->pb);
3069                     stream_seek(cur_stream, size*x/cur_stream->width, 0, 1);
3070                 } else {
3071                     int64_t ts;
3072                     int ns, hh, mm, ss;
3073                     int tns, thh, tmm, tss;
3074                     tns  = cur_stream->ic->duration / 1000000LL;
3075                     thh  = tns / 3600;
3076                     tmm  = (tns % 3600) / 60;
3077                     tss  = (tns % 60);
3078                     frac = x / cur_stream->width;
3079                     ns   = frac * tns;
3080                     hh   = ns / 3600;
3081                     mm   = (ns % 3600) / 60;
3082                     ss   = (ns % 60);
3083                     fprintf(stderr, "Seek to %2.0f%% (%2d:%02d:%02d) of total duration (%2d:%02d:%02d)       \n", frac*100,
3084                             hh, mm, ss, thh, tmm, tss);
3085                     ts = frac * cur_stream->ic->duration;
3086                     if (cur_stream->ic->start_time != AV_NOPTS_VALUE)
3087                         ts += cur_stream->ic->start_time;
3088                     stream_seek(cur_stream, ts, 0, 0);
3089                 }
3090             break;
3091         case SDL_VIDEORESIZE:
3092                 screen = SDL_SetVideoMode(event.resize.w, event.resize.h, 0,
3093                                           SDL_HWSURFACE|SDL_RESIZABLE|SDL_ASYNCBLIT|SDL_HWACCEL);
3094                 screen_width  = cur_stream->width  = event.resize.w;
3095                 screen_height = cur_stream->height = event.resize.h;
3096                 cur_stream->force_refresh = 1;
3097             break;
3098         case SDL_QUIT:
3099         case FF_QUIT_EVENT:
3100             do_exit(cur_stream);
3101             break;
3102         case FF_ALLOC_EVENT:
3103             alloc_picture(event.user.data1);
3104             break;
3105         case FF_REFRESH_EVENT:
3106             if (!cursor_hidden && av_gettime() - cursor_last_shown > CURSOR_HIDE_DELAY) {
3107                 SDL_ShowCursor(0);
3108                 cursor_hidden = 1;
3109             }
3110             video_refresh(event.user.data1);
3111             cur_stream->refresh = 0;
3112             break;
3113         default:
3114             break;
3115         }
3116     }
3117 }
3118
3119 static int opt_frame_size(void *optctx, const char *opt, const char *arg)
3120 {
3121     av_log(NULL, AV_LOG_WARNING, "Option -s is deprecated, use -video_size.\n");
3122     return opt_default(NULL, "video_size", arg);
3123 }
3124
3125 static int opt_width(void *optctx, const char *opt, const char *arg)
3126 {
3127     screen_width = parse_number_or_die(opt, arg, OPT_INT64, 1, INT_MAX);
3128     return 0;
3129 }
3130
3131 static int opt_height(void *optctx, const char *opt, const char *arg)
3132 {
3133     screen_height = parse_number_or_die(opt, arg, OPT_INT64, 1, INT_MAX);
3134     return 0;
3135 }
3136
3137 static int opt_format(void *optctx, const char *opt, const char *arg)
3138 {
3139     file_iformat = av_find_input_format(arg);
3140     if (!file_iformat) {
3141         fprintf(stderr, "Unknown input format: %s\n", arg);
3142         return AVERROR(EINVAL);
3143     }
3144     return 0;
3145 }
3146
3147 static int opt_frame_pix_fmt(void *optctx, const char *opt, const char *arg)
3148 {
3149     av_log(NULL, AV_LOG_WARNING, "Option -pix_fmt is deprecated, use -pixel_format.\n");
3150     return opt_default(NULL, "pixel_format", arg);
3151 }
3152
3153 static int opt_sync(void *optctx, const char *opt, const char *arg)
3154 {
3155     if (!strcmp(arg, "audio"))
3156         av_sync_type = AV_SYNC_AUDIO_MASTER;
3157     else if (!strcmp(arg, "video"))
3158         av_sync_type = AV_SYNC_VIDEO_MASTER;
3159     else if (!strcmp(arg, "ext"))
3160         av_sync_type = AV_SYNC_EXTERNAL_CLOCK;
3161     else {
3162         fprintf(stderr, "Unknown value for %s: %s\n", opt, arg);
3163         exit(1);
3164     }
3165     return 0;
3166 }
3167
3168 static int opt_seek(void *optctx, const char *opt, const char *arg)
3169 {
3170     start_time = parse_time_or_die(opt, arg, 1);
3171     return 0;
3172 }
3173
3174 static int opt_duration(void *optctx, const char *opt, const char *arg)
3175 {
3176     duration = parse_time_or_die(opt, arg, 1);
3177     return 0;
3178 }
3179
3180 static int opt_show_mode(void *optctx, const char *opt, const char *arg)
3181 {
3182     show_mode = !strcmp(arg, "video") ? SHOW_MODE_VIDEO :
3183                 !strcmp(arg, "waves") ? SHOW_MODE_WAVES :
3184                 !strcmp(arg, "rdft" ) ? SHOW_MODE_RDFT  :
3185                 parse_number_or_die(opt, arg, OPT_INT, 0, SHOW_MODE_NB-1);
3186     return 0;
3187 }
3188
3189 static void opt_input_file(void *optctx, const char *filename)
3190 {
3191     if (input_filename) {
3192         fprintf(stderr, "Argument '%s' provided as input filename, but '%s' was already specified.\n",
3193                 filename, input_filename);
3194         exit(1);
3195     }
3196     if (!strcmp(filename, "-"))
3197         filename = "pipe:";
3198     input_filename = filename;
3199 }
3200
3201 static int opt_codec(void *optctx, const char *opt, const char *arg)
3202 {
3203    const char *spec = strchr(opt, ':');
3204    if (!spec) {
3205        fprintf(stderr, "No media specifier was specified in '%s' in option '%s'\n",
3206                arg, opt);
3207        return AVERROR(EINVAL);
3208    }
3209    spec++;
3210    switch (spec[0]) {
3211    case 'a' :    audio_codec_name = arg; break;
3212    case 's' : subtitle_codec_name = arg; break;
3213    case 'v' :    video_codec_name = arg; break;
3214    default:
3215        fprintf(stderr, "Invalid media specifier '%s' in option '%s'\n", spec, opt);
3216        return AVERROR(EINVAL);
3217    }
3218    return 0;
3219 }
3220
3221 static int dummy;
3222
3223 static const OptionDef options[] = {
3224 #include "cmdutils_common_opts.h"
3225     { "x", HAS_ARG, { .func_arg = opt_width }, "force displayed width", "width" },
3226     { "y", HAS_ARG, { .func_arg = opt_height }, "force displayed height", "height" },
3227     { "s", HAS_ARG | OPT_VIDEO, { .func_arg = opt_frame_size }, "set frame size (WxH or abbreviation)", "size" },
3228     { "fs", OPT_BOOL, { &is_full_screen }, "force full screen" },
3229     { "an", OPT_BOOL, { &audio_disable }, "disable audio" },
3230     { "vn", OPT_BOOL, { &video_disable }, "disable video" },
3231     { "ast", OPT_INT | HAS_ARG | OPT_EXPERT, { &wanted_stream[AVMEDIA_TYPE_AUDIO] }, "select desired audio stream", "stream_number" },
3232     { "vst", OPT_INT | HAS_ARG | OPT_EXPERT, { &wanted_stream[AVMEDIA_TYPE_VIDEO] }, "select desired video stream", "stream_number" },
3233     { "sst", OPT_INT | HAS_ARG | OPT_EXPERT, { &wanted_stream[AVMEDIA_TYPE_SUBTITLE] }, "select desired subtitle stream", "stream_number" },
3234     { "ss", HAS_ARG, { .func_arg = opt_seek }, "seek to a given position in seconds", "pos" },
3235     { "t", HAS_ARG, { .func_arg = opt_duration }, "play  \"duration\" seconds of audio/video", "duration" },
3236     { "bytes", OPT_INT | HAS_ARG, { &seek_by_bytes }, "seek by bytes 0=off 1=on -1=auto", "val" },
3237     { "nodisp", OPT_BOOL, { &display_disable }, "disable graphical display" },
3238     { "f", HAS_ARG, { .func_arg = opt_format }, "force format", "fmt" },
3239     { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_frame_pix_fmt }, "set pixel format", "format" },
3240     { "stats", OPT_BOOL | OPT_EXPERT, { &show_status }, "show status", "" },
3241     { "bug", OPT_INT | HAS_ARG | OPT_EXPERT, { &workaround_bugs }, "workaround bugs", "" },
3242     { "fast", OPT_BOOL | OPT_EXPERT, { &fast }, "non spec compliant optimizations", "" },
3243     { "genpts", OPT_BOOL | OPT_EXPERT, { &genpts }, "generate pts", "" },
3244     { "drp", OPT_INT | HAS_ARG | OPT_EXPERT, { &decoder_reorder_pts }, "let decoder reorder pts 0=off 1=on -1=auto", ""},
3245     { "lowres", OPT_INT | HAS_ARG | OPT_EXPERT, { &lowres }, "", "" },
3246     { "skiploop", OPT_INT | HAS_ARG | OPT_EXPERT, { &skip_loop_filter }, "", "" },
3247     { "skipframe", OPT_INT | HAS_ARG | OPT_EXPERT, { &skip_frame }, "", "" },
3248     { "skipidct", OPT_INT | HAS_ARG | OPT_EXPERT, { &skip_idct }, "", "" },
3249     { "idct", OPT_INT | HAS_ARG | OPT_EXPERT, { &idct }, "set idct algo",  "algo" },
3250     { "ec", OPT_INT | HAS_ARG | OPT_EXPERT, { &error_concealment }, "set error concealment options",  "bit_mask" },
3251     { "sync", HAS_ARG | OPT_EXPERT, { .func_arg = opt_sync }, "set audio-video sync. type (type=audio/video/ext)", "type" },
3252     { "autoexit", OPT_BOOL | OPT_EXPERT, { &autoexit }, "exit at the end", "" },
3253     { "exitonkeydown", OPT_BOOL | OPT_EXPERT, { &exit_on_keydown }, "exit on key down", "" },
3254     { "exitonmousedown", OPT_BOOL | OPT_EXPERT, { &exit_on_mousedown }, "exit on mouse down", "" },
3255     { "loop", OPT_INT | HAS_ARG | OPT_EXPERT, { &loop }, "set number of times the playback shall be looped", "loop count" },
3256     { "framedrop", OPT_BOOL | OPT_EXPERT, { &framedrop }, "drop frames when cpu is too slow", "" },
3257     { "infbuf", OPT_BOOL | OPT_EXPERT, { &infinite_buffer }, "don't limit the input buffer size (useful with realtime streams)", "" },
3258     { "window_title", OPT_STRING | HAS_ARG, { &window_title }, "set window title", "window title" },
3259 #if CONFIG_AVFILTER
3260     { "vf", OPT_STRING | HAS_ARG, { &vfilters }, "set video filters", "filter_graph" },
3261 #endif
3262     { "rdftspeed", OPT_INT | HAS_ARG| OPT_AUDIO | OPT_EXPERT, { &rdftspeed }, "rdft speed", "msecs" },
3263     { "showmode", HAS_ARG, { .func_arg = opt_show_mode}, "select show mode (0 = video, 1 = waves, 2 = RDFT)", "mode" },
3264     { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, { .func_arg = opt_default }, "generic catch all option", "" },
3265     { "i", OPT_BOOL, { &dummy}, "read specified file", "input_file"},
3266     { "codec", HAS_ARG, { .func_arg = opt_codec}, "force decoder", "decoder_name" },
3267     { "acodec", HAS_ARG | OPT_STRING | OPT_EXPERT, {    &audio_codec_name }, "force audio decoder",    "decoder_name" },
3268     { "scodec", HAS_ARG | OPT_STRING | OPT_EXPERT, { &subtitle_codec_name }, "force subtitle decoder", "decoder_name" },
3269     { "vcodec", HAS_ARG | OPT_STRING | OPT_EXPERT, {    &video_codec_name }, "force video decoder",    "decoder_name" },
3270     { NULL, },
3271 };
3272
3273 static void show_usage(void)
3274 {
3275     av_log(NULL, AV_LOG_INFO, "Simple media player\n");
3276     av_log(NULL, AV_LOG_INFO, "usage: %s [options] input_file\n", program_name);
3277     av_log(NULL, AV_LOG_INFO, "\n");
3278 }
3279
3280 void show_help_default(const char *opt, const char *arg)
3281 {
3282     av_log_set_callback(log_callback_help);
3283     show_usage();
3284     show_help_options(options, "Main options:", 0, OPT_EXPERT, 0);
3285     show_help_options(options, "Advanced options:", OPT_EXPERT, 0, 0);
3286     printf("\n");
3287     show_help_children(avcodec_get_class(), AV_OPT_FLAG_DECODING_PARAM);
3288     show_help_children(avformat_get_class(), AV_OPT_FLAG_DECODING_PARAM);
3289 #if !CONFIG_AVFILTER
3290     show_help_children(sws_get_class(), AV_OPT_FLAG_ENCODING_PARAM);
3291 #else
3292     show_help_children(avfilter_get_class(), AV_OPT_FLAG_FILTERING_PARAM);
3293 #endif
3294     printf("\nWhile playing:\n"
3295            "q, ESC              quit\n"
3296            "f                   toggle full screen\n"
3297            "p, SPC              pause\n"
3298            "a                   cycle audio channel\n"
3299            "v                   cycle video channel\n"
3300            "t                   cycle subtitle channel\n"
3301            "w                   show audio waves\n"
3302            "s                   activate frame-step mode\n"
3303            "left/right          seek backward/forward 10 seconds\n"
3304            "down/up             seek backward/forward 1 minute\n"
3305            "page down/page up   seek backward/forward 10 minutes\n"
3306            "mouse click         seek to percentage in file corresponding to fraction of width\n"
3307            );
3308 }
3309
3310 static int lockmgr(void **mtx, enum AVLockOp op)
3311 {
3312    switch(op) {
3313       case AV_LOCK_CREATE:
3314           *mtx = SDL_CreateMutex();
3315           if(!*mtx)
3316               return 1;
3317           return 0;
3318       case AV_LOCK_OBTAIN:
3319           return !!SDL_LockMutex(*mtx);
3320       case AV_LOCK_RELEASE:
3321           return !!SDL_UnlockMutex(*mtx);
3322       case AV_LOCK_DESTROY:
3323           SDL_DestroyMutex(*mtx);
3324           return 0;
3325    }
3326    return 1;
3327 }
3328
3329 /* Called from the main */
3330 int main(int argc, char **argv)
3331 {
3332     int flags;
3333     VideoState *is;
3334     char dummy_videodriver[] = "SDL_VIDEODRIVER=dummy";
3335
3336     av_log_set_flags(AV_LOG_SKIP_REPEATED);
3337     parse_loglevel(argc, argv, options);
3338
3339     /* register all codecs, demux and protocols */
3340     avcodec_register_all();
3341 #if CONFIG_AVDEVICE
3342     avdevice_register_all();
3343 #endif
3344 #if CONFIG_AVFILTER
3345     avfilter_register_all();
3346 #endif
3347     av_register_all();
3348     avformat_network_init();
3349
3350     init_opts();
3351
3352     signal(SIGINT , sigterm_handler); /* Interrupt (ANSI).    */
3353     signal(SIGTERM, sigterm_handler); /* Termination (ANSI).  */
3354
3355     show_banner(argc, argv, options);
3356
3357     parse_options(NULL, argc, argv, options, opt_input_file);
3358
3359     if (!input_filename) {
3360         show_usage();
3361         fprintf(stderr, "An input file must be specified\n");
3362         fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
3363         exit(1);
3364     }
3365
3366     if (display_disable) {
3367         video_disable = 1;
3368     }
3369     flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER;
3370     if (audio_disable)
3371         flags &= ~SDL_INIT_AUDIO;
3372     if (display_disable)
3373         SDL_putenv(dummy_videodriver); /* For the event queue, we always need a video driver. */
3374 #if !defined(__MINGW32__) && !defined(__APPLE__)
3375     flags |= SDL_INIT_EVENTTHREAD; /* Not supported on Windows or Mac OS X */
3376 #endif
3377     if (SDL_Init (flags)) {
3378         fprintf(stderr, "Could not initialize SDL - %s\n", SDL_GetError());
3379         fprintf(stderr, "(Did you set the DISPLAY variable?)\n");
3380         exit(1);
3381     }
3382
3383     if (!display_disable) {
3384 #if HAVE_SDL_VIDEO_SIZE
3385         const SDL_VideoInfo *vi = SDL_GetVideoInfo();
3386         fs_screen_width = vi->current_w;
3387         fs_screen_height = vi->current_h;
3388 #endif
3389     }
3390
3391     SDL_EventState(SDL_ACTIVEEVENT, SDL_IGNORE);
3392     SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE);
3393     SDL_EventState(SDL_USEREVENT, SDL_IGNORE);
3394
3395     if (av_lockmgr_register(lockmgr)) {
3396         fprintf(stderr, "Could not initialize lock manager!\n");
3397         do_exit(NULL);
3398     }
3399
3400     av_init_packet(&flush_pkt);
3401     flush_pkt.data = (char *)(intptr_t)"FLUSH";
3402
3403     is = stream_open(input_filename, file_iformat);
3404     if (!is) {
3405         fprintf(stderr, "Failed to initialize VideoState!\n");
3406         do_exit(NULL);
3407     }
3408
3409     event_loop(is);
3410
3411     /* never returns */
3412
3413     return 0;
3414 }