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