av_find_stream_info: skip flushing codecs and estimating timings if probe_size==0
[ffmpeg.git] / libavformat / utils.c
1 /*
2  * various utility functions for use within FFmpeg
3  * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21
22 /* #define DEBUG */
23
24 #include "avformat.h"
25 #include "avio_internal.h"
26 #include "internal.h"
27 #include "libavcodec/internal.h"
28 #include "libavcodec/raw.h"
29 #include "libavcodec/bytestream.h"
30 #include "libavutil/avassert.h"
31 #include "libavutil/opt.h"
32 #include "libavutil/dict.h"
33 #include "libavutil/pixdesc.h"
34 #include "metadata.h"
35 #include "id3v2.h"
36 #include "libavutil/avassert.h"
37 #include "libavutil/avstring.h"
38 #include "libavutil/mathematics.h"
39 #include "libavutil/parseutils.h"
40 #include "libavutil/timestamp.h"
41 #include "riff.h"
42 #include "audiointerleave.h"
43 #include "url.h"
44 #include <stdarg.h>
45 #if CONFIG_NETWORK
46 #include "network.h"
47 #endif
48
49 #undef NDEBUG
50 #include <assert.h>
51
52 /**
53  * @file
54  * various utility functions for use within FFmpeg
55  */
56
57 unsigned avformat_version(void)
58 {
59     av_assert0(LIBAVFORMAT_VERSION_MICRO >= 100);
60     return LIBAVFORMAT_VERSION_INT;
61 }
62
63 const char *avformat_configuration(void)
64 {
65     return FFMPEG_CONFIGURATION;
66 }
67
68 const char *avformat_license(void)
69 {
70 #define LICENSE_PREFIX "libavformat license: "
71     return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
72 }
73
74 #define RELATIVE_TS_BASE (INT64_MAX - (1LL<<48))
75
76 static int is_relative(int64_t ts) {
77     return ts > (RELATIVE_TS_BASE - (1LL<<48));
78 }
79
80 /* fraction handling */
81
82 /**
83  * f = val + (num / den) + 0.5.
84  *
85  * 'num' is normalized so that it is such as 0 <= num < den.
86  *
87  * @param f fractional number
88  * @param val integer value
89  * @param num must be >= 0
90  * @param den must be >= 1
91  */
92 static void frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
93 {
94     num += (den >> 1);
95     if (num >= den) {
96         val += num / den;
97         num = num % den;
98     }
99     f->val = val;
100     f->num = num;
101     f->den = den;
102 }
103
104 /**
105  * Fractional addition to f: f = f + (incr / f->den).
106  *
107  * @param f fractional number
108  * @param incr increment, can be positive or negative
109  */
110 static void frac_add(AVFrac *f, int64_t incr)
111 {
112     int64_t num, den;
113
114     num = f->num + incr;
115     den = f->den;
116     if (num < 0) {
117         f->val += num / den;
118         num = num % den;
119         if (num < 0) {
120             num += den;
121             f->val--;
122         }
123     } else if (num >= den) {
124         f->val += num / den;
125         num = num % den;
126     }
127     f->num = num;
128 }
129
130 /** head of registered input format linked list */
131 static AVInputFormat *first_iformat = NULL;
132 /** head of registered output format linked list */
133 static AVOutputFormat *first_oformat = NULL;
134
135 AVInputFormat  *av_iformat_next(AVInputFormat  *f)
136 {
137     if(f) return f->next;
138     else  return first_iformat;
139 }
140
141 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
142 {
143     if(f) return f->next;
144     else  return first_oformat;
145 }
146
147 void av_register_input_format(AVInputFormat *format)
148 {
149     AVInputFormat **p;
150     p = &first_iformat;
151     while (*p != NULL) p = &(*p)->next;
152     *p = format;
153     format->next = NULL;
154 }
155
156 void av_register_output_format(AVOutputFormat *format)
157 {
158     AVOutputFormat **p;
159     p = &first_oformat;
160     while (*p != NULL) p = &(*p)->next;
161     *p = format;
162     format->next = NULL;
163 }
164
165 int av_match_ext(const char *filename, const char *extensions)
166 {
167     const char *ext, *p;
168     char ext1[32], *q;
169
170     if(!filename)
171         return 0;
172
173     ext = strrchr(filename, '.');
174     if (ext) {
175         ext++;
176         p = extensions;
177         for(;;) {
178             q = ext1;
179             while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
180                 *q++ = *p++;
181             *q = '\0';
182             if (!av_strcasecmp(ext1, ext))
183                 return 1;
184             if (*p == '\0')
185                 break;
186             p++;
187         }
188     }
189     return 0;
190 }
191
192 static int match_format(const char *name, const char *names)
193 {
194     const char *p;
195     int len, namelen;
196
197     if (!name || !names)
198         return 0;
199
200     namelen = strlen(name);
201     while ((p = strchr(names, ','))) {
202         len = FFMAX(p - names, namelen);
203         if (!av_strncasecmp(name, names, len))
204             return 1;
205         names = p+1;
206     }
207     return !av_strcasecmp(name, names);
208 }
209
210 AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
211                                 const char *mime_type)
212 {
213     AVOutputFormat *fmt = NULL, *fmt_found;
214     int score_max, score;
215
216     /* specific test for image sequences */
217 #if CONFIG_IMAGE2_MUXER
218     if (!short_name && filename &&
219         av_filename_number_test(filename) &&
220         ff_guess_image2_codec(filename) != CODEC_ID_NONE) {
221         return av_guess_format("image2", NULL, NULL);
222     }
223 #endif
224     /* Find the proper file type. */
225     fmt_found = NULL;
226     score_max = 0;
227     while ((fmt = av_oformat_next(fmt))) {
228         score = 0;
229         if (fmt->name && short_name && match_format(short_name, fmt->name))
230             score += 100;
231         if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
232             score += 10;
233         if (filename && fmt->extensions &&
234             av_match_ext(filename, fmt->extensions)) {
235             score += 5;
236         }
237         if (score > score_max) {
238             score_max = score;
239             fmt_found = fmt;
240         }
241     }
242     return fmt_found;
243 }
244
245 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
246                             const char *filename, const char *mime_type, enum AVMediaType type){
247     if(type == AVMEDIA_TYPE_VIDEO){
248         enum CodecID codec_id= CODEC_ID_NONE;
249
250 #if CONFIG_IMAGE2_MUXER
251         if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
252             codec_id= ff_guess_image2_codec(filename);
253         }
254 #endif
255         if(codec_id == CODEC_ID_NONE)
256             codec_id= fmt->video_codec;
257         return codec_id;
258     }else if(type == AVMEDIA_TYPE_AUDIO)
259         return fmt->audio_codec;
260     else if (type == AVMEDIA_TYPE_SUBTITLE)
261         return fmt->subtitle_codec;
262     else
263         return CODEC_ID_NONE;
264 }
265
266 AVInputFormat *av_find_input_format(const char *short_name)
267 {
268     AVInputFormat *fmt = NULL;
269     while ((fmt = av_iformat_next(fmt))) {
270         if (match_format(short_name, fmt->name))
271             return fmt;
272     }
273     return NULL;
274 }
275
276 int ffio_limit(AVIOContext *s, int size)
277 {
278     if(s->maxsize>=0){
279         int64_t remaining= s->maxsize - avio_tell(s);
280         if(remaining < size){
281             int64_t newsize= avio_size(s);
282             if(!s->maxsize || s->maxsize<newsize)
283                 s->maxsize= newsize - !newsize;
284             remaining= s->maxsize - avio_tell(s);
285             remaining= FFMAX(remaining, 0);
286         }
287
288         if(s->maxsize>=0 && remaining+1 < size){
289             av_log(0, AV_LOG_ERROR, "Truncating packet of size %d to %"PRId64"\n", size, remaining+1);
290             size= remaining+1;
291         }
292     }
293     return size;
294 }
295
296 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
297 {
298     int ret;
299     int orig_size = size;
300     size= ffio_limit(s, size);
301
302     ret= av_new_packet(pkt, size);
303
304     if(ret<0)
305         return ret;
306
307     pkt->pos= avio_tell(s);
308
309     ret= avio_read(s, pkt->data, size);
310     if(ret<=0)
311         av_free_packet(pkt);
312     else
313         av_shrink_packet(pkt, ret);
314     if (pkt->size < orig_size)
315         pkt->flags |= AV_PKT_FLAG_CORRUPT;
316
317     return ret;
318 }
319
320 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
321 {
322     int ret;
323     int old_size;
324     if (!pkt->size)
325         return av_get_packet(s, pkt, size);
326     old_size = pkt->size;
327     ret = av_grow_packet(pkt, size);
328     if (ret < 0)
329         return ret;
330     ret = avio_read(s, pkt->data + old_size, size);
331     av_shrink_packet(pkt, old_size + FFMAX(ret, 0));
332     return ret;
333 }
334
335
336 int av_filename_number_test(const char *filename)
337 {
338     char buf[1024];
339     return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
340 }
341
342 AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret)
343 {
344     AVProbeData lpd = *pd;
345     AVInputFormat *fmt1 = NULL, *fmt;
346     int score, nodat = 0, score_max=0;
347
348     if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
349         int id3len = ff_id3v2_tag_len(lpd.buf);
350         if (lpd.buf_size > id3len + 16) {
351             lpd.buf += id3len;
352             lpd.buf_size -= id3len;
353         }else
354             nodat = 1;
355     }
356
357     fmt = NULL;
358     while ((fmt1 = av_iformat_next(fmt1))) {
359         if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
360             continue;
361         score = 0;
362         if (fmt1->read_probe) {
363             score = fmt1->read_probe(&lpd);
364             if(fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions))
365                 score = FFMAX(score, nodat ? AVPROBE_SCORE_MAX/4-1 : 1);
366         } else if (fmt1->extensions) {
367             if (av_match_ext(lpd.filename, fmt1->extensions)) {
368                 score = 50;
369             }
370         }
371         if (score > score_max) {
372             score_max = score;
373             fmt = fmt1;
374         }else if (score == score_max)
375             fmt = NULL;
376     }
377     *score_ret= score_max;
378
379     return fmt;
380 }
381
382 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
383 {
384     int score_ret;
385     AVInputFormat *fmt= av_probe_input_format3(pd, is_opened, &score_ret);
386     if(score_ret > *score_max){
387         *score_max= score_ret;
388         return fmt;
389     }else
390         return NULL;
391 }
392
393 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
394     int score=0;
395     return av_probe_input_format2(pd, is_opened, &score);
396 }
397
398 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd)
399 {
400     static const struct {
401         const char *name; enum CodecID id; enum AVMediaType type;
402     } fmt_id_type[] = {
403         { "aac"      , CODEC_ID_AAC       , AVMEDIA_TYPE_AUDIO },
404         { "ac3"      , CODEC_ID_AC3       , AVMEDIA_TYPE_AUDIO },
405         { "dts"      , CODEC_ID_DTS       , AVMEDIA_TYPE_AUDIO },
406         { "eac3"     , CODEC_ID_EAC3      , AVMEDIA_TYPE_AUDIO },
407         { "h264"     , CODEC_ID_H264      , AVMEDIA_TYPE_VIDEO },
408         { "loas"     , CODEC_ID_AAC_LATM  , AVMEDIA_TYPE_AUDIO },
409         { "m4v"      , CODEC_ID_MPEG4     , AVMEDIA_TYPE_VIDEO },
410         { "mp3"      , CODEC_ID_MP3       , AVMEDIA_TYPE_AUDIO },
411         { "mpegvideo", CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
412         { 0 }
413     };
414     int score;
415     AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
416
417     if (fmt) {
418         int i;
419         av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
420                pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
421         for (i = 0; fmt_id_type[i].name; i++) {
422             if (!strcmp(fmt->name, fmt_id_type[i].name)) {
423                 st->codec->codec_id   = fmt_id_type[i].id;
424                 st->codec->codec_type = fmt_id_type[i].type;
425                 break;
426             }
427         }
428     }
429     return score;
430 }
431
432 /************************************************************/
433 /* input media file */
434
435 int av_demuxer_open(AVFormatContext *ic){
436     int err;
437
438     if (ic->iformat->read_header) {
439         err = ic->iformat->read_header(ic);
440         if (err < 0)
441             return err;
442     }
443
444     if (ic->pb && !ic->data_offset)
445         ic->data_offset = avio_tell(ic->pb);
446
447     return 0;
448 }
449
450
451 /** size of probe buffer, for guessing file type from file contents */
452 #define PROBE_BUF_MIN 2048
453 #define PROBE_BUF_MAX (1<<20)
454
455 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
456                           const char *filename, void *logctx,
457                           unsigned int offset, unsigned int max_probe_size)
458 {
459     AVProbeData pd = { filename ? filename : "", NULL, -offset };
460     unsigned char *buf = NULL;
461     int ret = 0, probe_size;
462
463     if (!max_probe_size) {
464         max_probe_size = PROBE_BUF_MAX;
465     } else if (max_probe_size > PROBE_BUF_MAX) {
466         max_probe_size = PROBE_BUF_MAX;
467     } else if (max_probe_size < PROBE_BUF_MIN) {
468         return AVERROR(EINVAL);
469     }
470
471     if (offset >= max_probe_size) {
472         return AVERROR(EINVAL);
473     }
474
475     for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt;
476         probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
477         int score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX/4 : 0;
478         int buf_offset = (probe_size == PROBE_BUF_MIN) ? 0 : probe_size>>1;
479         void *buftmp;
480
481         if (probe_size < offset) {
482             continue;
483         }
484
485         /* read probe data */
486         buftmp = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
487         if(!buftmp){
488             av_free(buf);
489             return AVERROR(ENOMEM);
490         }
491         buf=buftmp;
492         if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
493             /* fail if error was not end of file, otherwise, lower score */
494             if (ret != AVERROR_EOF) {
495                 av_free(buf);
496                 return ret;
497             }
498             score = 0;
499             ret = 0;            /* error was end of file, nothing read */
500         }
501         pd.buf_size += ret;
502         pd.buf = &buf[offset];
503
504         memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
505
506         /* guess file format */
507         *fmt = av_probe_input_format2(&pd, 1, &score);
508         if(*fmt){
509             if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
510                 av_log(logctx, AV_LOG_WARNING, "Format %s detected only with low score of %d, misdetection possible!\n", (*fmt)->name, score);
511             }else
512                 av_log(logctx, AV_LOG_DEBUG, "Format %s probed with size=%d and score=%d\n", (*fmt)->name, probe_size, score);
513         }
514     }
515
516     if (!*fmt) {
517         av_free(buf);
518         return AVERROR_INVALIDDATA;
519     }
520
521     /* rewind. reuse probe buffer to avoid seeking */
522     if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
523         av_free(buf);
524
525     return ret;
526 }
527
528 /* open input file and probe the format if necessary */
529 static int init_input(AVFormatContext *s, const char *filename, AVDictionary **options)
530 {
531     int ret;
532     AVProbeData pd = {filename, NULL, 0};
533
534     if (s->pb) {
535         s->flags |= AVFMT_FLAG_CUSTOM_IO;
536         if (!s->iformat)
537             return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, s->probesize);
538         else if (s->iformat->flags & AVFMT_NOFILE)
539             av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
540                                       "will be ignored with AVFMT_NOFILE format.\n");
541         return 0;
542     }
543
544     if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
545         (!s->iformat && (s->iformat = av_probe_input_format(&pd, 0))))
546         return 0;
547
548     if ((ret = avio_open2(&s->pb, filename, AVIO_FLAG_READ | s->avio_flags,
549                           &s->interrupt_callback, options)) < 0)
550         return ret;
551     if (s->iformat)
552         return 0;
553     return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, s->probesize);
554 }
555
556 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
557                                AVPacketList **plast_pktl){
558     AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
559     if (!pktl)
560         return NULL;
561
562     if (*packet_buffer)
563         (*plast_pktl)->next = pktl;
564     else
565         *packet_buffer = pktl;
566
567     /* add the packet in the buffered packet list */
568     *plast_pktl = pktl;
569     pktl->pkt= *pkt;
570     return &pktl->pkt;
571 }
572
573 static void queue_attached_pictures(AVFormatContext *s)
574 {
575     int i;
576     for (i = 0; i < s->nb_streams; i++)
577         if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC &&
578             s->streams[i]->discard < AVDISCARD_ALL) {
579             AVPacket copy = s->streams[i]->attached_pic;
580             copy.destruct = NULL;
581             add_to_pktbuf(&s->raw_packet_buffer, &copy, &s->raw_packet_buffer_end);
582         }
583 }
584
585 int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
586 {
587     AVFormatContext *s = *ps;
588     int ret = 0;
589     AVDictionary *tmp = NULL;
590     ID3v2ExtraMeta *id3v2_extra_meta = NULL;
591
592     if (!s && !(s = avformat_alloc_context()))
593         return AVERROR(ENOMEM);
594     if (!s->av_class){
595         av_log(0, AV_LOG_ERROR, "Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n");
596         return AVERROR(EINVAL);
597     }
598     if (fmt)
599         s->iformat = fmt;
600
601     if (options)
602         av_dict_copy(&tmp, *options, 0);
603
604     if ((ret = av_opt_set_dict(s, &tmp)) < 0)
605         goto fail;
606
607     if ((ret = init_input(s, filename, &tmp)) < 0)
608         goto fail;
609
610     /* check filename in case an image number is expected */
611     if (s->iformat->flags & AVFMT_NEEDNUMBER) {
612         if (!av_filename_number_test(filename)) {
613             ret = AVERROR(EINVAL);
614             goto fail;
615         }
616     }
617
618     s->duration = s->start_time = AV_NOPTS_VALUE;
619     av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename));
620
621     /* allocate private data */
622     if (s->iformat->priv_data_size > 0) {
623         if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
624             ret = AVERROR(ENOMEM);
625             goto fail;
626         }
627         if (s->iformat->priv_class) {
628             *(const AVClass**)s->priv_data = s->iformat->priv_class;
629             av_opt_set_defaults(s->priv_data);
630             if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
631                 goto fail;
632         }
633     }
634
635     /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
636     if (s->pb)
637         ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
638
639     if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
640         if ((ret = s->iformat->read_header(s)) < 0)
641             goto fail;
642
643     if (id3v2_extra_meta &&
644         (ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
645         goto fail;
646     ff_id3v2_free_extra_meta(&id3v2_extra_meta);
647
648     queue_attached_pictures(s);
649
650     if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->data_offset)
651         s->data_offset = avio_tell(s->pb);
652
653     s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
654
655     if (options) {
656         av_dict_free(options);
657         *options = tmp;
658     }
659     *ps = s;
660     return 0;
661
662 fail:
663     ff_id3v2_free_extra_meta(&id3v2_extra_meta);
664     av_dict_free(&tmp);
665     if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
666         avio_close(s->pb);
667     avformat_free_context(s);
668     *ps = NULL;
669     return ret;
670 }
671
672 /*******************************************************/
673
674 static void probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
675 {
676     if(st->request_probe>0){
677         AVProbeData *pd = &st->probe_data;
678         int end;
679         av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
680         --st->probe_packets;
681
682         if (pkt) {
683             pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
684             memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
685             pd->buf_size += pkt->size;
686             memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
687         } else {
688             st->probe_packets = 0;
689         }
690
691         end=    s->raw_packet_buffer_remaining_size <= 0
692                 || st->probe_packets<=0;
693
694         if(end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
695             int score= set_codec_from_probe_data(s, st, pd);
696             if(    (st->codec->codec_id != CODEC_ID_NONE && score > AVPROBE_SCORE_MAX/4)
697                 || end){
698                 pd->buf_size=0;
699                 av_freep(&pd->buf);
700                 st->request_probe= -1;
701                 if(st->codec->codec_id != CODEC_ID_NONE){
702                     av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
703                 }else
704                     av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
705             }
706         }
707     }
708 }
709
710 int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
711 {
712     int ret, i;
713     AVStream *st;
714
715     for(;;){
716         AVPacketList *pktl = s->raw_packet_buffer;
717
718         if (pktl) {
719             *pkt = pktl->pkt;
720             st = s->streams[pkt->stream_index];
721             if(st->request_probe <= 0){
722                 s->raw_packet_buffer = pktl->next;
723                 s->raw_packet_buffer_remaining_size += pkt->size;
724                 av_free(pktl);
725                 return 0;
726             }
727         }
728
729         av_init_packet(pkt);
730         ret= s->iformat->read_packet(s, pkt);
731         if (ret < 0) {
732             if (!pktl || ret == AVERROR(EAGAIN))
733                 return ret;
734             for (i = 0; i < s->nb_streams; i++) {
735                 st = s->streams[i];
736                 if (st->probe_packets) {
737                     probe_codec(s, st, NULL);
738                 }
739                 av_assert0(st->request_probe <= 0);
740             }
741             continue;
742         }
743
744         if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
745             (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
746             av_log(s, AV_LOG_WARNING,
747                    "Dropped corrupted packet (stream = %d)\n",
748                    pkt->stream_index);
749             av_free_packet(pkt);
750             continue;
751         }
752
753         if(!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
754             av_packet_merge_side_data(pkt);
755
756         if(pkt->stream_index >= (unsigned)s->nb_streams){
757             av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
758             continue;
759         }
760
761         st= s->streams[pkt->stream_index];
762
763         switch(st->codec->codec_type){
764         case AVMEDIA_TYPE_VIDEO:
765             if(s->video_codec_id)   st->codec->codec_id= s->video_codec_id;
766             break;
767         case AVMEDIA_TYPE_AUDIO:
768             if(s->audio_codec_id)   st->codec->codec_id= s->audio_codec_id;
769             break;
770         case AVMEDIA_TYPE_SUBTITLE:
771             if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
772             break;
773         }
774
775         if(!pktl && st->request_probe <= 0)
776             return ret;
777
778         add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
779         s->raw_packet_buffer_remaining_size -= pkt->size;
780
781         probe_codec(s, st, pkt);
782     }
783 }
784
785 #if FF_API_READ_PACKET
786 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
787 {
788     return ff_read_packet(s, pkt);
789 }
790 #endif
791
792
793 /**********************************************************/
794
795 static int determinable_frame_size(AVCodecContext *avctx)
796 {
797     if (/*avctx->codec_id == CODEC_ID_AAC ||*/
798         avctx->codec_id == CODEC_ID_MP1 ||
799         avctx->codec_id == CODEC_ID_MP2 ||
800         avctx->codec_id == CODEC_ID_MP3/* ||
801         avctx->codec_id == CODEC_ID_CELT*/)
802         return 1;
803     return 0;
804 }
805
806 /**
807  * Get the number of samples of an audio frame. Return -1 on error.
808  */
809 static int get_audio_frame_size(AVCodecContext *enc, int size, int mux)
810 {
811     int frame_size;
812
813     /* give frame_size priority if demuxing */
814     if (!mux && enc->frame_size > 1)
815         return enc->frame_size;
816
817     if ((frame_size = av_get_audio_frame_duration(enc, size)) > 0)
818         return frame_size;
819
820     /* fallback to using frame_size if muxing */
821     if (enc->frame_size > 1)
822         return enc->frame_size;
823
824     return -1;
825 }
826
827
828 /**
829  * Return the frame duration in seconds. Return 0 if not available.
830  */
831 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
832                                    AVCodecParserContext *pc, AVPacket *pkt)
833 {
834     int frame_size;
835
836     *pnum = 0;
837     *pden = 0;
838     switch(st->codec->codec_type) {
839     case AVMEDIA_TYPE_VIDEO:
840         if (st->r_frame_rate.num && !pc) {
841             *pnum = st->r_frame_rate.den;
842             *pden = st->r_frame_rate.num;
843         } else if(st->time_base.num*1000LL > st->time_base.den) {
844             *pnum = st->time_base.num;
845             *pden = st->time_base.den;
846         }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
847             *pnum = st->codec->time_base.num;
848             *pden = st->codec->time_base.den;
849             if (pc && pc->repeat_pict) {
850                 *pnum = (*pnum) * (1 + pc->repeat_pict);
851             }
852             //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
853             //Thus if we have no parser in such case leave duration undefined.
854             if(st->codec->ticks_per_frame>1 && !pc){
855                 *pnum = *pden = 0;
856             }
857         }
858         break;
859     case AVMEDIA_TYPE_AUDIO:
860         frame_size = get_audio_frame_size(st->codec, pkt->size, 0);
861         if (frame_size <= 0 || st->codec->sample_rate <= 0)
862             break;
863         *pnum = frame_size;
864         *pden = st->codec->sample_rate;
865         break;
866     default:
867         break;
868     }
869 }
870
871 static int is_intra_only(AVCodecContext *enc){
872     if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
873         return 1;
874     }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
875         switch(enc->codec_id){
876         case CODEC_ID_MJPEG:
877         case CODEC_ID_MJPEGB:
878         case CODEC_ID_LJPEG:
879         case CODEC_ID_PRORES:
880         case CODEC_ID_RAWVIDEO:
881         case CODEC_ID_V210:
882         case CODEC_ID_DVVIDEO:
883         case CODEC_ID_HUFFYUV:
884         case CODEC_ID_FFVHUFF:
885         case CODEC_ID_ASV1:
886         case CODEC_ID_ASV2:
887         case CODEC_ID_VCR1:
888         case CODEC_ID_DNXHD:
889         case CODEC_ID_JPEG2000:
890         case CODEC_ID_MDEC:
891         case CODEC_ID_UTVIDEO:
892             return 1;
893         default: break;
894         }
895     }
896     return 0;
897 }
898
899 static AVPacketList *get_next_pkt(AVFormatContext *s, AVStream *st, AVPacketList *pktl)
900 {
901     if (pktl->next)
902         return pktl->next;
903     if (pktl == s->parse_queue_end)
904         return s->packet_buffer;
905     return NULL;
906 }
907
908 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
909                                       int64_t dts, int64_t pts)
910 {
911     AVStream *st= s->streams[stream_index];
912     AVPacketList *pktl= s->parse_queue ? s->parse_queue : s->packet_buffer;
913
914     if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE || is_relative(dts))
915         return;
916
917     st->first_dts= dts - (st->cur_dts - RELATIVE_TS_BASE);
918     st->cur_dts= dts;
919
920     if (is_relative(pts))
921         pts += st->first_dts - RELATIVE_TS_BASE;
922
923     for(; pktl; pktl= get_next_pkt(s, st, pktl)){
924         if(pktl->pkt.stream_index != stream_index)
925             continue;
926         if(is_relative(pktl->pkt.pts))
927             pktl->pkt.pts += st->first_dts - RELATIVE_TS_BASE;
928
929         if(is_relative(pktl->pkt.dts))
930             pktl->pkt.dts += st->first_dts - RELATIVE_TS_BASE;
931
932         if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
933             st->start_time= pktl->pkt.pts;
934     }
935     if (st->start_time == AV_NOPTS_VALUE)
936         st->start_time = pts;
937 }
938
939 static void update_initial_durations(AVFormatContext *s, AVStream *st,
940                                      int stream_index, int duration)
941 {
942     AVPacketList *pktl= s->parse_queue ? s->parse_queue : s->packet_buffer;
943     int64_t cur_dts= RELATIVE_TS_BASE;
944
945     if(st->first_dts != AV_NOPTS_VALUE){
946         cur_dts= st->first_dts;
947         for(; pktl; pktl= get_next_pkt(s, st, pktl)){
948             if(pktl->pkt.stream_index == stream_index){
949                 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
950                     break;
951                 cur_dts -= duration;
952             }
953         }
954         if(pktl && pktl->pkt.dts != st->first_dts) {
955             av_log(s, AV_LOG_DEBUG, "first_dts %s not matching first dts %s in que\n", av_ts2str(st->first_dts), av_ts2str(pktl->pkt.dts));
956             return;
957         }
958         if(!pktl) {
959             av_log(s, AV_LOG_DEBUG, "first_dts %s but no packet with dts in ques\n", av_ts2str(st->first_dts));
960             return;
961         }
962         pktl= s->parse_queue ? s->parse_queue : s->packet_buffer;
963         st->first_dts = cur_dts;
964     }else if(st->cur_dts != RELATIVE_TS_BASE)
965         return;
966
967     for(; pktl; pktl= get_next_pkt(s, st, pktl)){
968         if(pktl->pkt.stream_index != stream_index)
969             continue;
970         if(pktl->pkt.pts == pktl->pkt.dts && (pktl->pkt.dts == AV_NOPTS_VALUE || pktl->pkt.dts == st->first_dts)
971            && !pktl->pkt.duration){
972             pktl->pkt.dts= cur_dts;
973             if(!st->codec->has_b_frames)
974                 pktl->pkt.pts= cur_dts;
975 //            if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
976                 pktl->pkt.duration = duration;
977         }else
978             break;
979         cur_dts = pktl->pkt.dts + pktl->pkt.duration;
980     }
981     if(!pktl)
982         st->cur_dts= cur_dts;
983 }
984
985 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
986                                AVCodecParserContext *pc, AVPacket *pkt)
987 {
988     int num, den, presentation_delayed, delay, i;
989     int64_t offset;
990
991     if (s->flags & AVFMT_FLAG_NOFILLIN)
992         return;
993
994     if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
995         pkt->dts= AV_NOPTS_VALUE;
996
997     if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
998         //FIXME Set low_delay = 0 when has_b_frames = 1
999         st->codec->has_b_frames = 1;
1000
1001     /* do we have a video B-frame ? */
1002     delay= st->codec->has_b_frames;
1003     presentation_delayed = 0;
1004
1005     /* XXX: need has_b_frame, but cannot get it if the codec is
1006         not initialized */
1007     if (delay &&
1008         pc && pc->pict_type != AV_PICTURE_TYPE_B)
1009         presentation_delayed = 1;
1010
1011     if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts - (1LL<<(st->pts_wrap_bits-1)) > pkt->pts && st->pts_wrap_bits<63){
1012         pkt->dts -= 1LL<<st->pts_wrap_bits;
1013     }
1014
1015     // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
1016     // we take the conservative approach and discard both
1017     // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
1018     if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
1019         av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1020         pkt->dts= AV_NOPTS_VALUE;
1021     }
1022
1023     if (pkt->duration == 0) {
1024         compute_frame_duration(&num, &den, st, pc, pkt);
1025         if (den && num) {
1026             pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
1027         }
1028     }
1029     if(pkt->duration != 0 && (s->packet_buffer || s->parse_queue))
1030         update_initial_durations(s, st, pkt->stream_index, pkt->duration);
1031
1032     /* correct timestamps with byte offset if demuxers only have timestamps
1033        on packet boundaries */
1034     if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
1035         /* this will estimate bitrate based on this frame's duration and size */
1036         offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1037         if(pkt->pts != AV_NOPTS_VALUE)
1038             pkt->pts += offset;
1039         if(pkt->dts != AV_NOPTS_VALUE)
1040             pkt->dts += offset;
1041     }
1042
1043     if (pc && pc->dts_sync_point >= 0) {
1044         // we have synchronization info from the parser
1045         int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
1046         if (den > 0) {
1047             int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
1048             if (pkt->dts != AV_NOPTS_VALUE) {
1049                 // got DTS from the stream, update reference timestamp
1050                 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
1051                 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1052             } else if (st->reference_dts != AV_NOPTS_VALUE) {
1053                 // compute DTS based on reference timestamp
1054                 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
1055                 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1056             }
1057             if (pc->dts_sync_point > 0)
1058                 st->reference_dts = pkt->dts; // new reference
1059         }
1060     }
1061
1062     /* This may be redundant, but it should not hurt. */
1063     if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
1064         presentation_delayed = 1;
1065
1066 //    av_log(NULL, AV_LOG_DEBUG, "IN delayed:%d pts:%s, dts:%s cur_dts:%s st:%d pc:%p duration:%d\n",
1067 //           presentation_delayed, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts), pkt->stream_index, pc, pkt->duration);
1068     /* interpolate PTS and DTS if they are not present */
1069     //We skip H264 currently because delay and has_b_frames are not reliably set
1070     if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
1071         if (presentation_delayed) {
1072             /* DTS = decompression timestamp */
1073             /* PTS = presentation timestamp */
1074             if (pkt->dts == AV_NOPTS_VALUE)
1075                 pkt->dts = st->last_IP_pts;
1076             update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
1077             if (pkt->dts == AV_NOPTS_VALUE)
1078                 pkt->dts = st->cur_dts;
1079
1080             /* this is tricky: the dts must be incremented by the duration
1081             of the frame we are displaying, i.e. the last I- or P-frame */
1082             if (st->last_IP_duration == 0)
1083                 st->last_IP_duration = pkt->duration;
1084             if(pkt->dts != AV_NOPTS_VALUE)
1085                 st->cur_dts = pkt->dts + st->last_IP_duration;
1086             st->last_IP_duration  = pkt->duration;
1087             st->last_IP_pts= pkt->pts;
1088             /* cannot compute PTS if not present (we can compute it only
1089             by knowing the future */
1090         } else if (pkt->pts != AV_NOPTS_VALUE ||
1091                    pkt->dts != AV_NOPTS_VALUE ||
1092                    pkt->duration                ) {
1093             int duration = pkt->duration;
1094
1095             if(pkt->pts != AV_NOPTS_VALUE && duration){
1096                 int64_t old_diff= FFABS(st->cur_dts - duration - pkt->pts);
1097                 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
1098                 if(   old_diff < new_diff && old_diff < (duration>>3)
1099                    && st->codec->codec_type == AVMEDIA_TYPE_VIDEO
1100                    && (!strcmp(s->iformat->name, "mpeg") ||
1101                        !strcmp(s->iformat->name, "mpegts"))){
1102                     pkt->pts += duration;
1103                     av_log(s, AV_LOG_WARNING, "Adjusting PTS forward\n");
1104 //                    av_log(NULL, AV_LOG_DEBUG, "id:%d old:%"PRId64" new:%"PRId64" dur:%d cur:%s size:%d\n",
1105 //                           pkt->stream_index, old_diff, new_diff, pkt->duration, av_ts2str(st->cur_dts), pkt->size);
1106                 }
1107             }
1108
1109             /* presentation is not delayed : PTS and DTS are the same */
1110             if (pkt->pts == AV_NOPTS_VALUE)
1111                 pkt->pts = pkt->dts;
1112             update_initial_timestamps(s, pkt->stream_index, pkt->pts,
1113                                       pkt->pts);
1114             if (pkt->pts == AV_NOPTS_VALUE)
1115                 pkt->pts = st->cur_dts;
1116             pkt->dts = pkt->pts;
1117             if (pkt->pts != AV_NOPTS_VALUE)
1118                 st->cur_dts = pkt->pts + duration;
1119         }
1120     }
1121
1122     if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
1123         st->pts_buffer[0]= pkt->pts;
1124         for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1125             FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1126         if(pkt->dts == AV_NOPTS_VALUE)
1127             pkt->dts= st->pts_buffer[0];
1128         if(st->codec->codec_id == CODEC_ID_H264){ // we skipped it above so we try here
1129             update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1130         }
1131         if(pkt->dts > st->cur_dts)
1132             st->cur_dts = pkt->dts;
1133     }
1134
1135 //    av_log(NULL, AV_LOG_ERROR, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s\n",
1136 //           presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts));
1137
1138     /* update flags */
1139     if(is_intra_only(st->codec))
1140         pkt->flags |= AV_PKT_FLAG_KEY;
1141     if (pc)
1142         pkt->convergence_duration = pc->convergence_duration;
1143 }
1144
1145 static void free_packet_buffer(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end)
1146 {
1147     while (*pkt_buf) {
1148         AVPacketList *pktl = *pkt_buf;
1149         *pkt_buf = pktl->next;
1150         av_free_packet(&pktl->pkt);
1151         av_freep(&pktl);
1152     }
1153     *pkt_buf_end = NULL;
1154 }
1155
1156 /**
1157  * Parse a packet, add all split parts to parse_queue
1158  *
1159  * @param pkt packet to parse, NULL when flushing the parser at end of stream
1160  */
1161 static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index)
1162 {
1163     AVPacket out_pkt = { 0 }, flush_pkt = { 0 };
1164     AVStream     *st = s->streams[stream_index];
1165     uint8_t    *data = pkt ? pkt->data : NULL;
1166     int         size = pkt ? pkt->size : 0;
1167     int ret = 0, got_output = 0;
1168
1169     if (!pkt) {
1170         av_init_packet(&flush_pkt);
1171         pkt = &flush_pkt;
1172         got_output = 1;
1173     } else if (!size && st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) {
1174         // preserve 0-size sync packets
1175         compute_pkt_fields(s, st, st->parser, pkt);
1176     }
1177
1178     while (size > 0 || (pkt == &flush_pkt && got_output)) {
1179         int len;
1180
1181         av_init_packet(&out_pkt);
1182         len = av_parser_parse2(st->parser,  st->codec,
1183                                &out_pkt.data, &out_pkt.size, data, size,
1184                                pkt->pts, pkt->dts, pkt->pos);
1185
1186         pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1187         pkt->pos = -1;
1188         /* increment read pointer */
1189         data += len;
1190         size -= len;
1191
1192         got_output = !!out_pkt.size;
1193
1194         if (!out_pkt.size)
1195             continue;
1196
1197         /* set the duration */
1198         out_pkt.duration = 0;
1199         if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1200             if (st->codec->sample_rate > 0) {
1201                 out_pkt.duration = av_rescale_q_rnd(st->parser->duration,
1202                                                     (AVRational){ 1, st->codec->sample_rate },
1203                                                     st->time_base,
1204                                                     AV_ROUND_DOWN);
1205             }
1206         } else if (st->codec->time_base.num != 0 &&
1207                    st->codec->time_base.den != 0) {
1208             out_pkt.duration = av_rescale_q_rnd(st->parser->duration,
1209                                                 st->codec->time_base,
1210                                                 st->time_base,
1211                                                 AV_ROUND_DOWN);
1212         }
1213
1214         out_pkt.stream_index = st->index;
1215         out_pkt.pts = st->parser->pts;
1216         out_pkt.dts = st->parser->dts;
1217         out_pkt.pos = st->parser->pos;
1218
1219         if(st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1220             out_pkt.pos = st->parser->frame_offset;
1221
1222         if (st->parser->key_frame == 1 ||
1223             (st->parser->key_frame == -1 &&
1224              st->parser->pict_type == AV_PICTURE_TYPE_I))
1225             out_pkt.flags |= AV_PKT_FLAG_KEY;
1226
1227         if(st->parser->key_frame == -1 && st->parser->pict_type==AV_PICTURE_TYPE_NONE && (pkt->flags&AV_PKT_FLAG_KEY))
1228             out_pkt.flags |= AV_PKT_FLAG_KEY;
1229
1230         compute_pkt_fields(s, st, st->parser, &out_pkt);
1231
1232         if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1233             out_pkt.flags & AV_PKT_FLAG_KEY) {
1234             int64_t pos= (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? out_pkt.pos : st->parser->frame_offset;
1235             ff_reduce_index(s, st->index);
1236             av_add_index_entry(st, pos, out_pkt.dts,
1237                                0, 0, AVINDEX_KEYFRAME);
1238         }
1239
1240         if (out_pkt.data == pkt->data && out_pkt.size == pkt->size) {
1241             out_pkt.destruct = pkt->destruct;
1242             pkt->destruct = NULL;
1243         }
1244         if ((ret = av_dup_packet(&out_pkt)) < 0)
1245             goto fail;
1246
1247         if (!add_to_pktbuf(&s->parse_queue, &out_pkt, &s->parse_queue_end)) {
1248             av_free_packet(&out_pkt);
1249             ret = AVERROR(ENOMEM);
1250             goto fail;
1251         }
1252     }
1253
1254
1255     /* end of the stream => close and free the parser */
1256     if (pkt == &flush_pkt) {
1257         av_parser_close(st->parser);
1258         st->parser = NULL;
1259     }
1260
1261 fail:
1262     av_free_packet(pkt);
1263     return ret;
1264 }
1265
1266 static int read_from_packet_buffer(AVPacketList **pkt_buffer,
1267                                    AVPacketList **pkt_buffer_end,
1268                                    AVPacket      *pkt)
1269 {
1270     AVPacketList *pktl;
1271     av_assert0(*pkt_buffer);
1272     pktl = *pkt_buffer;
1273     *pkt = pktl->pkt;
1274     *pkt_buffer = pktl->next;
1275     if (!pktl->next)
1276         *pkt_buffer_end = NULL;
1277     av_freep(&pktl);
1278     return 0;
1279 }
1280
1281 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1282 {
1283     int ret = 0, i, got_packet = 0;
1284
1285     av_init_packet(pkt);
1286
1287     while (!got_packet && !s->parse_queue) {
1288         AVStream *st;
1289         AVPacket cur_pkt;
1290
1291         /* read next packet */
1292         ret = ff_read_packet(s, &cur_pkt);
1293         if (ret < 0) {
1294             if (ret == AVERROR(EAGAIN))
1295                 return ret;
1296             /* flush the parsers */
1297             for(i = 0; i < s->nb_streams; i++) {
1298                 st = s->streams[i];
1299                 if (st->parser && st->need_parsing)
1300                     parse_packet(s, NULL, st->index);
1301             }
1302             /* all remaining packets are now in parse_queue =>
1303              * really terminate parsing */
1304             break;
1305         }
1306         ret = 0;
1307         st  = s->streams[cur_pkt.stream_index];
1308
1309         if (cur_pkt.pts != AV_NOPTS_VALUE &&
1310             cur_pkt.dts != AV_NOPTS_VALUE &&
1311             cur_pkt.pts < cur_pkt.dts) {
1312             av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
1313                    cur_pkt.stream_index,
1314                    av_ts2str(cur_pkt.pts),
1315                    av_ts2str(cur_pkt.dts),
1316                    cur_pkt.size);
1317         }
1318         if (s->debug & FF_FDEBUG_TS)
1319             av_log(s, AV_LOG_DEBUG, "ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%d, flags=%d\n",
1320                    cur_pkt.stream_index,
1321                    av_ts2str(cur_pkt.pts),
1322                    av_ts2str(cur_pkt.dts),
1323                    cur_pkt.size,
1324                    cur_pkt.duration,
1325                    cur_pkt.flags);
1326
1327         if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1328             st->parser = av_parser_init(st->codec->codec_id);
1329             if (!st->parser) {
1330                 av_log(s, AV_LOG_VERBOSE, "parser not found for codec "
1331                        "%s, packets or times may be invalid.\n",
1332                        avcodec_get_name(st->codec->codec_id));
1333                 /* no parser available: just output the raw packets */
1334                 st->need_parsing = AVSTREAM_PARSE_NONE;
1335             } else if(st->need_parsing == AVSTREAM_PARSE_HEADERS) {
1336                 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1337             } else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE) {
1338                 st->parser->flags |= PARSER_FLAG_ONCE;
1339             } else if(st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
1340                 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
1341             }
1342         }
1343
1344         if (!st->need_parsing || !st->parser) {
1345             /* no parsing needed: we just output the packet as is */
1346             *pkt = cur_pkt;
1347             compute_pkt_fields(s, st, NULL, pkt);
1348             if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1349                 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1350                 ff_reduce_index(s, st->index);
1351                 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1352             }
1353             got_packet = 1;
1354         } else if (st->discard < AVDISCARD_ALL) {
1355             if ((ret = parse_packet(s, &cur_pkt, cur_pkt.stream_index)) < 0)
1356                 return ret;
1357         } else {
1358             /* free packet */
1359             av_free_packet(&cur_pkt);
1360         }
1361         if (pkt->flags & AV_PKT_FLAG_KEY)
1362             st->skip_to_keyframe = 0;
1363         if (st->skip_to_keyframe) {
1364             av_free_packet(&cur_pkt);
1365             got_packet = 0;
1366         }
1367     }
1368
1369     if (!got_packet && s->parse_queue)
1370         ret = read_from_packet_buffer(&s->parse_queue, &s->parse_queue_end, pkt);
1371
1372     if(s->debug & FF_FDEBUG_TS)
1373         av_log(s, AV_LOG_DEBUG, "read_frame_internal stream=%d, pts=%s, dts=%s, size=%d, duration=%d, flags=%d\n",
1374             pkt->stream_index,
1375             av_ts2str(pkt->pts),
1376             av_ts2str(pkt->dts),
1377             pkt->size,
1378             pkt->duration,
1379             pkt->flags);
1380
1381     return ret;
1382 }
1383
1384 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1385 {
1386     const int genpts = s->flags & AVFMT_FLAG_GENPTS;
1387     int          eof = 0;
1388     int ret;
1389     AVStream *st;
1390
1391     if (!genpts) {
1392         ret = s->packet_buffer ? read_from_packet_buffer(&s->packet_buffer,
1393                                                           &s->packet_buffer_end,
1394                                                           pkt) :
1395                                   read_frame_internal(s, pkt);
1396         goto return_packet;
1397     }
1398
1399     for (;;) {
1400         AVPacketList *pktl = s->packet_buffer;
1401
1402         if (pktl) {
1403             AVPacket *next_pkt = &pktl->pkt;
1404
1405             if (next_pkt->dts != AV_NOPTS_VALUE) {
1406                 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1407                 // last dts seen for this stream. if any of packets following
1408                 // current one had no dts, we will set this to AV_NOPTS_VALUE.
1409                 int64_t last_dts = next_pkt->dts;
1410                 while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
1411                     if (pktl->pkt.stream_index == next_pkt->stream_index &&
1412                         (av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)) < 0)) {
1413                         if (av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1414                             next_pkt->pts = pktl->pkt.dts;
1415                         }
1416                         if (last_dts != AV_NOPTS_VALUE) {
1417                             // Once last dts was set to AV_NOPTS_VALUE, we don't change it.
1418                             last_dts = pktl->pkt.dts;
1419                         }
1420                     }
1421                     pktl = pktl->next;
1422                 }
1423                 if (eof && next_pkt->pts == AV_NOPTS_VALUE && last_dts != AV_NOPTS_VALUE) {
1424                     // Fixing the last reference frame had none pts issue (For MXF etc).
1425                     // We only do this when
1426                     // 1. eof.
1427                     // 2. we are not able to resolve a pts value for current packet.
1428                     // 3. the packets for this stream at the end of the files had valid dts.
1429                     next_pkt->pts = last_dts + next_pkt->duration;
1430                 }
1431                 pktl = s->packet_buffer;
1432             }
1433
1434             /* read packet from packet buffer, if there is data */
1435             if (!(next_pkt->pts == AV_NOPTS_VALUE &&
1436                   next_pkt->dts != AV_NOPTS_VALUE && !eof)) {
1437                 ret = read_from_packet_buffer(&s->packet_buffer,
1438                                                &s->packet_buffer_end, pkt);
1439                 goto return_packet;
1440             }
1441         }
1442
1443         ret = read_frame_internal(s, pkt);
1444         if (ret < 0) {
1445             if (pktl && ret != AVERROR(EAGAIN)) {
1446                 eof = 1;
1447                 continue;
1448             } else
1449                 return ret;
1450         }
1451
1452         if (av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1453                           &s->packet_buffer_end)) < 0)
1454             return AVERROR(ENOMEM);
1455     }
1456
1457 return_packet:
1458
1459     st = s->streams[pkt->stream_index];
1460     if (st->skip_samples) {
1461         uint8_t *p = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
1462         AV_WL32(p, st->skip_samples);
1463         av_log(s, AV_LOG_DEBUG, "demuxer injecting skip %d\n", st->skip_samples);
1464         st->skip_samples = 0;
1465     }
1466
1467     if (is_relative(pkt->dts))
1468         pkt->dts -= RELATIVE_TS_BASE;
1469     if (is_relative(pkt->pts))
1470         pkt->pts -= RELATIVE_TS_BASE;
1471     return ret;
1472 }
1473
1474 /* XXX: suppress the packet queue */
1475 static void flush_packet_queue(AVFormatContext *s)
1476 {
1477     free_packet_buffer(&s->parse_queue,       &s->parse_queue_end);
1478     free_packet_buffer(&s->packet_buffer,     &s->packet_buffer_end);
1479     free_packet_buffer(&s->raw_packet_buffer, &s->raw_packet_buffer_end);
1480
1481     s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1482 }
1483
1484 /*******************************************************/
1485 /* seek support */
1486
1487 int av_find_default_stream_index(AVFormatContext *s)
1488 {
1489     int first_audio_index = -1;
1490     int i;
1491     AVStream *st;
1492
1493     if (s->nb_streams <= 0)
1494         return -1;
1495     for(i = 0; i < s->nb_streams; i++) {
1496         st = s->streams[i];
1497         if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1498             !(st->disposition & AV_DISPOSITION_ATTACHED_PIC)) {
1499             return i;
1500         }
1501         if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1502             first_audio_index = i;
1503     }
1504     return first_audio_index >= 0 ? first_audio_index : 0;
1505 }
1506
1507 /**
1508  * Flush the frame reader.
1509  */
1510 void ff_read_frame_flush(AVFormatContext *s)
1511 {
1512     AVStream *st;
1513     int i, j;
1514
1515     flush_packet_queue(s);
1516
1517     /* for each stream, reset read state */
1518     for(i = 0; i < s->nb_streams; i++) {
1519         st = s->streams[i];
1520
1521         if (st->parser) {
1522             av_parser_close(st->parser);
1523             st->parser = NULL;
1524         }
1525         st->last_IP_pts = AV_NOPTS_VALUE;
1526         if(st->first_dts == AV_NOPTS_VALUE) st->cur_dts = RELATIVE_TS_BASE;
1527         else                                st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1528         st->reference_dts = AV_NOPTS_VALUE;
1529
1530         st->probe_packets = MAX_PROBE_PACKETS;
1531
1532         for(j=0; j<MAX_REORDER_DELAY+1; j++)
1533             st->pts_buffer[j]= AV_NOPTS_VALUE;
1534     }
1535 }
1536
1537 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1538 {
1539     int i;
1540
1541     for(i = 0; i < s->nb_streams; i++) {
1542         AVStream *st = s->streams[i];
1543
1544         st->cur_dts = av_rescale(timestamp,
1545                                  st->time_base.den * (int64_t)ref_st->time_base.num,
1546                                  st->time_base.num * (int64_t)ref_st->time_base.den);
1547     }
1548 }
1549
1550 void ff_reduce_index(AVFormatContext *s, int stream_index)
1551 {
1552     AVStream *st= s->streams[stream_index];
1553     unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1554
1555     if((unsigned)st->nb_index_entries >= max_entries){
1556         int i;
1557         for(i=0; 2*i<st->nb_index_entries; i++)
1558             st->index_entries[i]= st->index_entries[2*i];
1559         st->nb_index_entries= i;
1560     }
1561 }
1562
1563 int ff_add_index_entry(AVIndexEntry **index_entries,
1564                        int *nb_index_entries,
1565                        unsigned int *index_entries_allocated_size,
1566                        int64_t pos, int64_t timestamp, int size, int distance, int flags)
1567 {
1568     AVIndexEntry *entries, *ie;
1569     int index;
1570
1571     if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1572         return -1;
1573
1574     if (is_relative(timestamp)) //FIXME this maintains previous behavior but we should shift by the correct offset once known
1575         timestamp -= RELATIVE_TS_BASE;
1576
1577     entries = av_fast_realloc(*index_entries,
1578                               index_entries_allocated_size,
1579                               (*nb_index_entries + 1) *
1580                               sizeof(AVIndexEntry));
1581     if(!entries)
1582         return -1;
1583
1584     *index_entries= entries;
1585
1586     index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1587
1588     if(index<0){
1589         index= (*nb_index_entries)++;
1590         ie= &entries[index];
1591         assert(index==0 || ie[-1].timestamp < timestamp);
1592     }else{
1593         ie= &entries[index];
1594         if(ie->timestamp != timestamp){
1595             if(ie->timestamp <= timestamp)
1596                 return -1;
1597             memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1598             (*nb_index_entries)++;
1599         }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1600             distance= ie->min_distance;
1601     }
1602
1603     ie->pos = pos;
1604     ie->timestamp = timestamp;
1605     ie->min_distance= distance;
1606     ie->size= size;
1607     ie->flags = flags;
1608
1609     return index;
1610 }
1611
1612 int av_add_index_entry(AVStream *st,
1613                        int64_t pos, int64_t timestamp, int size, int distance, int flags)
1614 {
1615     return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1616                               &st->index_entries_allocated_size, pos,
1617                               timestamp, size, distance, flags);
1618 }
1619
1620 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1621                               int64_t wanted_timestamp, int flags)
1622 {
1623     int a, b, m;
1624     int64_t timestamp;
1625
1626     a = - 1;
1627     b = nb_entries;
1628
1629     //optimize appending index entries at the end
1630     if(b && entries[b-1].timestamp < wanted_timestamp)
1631         a= b-1;
1632
1633     while (b - a > 1) {
1634         m = (a + b) >> 1;
1635         timestamp = entries[m].timestamp;
1636         if(timestamp >= wanted_timestamp)
1637             b = m;
1638         if(timestamp <= wanted_timestamp)
1639             a = m;
1640     }
1641     m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1642
1643     if(!(flags & AVSEEK_FLAG_ANY)){
1644         while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1645             m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1646         }
1647     }
1648
1649     if(m == nb_entries)
1650         return -1;
1651     return  m;
1652 }
1653
1654 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1655                               int flags)
1656 {
1657     return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1658                                      wanted_timestamp, flags);
1659 }
1660
1661 int ff_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags)
1662 {
1663     AVInputFormat *avif= s->iformat;
1664     int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1665     int64_t ts_min, ts_max, ts;
1666     int index;
1667     int64_t ret;
1668     AVStream *st;
1669
1670     if (stream_index < 0)
1671         return -1;
1672
1673     av_dlog(s, "read_seek: %d %s\n", stream_index, av_ts2str(target_ts));
1674
1675     ts_max=
1676     ts_min= AV_NOPTS_VALUE;
1677     pos_limit= -1; //gcc falsely says it may be uninitialized
1678
1679     st= s->streams[stream_index];
1680     if(st->index_entries){
1681         AVIndexEntry *e;
1682
1683         index= av_index_search_timestamp(st, target_ts, flags | AVSEEK_FLAG_BACKWARD); //FIXME whole func must be checked for non-keyframe entries in index case, especially read_timestamp()
1684         index= FFMAX(index, 0);
1685         e= &st->index_entries[index];
1686
1687         if(e->timestamp <= target_ts || e->pos == e->min_distance){
1688             pos_min= e->pos;
1689             ts_min= e->timestamp;
1690             av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%s\n",
1691                     pos_min, av_ts2str(ts_min));
1692         }else{
1693             assert(index==0);
1694         }
1695
1696         index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1697         assert(index < st->nb_index_entries);
1698         if(index >= 0){
1699             e= &st->index_entries[index];
1700             assert(e->timestamp >= target_ts);
1701             pos_max= e->pos;
1702             ts_max= e->timestamp;
1703             pos_limit= pos_max - e->min_distance;
1704             av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%s\n",
1705                     pos_max, pos_limit, av_ts2str(ts_max));
1706         }
1707     }
1708
1709     pos= ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1710     if(pos<0)
1711         return -1;
1712
1713     /* do the seek */
1714     if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1715         return ret;
1716
1717     ff_read_frame_flush(s);
1718     ff_update_cur_dts(s, st, ts);
1719
1720     return 0;
1721 }
1722
1723 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1724                       int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1725                       int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret,
1726                       int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1727 {
1728     int64_t pos, ts;
1729     int64_t start_pos, filesize;
1730     int no_change;
1731
1732     av_dlog(s, "gen_seek: %d %s\n", stream_index, av_ts2str(target_ts));
1733
1734     if(ts_min == AV_NOPTS_VALUE){
1735         pos_min = s->data_offset;
1736         ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1737         if (ts_min == AV_NOPTS_VALUE)
1738             return -1;
1739     }
1740
1741     if(ts_min >= target_ts){
1742         *ts_ret= ts_min;
1743         return pos_min;
1744     }
1745
1746     if(ts_max == AV_NOPTS_VALUE){
1747         int step= 1024;
1748         filesize = avio_size(s->pb);
1749         pos_max = filesize - 1;
1750         do{
1751             pos_max -= step;
1752             ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1753             step += step;
1754         }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1755         if (ts_max == AV_NOPTS_VALUE)
1756             return -1;
1757
1758         for(;;){
1759             int64_t tmp_pos= pos_max + 1;
1760             int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1761             if(tmp_ts == AV_NOPTS_VALUE)
1762                 break;
1763             ts_max= tmp_ts;
1764             pos_max= tmp_pos;
1765             if(tmp_pos >= filesize)
1766                 break;
1767         }
1768         pos_limit= pos_max;
1769     }
1770
1771     if(ts_max <= target_ts){
1772         *ts_ret= ts_max;
1773         return pos_max;
1774     }
1775
1776     if(ts_min > ts_max){
1777         return -1;
1778     }else if(ts_min == ts_max){
1779         pos_limit= pos_min;
1780     }
1781
1782     no_change=0;
1783     while (pos_min < pos_limit) {
1784         av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%s dts_max=%s\n",
1785                 pos_min, pos_max, av_ts2str(ts_min), av_ts2str(ts_max));
1786         assert(pos_limit <= pos_max);
1787
1788         if(no_change==0){
1789             int64_t approximate_keyframe_distance= pos_max - pos_limit;
1790             // interpolate position (better than dichotomy)
1791             pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1792                 + pos_min - approximate_keyframe_distance;
1793         }else if(no_change==1){
1794             // bisection, if interpolation failed to change min or max pos last time
1795             pos = (pos_min + pos_limit)>>1;
1796         }else{
1797             /* linear search if bisection failed, can only happen if there
1798                are very few or no keyframes between min/max */
1799             pos=pos_min;
1800         }
1801         if(pos <= pos_min)
1802             pos= pos_min + 1;
1803         else if(pos > pos_limit)
1804             pos= pos_limit;
1805         start_pos= pos;
1806
1807         ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1808         if(pos == pos_max)
1809             no_change++;
1810         else
1811             no_change=0;
1812         av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %s %s %s target:%s limit:%"PRId64" start:%"PRId64" noc:%d\n",
1813                 pos_min, pos, pos_max,
1814                 av_ts2str(ts_min), av_ts2str(ts), av_ts2str(ts_max), av_ts2str(target_ts),
1815                 pos_limit, start_pos, no_change);
1816         if(ts == AV_NOPTS_VALUE){
1817             av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1818             return -1;
1819         }
1820         assert(ts != AV_NOPTS_VALUE);
1821         if (target_ts <= ts) {
1822             pos_limit = start_pos - 1;
1823             pos_max = pos;
1824             ts_max = ts;
1825         }
1826         if (target_ts >= ts) {
1827             pos_min = pos;
1828             ts_min = ts;
1829         }
1830     }
1831
1832     pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1833     ts  = (flags & AVSEEK_FLAG_BACKWARD) ?  ts_min :  ts_max;
1834 #if 0
1835     pos_min = pos;
1836     ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1837     pos_min++;
1838     ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1839     av_dlog(s, "pos=0x%"PRIx64" %s<=%s<=%s\n",
1840             pos, av_ts2str(ts_min), av_ts2str(target_ts), av_ts2str(ts_max));
1841 #endif
1842     *ts_ret= ts;
1843     return pos;
1844 }
1845
1846 static int seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1847     int64_t pos_min, pos_max;
1848
1849     pos_min = s->data_offset;
1850     pos_max = avio_size(s->pb) - 1;
1851
1852     if     (pos < pos_min) pos= pos_min;
1853     else if(pos > pos_max) pos= pos_max;
1854
1855     avio_seek(s->pb, pos, SEEK_SET);
1856
1857     return 0;
1858 }
1859
1860 static int seek_frame_generic(AVFormatContext *s,
1861                                  int stream_index, int64_t timestamp, int flags)
1862 {
1863     int index;
1864     int64_t ret;
1865     AVStream *st;
1866     AVIndexEntry *ie;
1867
1868     st = s->streams[stream_index];
1869
1870     index = av_index_search_timestamp(st, timestamp, flags);
1871
1872     if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1873         return -1;
1874
1875     if(index < 0 || index==st->nb_index_entries-1){
1876         AVPacket pkt;
1877         int nonkey=0;
1878
1879         if(st->nb_index_entries){
1880             assert(st->index_entries);
1881             ie= &st->index_entries[st->nb_index_entries-1];
1882             if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1883                 return ret;
1884             ff_update_cur_dts(s, st, ie->timestamp);
1885         }else{
1886             if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1887                 return ret;
1888         }
1889         for (;;) {
1890             int read_status;
1891             do{
1892                 read_status = av_read_frame(s, &pkt);
1893             } while (read_status == AVERROR(EAGAIN));
1894             if (read_status < 0)
1895                 break;
1896             av_free_packet(&pkt);
1897             if(stream_index == pkt.stream_index && pkt.dts > timestamp){
1898                 if(pkt.flags & AV_PKT_FLAG_KEY)
1899                     break;
1900                 if(nonkey++ > 1000 && st->codec->codec_id != CODEC_ID_CDGRAPHICS){
1901                     av_log(s, AV_LOG_ERROR,"seek_frame_generic failed as this stream seems to contain no keyframes after the target timestamp, %d non keyframes found\n", nonkey);
1902                     break;
1903                 }
1904             }
1905         }
1906         index = av_index_search_timestamp(st, timestamp, flags);
1907     }
1908     if (index < 0)
1909         return -1;
1910
1911     ff_read_frame_flush(s);
1912     AV_NOWARN_DEPRECATED(
1913     if (s->iformat->read_seek){
1914         if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1915             return 0;
1916     }
1917     )
1918     ie = &st->index_entries[index];
1919     if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1920         return ret;
1921     ff_update_cur_dts(s, st, ie->timestamp);
1922
1923     return 0;
1924 }
1925
1926 static int seek_frame_internal(AVFormatContext *s, int stream_index,
1927                                int64_t timestamp, int flags)
1928 {
1929     int ret;
1930     AVStream *st;
1931
1932     if (flags & AVSEEK_FLAG_BYTE) {
1933         if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
1934             return -1;
1935         ff_read_frame_flush(s);
1936         return seek_frame_byte(s, stream_index, timestamp, flags);
1937     }
1938
1939     if(stream_index < 0){
1940         stream_index= av_find_default_stream_index(s);
1941         if(stream_index < 0)
1942             return -1;
1943
1944         st= s->streams[stream_index];
1945         /* timestamp for default must be expressed in AV_TIME_BASE units */
1946         timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1947     }
1948
1949     /* first, we try the format specific seek */
1950     AV_NOWARN_DEPRECATED(
1951     if (s->iformat->read_seek) {
1952         ff_read_frame_flush(s);
1953         ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1954     } else
1955         ret = -1;
1956     )
1957     if (ret >= 0) {
1958         return 0;
1959     }
1960
1961     if (s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
1962         ff_read_frame_flush(s);
1963         return ff_seek_frame_binary(s, stream_index, timestamp, flags);
1964     } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
1965         ff_read_frame_flush(s);
1966         return seek_frame_generic(s, stream_index, timestamp, flags);
1967     }
1968     else
1969         return -1;
1970 }
1971
1972 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1973 {
1974     int ret = seek_frame_internal(s, stream_index, timestamp, flags);
1975
1976     if (ret >= 0)
1977         queue_attached_pictures(s);
1978
1979     return ret;
1980 }
1981
1982 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1983 {
1984     if(min_ts > ts || max_ts < ts)
1985         return -1;
1986
1987     if (s->iformat->read_seek2) {
1988         int ret;
1989         ff_read_frame_flush(s);
1990         ret = s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1991
1992         if (ret >= 0)
1993             queue_attached_pictures(s);
1994         return ret;
1995     }
1996
1997     if(s->iformat->read_timestamp){
1998         //try to seek via read_timestamp()
1999     }
2000
2001     //Fallback to old API if new is not implemented but old is
2002     //Note the old has somewat different sematics
2003     AV_NOWARN_DEPRECATED(
2004     if (s->iformat->read_seek || 1) {
2005         int dir = (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0);
2006         int ret = av_seek_frame(s, stream_index, ts, flags | dir);
2007         if (ret<0 && ts != min_ts && max_ts != ts) {
2008             ret = av_seek_frame(s, stream_index, dir ? max_ts : min_ts, flags | dir);
2009             if (ret >= 0)
2010                 ret = av_seek_frame(s, stream_index, ts, flags | (dir^AVSEEK_FLAG_BACKWARD));
2011         }
2012         return ret;
2013     }
2014     )
2015
2016     // try some generic seek like seek_frame_generic() but with new ts semantics
2017 }
2018
2019 /*******************************************************/
2020
2021 /**
2022  * Return TRUE if the stream has accurate duration in any stream.
2023  *
2024  * @return TRUE if the stream has accurate duration for at least one component.
2025  */
2026 static int has_duration(AVFormatContext *ic)
2027 {
2028     int i;
2029     AVStream *st;
2030
2031     for(i = 0;i < ic->nb_streams; i++) {
2032         st = ic->streams[i];
2033         if (st->duration != AV_NOPTS_VALUE)
2034             return 1;
2035     }
2036     if (ic->duration != AV_NOPTS_VALUE)
2037         return 1;
2038     return 0;
2039 }
2040
2041 /**
2042  * Estimate the stream timings from the one of each components.
2043  *
2044  * Also computes the global bitrate if possible.
2045  */
2046 static void update_stream_timings(AVFormatContext *ic)
2047 {
2048     int64_t start_time, start_time1, start_time_text, end_time, end_time1;
2049     int64_t duration, duration1, filesize;
2050     int i;
2051     AVStream *st;
2052
2053     start_time = INT64_MAX;
2054     start_time_text = INT64_MAX;
2055     end_time = INT64_MIN;
2056     duration = INT64_MIN;
2057     for(i = 0;i < ic->nb_streams; i++) {
2058         st = ic->streams[i];
2059         if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
2060             start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
2061             if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codec->codec_type == AVMEDIA_TYPE_DATA) {
2062                 if (start_time1 < start_time_text)
2063                     start_time_text = start_time1;
2064             } else
2065                 start_time = FFMIN(start_time, start_time1);
2066             if (st->duration != AV_NOPTS_VALUE) {
2067                 end_time1 = start_time1
2068                           + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
2069                 end_time = FFMAX(end_time, end_time1);
2070             }
2071         }
2072         if (st->duration != AV_NOPTS_VALUE) {
2073             duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
2074             duration = FFMAX(duration, duration1);
2075         }
2076     }
2077     if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
2078         start_time = start_time_text;
2079     else if(start_time > start_time_text)
2080         av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream starttime %f\n", start_time_text / (float)AV_TIME_BASE);
2081
2082     if (start_time != INT64_MAX) {
2083         ic->start_time = start_time;
2084         if (end_time != INT64_MIN)
2085             duration = FFMAX(duration, end_time - start_time);
2086     }
2087     if (duration != INT64_MIN && ic->duration == AV_NOPTS_VALUE) {
2088         ic->duration = duration;
2089     }
2090         if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration != AV_NOPTS_VALUE) {
2091             /* compute the bitrate */
2092             ic->bit_rate = (double)filesize * 8.0 * AV_TIME_BASE /
2093                 (double)ic->duration;
2094         }
2095 }
2096
2097 static void fill_all_stream_timings(AVFormatContext *ic)
2098 {
2099     int i;
2100     AVStream *st;
2101
2102     update_stream_timings(ic);
2103     for(i = 0;i < ic->nb_streams; i++) {
2104         st = ic->streams[i];
2105         if (st->start_time == AV_NOPTS_VALUE) {
2106             if(ic->start_time != AV_NOPTS_VALUE)
2107                 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
2108             if(ic->duration != AV_NOPTS_VALUE)
2109                 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
2110         }
2111     }
2112 }
2113
2114 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
2115 {
2116     int64_t filesize, duration;
2117     int bit_rate, i;
2118     AVStream *st;
2119
2120     /* if bit_rate is already set, we believe it */
2121     if (ic->bit_rate <= 0) {
2122         bit_rate = 0;
2123         for(i=0;i<ic->nb_streams;i++) {
2124             st = ic->streams[i];
2125             if (st->codec->bit_rate > 0)
2126             bit_rate += st->codec->bit_rate;
2127         }
2128         ic->bit_rate = bit_rate;
2129     }
2130
2131     /* if duration is already set, we believe it */
2132     if (ic->duration == AV_NOPTS_VALUE &&
2133         ic->bit_rate != 0) {
2134         filesize = ic->pb ? avio_size(ic->pb) : 0;
2135         if (filesize > 0) {
2136             for(i = 0; i < ic->nb_streams; i++) {
2137                 st = ic->streams[i];
2138                 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
2139                 if (st->duration == AV_NOPTS_VALUE)
2140                     st->duration = duration;
2141             }
2142         }
2143     }
2144 }
2145
2146 #define DURATION_MAX_READ_SIZE 250000
2147 #define DURATION_MAX_RETRY 3
2148
2149 /* only usable for MPEG-PS streams */
2150 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2151 {
2152     AVPacket pkt1, *pkt = &pkt1;
2153     AVStream *st;
2154     int read_size, i, ret;
2155     int64_t end_time;
2156     int64_t filesize, offset, duration;
2157     int retry=0;
2158
2159     /* flush packet queue */
2160     flush_packet_queue(ic);
2161
2162     for (i=0; i<ic->nb_streams; i++) {
2163         st = ic->streams[i];
2164         if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
2165             av_log(st->codec, AV_LOG_WARNING, "start time is not set in estimate_timings_from_pts\n");
2166
2167         if (st->parser) {
2168             av_parser_close(st->parser);
2169             st->parser= NULL;
2170         }
2171     }
2172
2173     /* estimate the end time (duration) */
2174     /* XXX: may need to support wrapping */
2175     filesize = ic->pb ? avio_size(ic->pb) : 0;
2176     end_time = AV_NOPTS_VALUE;
2177     do{
2178         offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
2179         if (offset < 0)
2180             offset = 0;
2181
2182         avio_seek(ic->pb, offset, SEEK_SET);
2183         read_size = 0;
2184         for(;;) {
2185             if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
2186                 break;
2187
2188             do {
2189                 ret = ff_read_packet(ic, pkt);
2190             } while(ret == AVERROR(EAGAIN));
2191             if (ret != 0)
2192                 break;
2193             read_size += pkt->size;
2194             st = ic->streams[pkt->stream_index];
2195             if (pkt->pts != AV_NOPTS_VALUE &&
2196                 (st->start_time != AV_NOPTS_VALUE ||
2197                  st->first_dts  != AV_NOPTS_VALUE)) {
2198                 duration = end_time = pkt->pts;
2199                 if (st->start_time != AV_NOPTS_VALUE)
2200                     duration -= st->start_time;
2201                 else
2202                     duration -= st->first_dts;
2203                 if (duration < 0)
2204                     duration += 1LL<<st->pts_wrap_bits;
2205                 if (duration > 0) {
2206                     if (st->duration == AV_NOPTS_VALUE || st->duration < duration)
2207                         st->duration = duration;
2208                 }
2209             }
2210             av_free_packet(pkt);
2211         }
2212     }while(   end_time==AV_NOPTS_VALUE
2213            && filesize > (DURATION_MAX_READ_SIZE<<retry)
2214            && ++retry <= DURATION_MAX_RETRY);
2215
2216     fill_all_stream_timings(ic);
2217
2218     avio_seek(ic->pb, old_offset, SEEK_SET);
2219     for (i=0; i<ic->nb_streams; i++) {
2220         st= ic->streams[i];
2221         st->cur_dts= st->first_dts;
2222         st->last_IP_pts = AV_NOPTS_VALUE;
2223         st->reference_dts = AV_NOPTS_VALUE;
2224     }
2225 }
2226
2227 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2228 {
2229     int64_t file_size;
2230
2231     /* get the file size, if possible */
2232     if (ic->iformat->flags & AVFMT_NOFILE) {
2233         file_size = 0;
2234     } else {
2235         file_size = avio_size(ic->pb);
2236         file_size = FFMAX(0, file_size);
2237     }
2238
2239     if ((!strcmp(ic->iformat->name, "mpeg") ||
2240          !strcmp(ic->iformat->name, "mpegts")) &&
2241         file_size && ic->pb->seekable) {
2242         /* get accurate estimate from the PTSes */
2243         estimate_timings_from_pts(ic, old_offset);
2244         ic->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
2245     } else if (has_duration(ic)) {
2246         /* at least one component has timings - we use them for all
2247            the components */
2248         fill_all_stream_timings(ic);
2249         ic->duration_estimation_method = AVFMT_DURATION_FROM_STREAM;
2250     } else {
2251         av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2252         /* less precise: use bitrate info */
2253         estimate_timings_from_bit_rate(ic);
2254         ic->duration_estimation_method = AVFMT_DURATION_FROM_BITRATE;
2255     }
2256     update_stream_timings(ic);
2257
2258     {
2259         int i;
2260         AVStream av_unused *st;
2261         for(i = 0;i < ic->nb_streams; i++) {
2262             st = ic->streams[i];
2263             av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
2264                     (double) st->start_time / AV_TIME_BASE,
2265                     (double) st->duration   / AV_TIME_BASE);
2266         }
2267         av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2268                 (double) ic->start_time / AV_TIME_BASE,
2269                 (double) ic->duration   / AV_TIME_BASE,
2270                 ic->bit_rate / 1000);
2271     }
2272 }
2273
2274 static int has_codec_parameters(AVStream *st, const char **errmsg_ptr)
2275 {
2276     AVCodecContext *avctx = st->codec;
2277
2278 #define FAIL(errmsg) do {                                         \
2279         if (errmsg_ptr)                                           \
2280             *errmsg_ptr = errmsg;                                 \
2281         return 0;                                                 \
2282     } while (0)
2283
2284     switch (avctx->codec_type) {
2285     case AVMEDIA_TYPE_AUDIO:
2286         if (!avctx->frame_size && determinable_frame_size(avctx))
2287             FAIL("unspecified sample size");
2288         if (st->info->found_decoder >= 0 && avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
2289             FAIL("unspecified sample format");
2290         if (!avctx->sample_rate)
2291             FAIL("unspecified sample rate");
2292         if (!avctx->channels)
2293             FAIL("unspecified number of channels");
2294         break;
2295     case AVMEDIA_TYPE_VIDEO:
2296         if (!avctx->width)
2297             FAIL("unspecified size");
2298         if (st->info->found_decoder >= 0 && avctx->pix_fmt == PIX_FMT_NONE)
2299             FAIL("unspecified pixel format");
2300         break;
2301     case AVMEDIA_TYPE_DATA:
2302         if(avctx->codec_id == CODEC_ID_NONE) return 1;
2303     }
2304
2305     if (avctx->codec_id == CODEC_ID_NONE)
2306         FAIL("unknown codec");
2307     return 1;
2308 }
2309
2310 static int has_decode_delay_been_guessed(AVStream *st)
2311 {
2312     if(st->codec->codec_id != CODEC_ID_H264) return 1;
2313 #if CONFIG_H264_DECODER
2314     if(st->codec->has_b_frames &&
2315        avpriv_h264_has_num_reorder_frames(st->codec) == st->codec->has_b_frames)
2316         return 1;
2317 #endif
2318     if(st->codec->has_b_frames<3)
2319         return st->info->nb_decoded_frames >= 6;
2320     else if(st->codec->has_b_frames<4)
2321         return st->info->nb_decoded_frames >= 18;
2322     else
2323         return st->info->nb_decoded_frames >= 20;
2324 }
2325
2326 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
2327 static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **options)
2328 {
2329     AVCodec *codec;
2330     int got_picture = 1, ret = 0;
2331     AVFrame picture;
2332     AVPacket pkt = *avpkt;
2333
2334     if (!avcodec_is_open(st->codec) && !st->info->found_decoder) {
2335         AVDictionary *thread_opt = NULL;
2336
2337         codec = st->codec->codec ? st->codec->codec :
2338                                    avcodec_find_decoder(st->codec->codec_id);
2339
2340         if (!codec) {
2341             st->info->found_decoder = -1;
2342             return -1;
2343         }
2344
2345         /* force thread count to 1 since the h264 decoder will not extract SPS
2346          *  and PPS to extradata during multi-threaded decoding */
2347         av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
2348         ret = avcodec_open2(st->codec, codec, options ? options : &thread_opt);
2349         if (!options)
2350             av_dict_free(&thread_opt);
2351         if (ret < 0) {
2352             st->info->found_decoder = -1;
2353             return ret;
2354         }
2355         st->info->found_decoder = 1;
2356     } else if (!st->info->found_decoder)
2357         st->info->found_decoder = 1;
2358
2359     if (st->info->found_decoder < 0)
2360         return -1;
2361
2362     while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
2363            ret >= 0 &&
2364            (!has_codec_parameters(st, NULL)   ||
2365            !has_decode_delay_been_guessed(st) ||
2366            (!st->codec_info_nb_frames && st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF))) {
2367         got_picture = 0;
2368         avcodec_get_frame_defaults(&picture);
2369         switch(st->codec->codec_type) {
2370         case AVMEDIA_TYPE_VIDEO:
2371             ret = avcodec_decode_video2(st->codec, &picture,
2372                                         &got_picture, &pkt);
2373             break;
2374         case AVMEDIA_TYPE_AUDIO:
2375             ret = avcodec_decode_audio4(st->codec, &picture, &got_picture, &pkt);
2376             break;
2377         default:
2378             break;
2379         }
2380         if (ret >= 0) {
2381             if (got_picture)
2382                 st->info->nb_decoded_frames++;
2383             pkt.data += ret;
2384             pkt.size -= ret;
2385             ret       = got_picture;
2386         }
2387     }
2388     if(!pkt.data && !got_picture)
2389         return -1;
2390     return ret;
2391 }
2392
2393 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum CodecID id)
2394 {
2395     while (tags->id != CODEC_ID_NONE) {
2396         if (tags->id == id)
2397             return tags->tag;
2398         tags++;
2399     }
2400     return 0;
2401 }
2402
2403 enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2404 {
2405     int i;
2406     for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2407         if(tag == tags[i].tag)
2408             return tags[i].id;
2409     }
2410     for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2411         if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
2412             return tags[i].id;
2413     }
2414     return CODEC_ID_NONE;
2415 }
2416
2417 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2418 {
2419     int i;
2420     for(i=0; tags && tags[i]; i++){
2421         int tag= ff_codec_get_tag(tags[i], id);
2422         if(tag) return tag;
2423     }
2424     return 0;
2425 }
2426
2427 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2428 {
2429     int i;
2430     for(i=0; tags && tags[i]; i++){
2431         enum CodecID id= ff_codec_get_id(tags[i], tag);
2432         if(id!=CODEC_ID_NONE) return id;
2433     }
2434     return CODEC_ID_NONE;
2435 }
2436
2437 static void compute_chapters_end(AVFormatContext *s)
2438 {
2439     unsigned int i, j;
2440     int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2441
2442     for (i = 0; i < s->nb_chapters; i++)
2443         if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2444             AVChapter *ch = s->chapters[i];
2445             int64_t   end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2446                                      : INT64_MAX;
2447
2448             for (j = 0; j < s->nb_chapters; j++) {
2449                 AVChapter *ch1 = s->chapters[j];
2450                 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2451                 if (j != i && next_start > ch->start && next_start < end)
2452                     end = next_start;
2453             }
2454             ch->end = (end == INT64_MAX) ? ch->start : end;
2455         }
2456 }
2457
2458 static int get_std_framerate(int i){
2459     if(i<60*12) return (i+1)*1001;
2460     else        return ((const int[]){24,30,60,12,15,48})[i-60*12]*1000*12;
2461 }
2462
2463 /*
2464  * Is the time base unreliable.
2465  * This is a heuristic to balance between quick acceptance of the values in
2466  * the headers vs. some extra checks.
2467  * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2468  * MPEG-2 commonly misuses field repeat flags to store different framerates.
2469  * And there are "variable" fps files this needs to detect as well.
2470  */
2471 static int tb_unreliable(AVCodecContext *c){
2472     if(   c->time_base.den >= 101L*c->time_base.num
2473        || c->time_base.den <    5L*c->time_base.num
2474 /*       || c->codec_tag == AV_RL32("DIVX")
2475        || c->codec_tag == AV_RL32("XVID")*/
2476        || c->codec_id == CODEC_ID_MPEG2VIDEO
2477        || c->codec_id == CODEC_ID_H264
2478        )
2479         return 1;
2480     return 0;
2481 }
2482
2483 #if FF_API_FORMAT_PARAMETERS
2484 int av_find_stream_info(AVFormatContext *ic)
2485 {
2486     return avformat_find_stream_info(ic, NULL);
2487 }
2488 #endif
2489
2490 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
2491 {
2492     int i, count, ret, read_size, j;
2493     AVStream *st;
2494     AVPacket pkt1, *pkt;
2495     int64_t old_offset = avio_tell(ic->pb);
2496     int orig_nb_streams = ic->nb_streams;        // new streams might appear, no options for those
2497     int flush_codecs = ic->probesize > 0;
2498
2499     if(ic->pb)
2500         av_log(ic, AV_LOG_DEBUG, "File position before avformat_find_stream_info() is %"PRId64"\n", avio_tell(ic->pb));
2501
2502     for(i=0;i<ic->nb_streams;i++) {
2503         AVCodec *codec;
2504         AVDictionary *thread_opt = NULL;
2505         st = ic->streams[i];
2506
2507         if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2508             st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2509 /*            if(!st->time_base.num)
2510                 st->time_base= */
2511             if(!st->codec->time_base.num)
2512                 st->codec->time_base= st->time_base;
2513         }
2514         //only for the split stuff
2515         if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2516             st->parser = av_parser_init(st->codec->codec_id);
2517             if(st->parser){
2518                 if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
2519                     st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2520                 } else if(st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
2521                     st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
2522                 }
2523             } else if (st->need_parsing) {
2524                 av_log(ic, AV_LOG_VERBOSE, "parser not found for codec "
2525                        "%s, packets or times may be invalid.\n",
2526                        avcodec_get_name(st->codec->codec_id));
2527             }
2528         }
2529         codec = st->codec->codec ? st->codec->codec :
2530                                    avcodec_find_decoder(st->codec->codec_id);
2531
2532         /* force thread count to 1 since the h264 decoder will not extract SPS
2533          *  and PPS to extradata during multi-threaded decoding */
2534         av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
2535
2536         /* Ensure that subtitle_header is properly set. */
2537         if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2538             && codec && !st->codec->codec)
2539             avcodec_open2(st->codec, codec, options ? &options[i]
2540                               : &thread_opt);
2541
2542         //try to just open decoders, in case this is enough to get parameters
2543         if (!has_codec_parameters(st, NULL)) {
2544             if (codec && !st->codec->codec)
2545                 avcodec_open2(st->codec, codec, options ? &options[i]
2546                               : &thread_opt);
2547         }
2548         if (!options)
2549             av_dict_free(&thread_opt);
2550     }
2551
2552     for (i=0; i<ic->nb_streams; i++) {
2553         ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2554     }
2555
2556     count = 0;
2557     read_size = 0;
2558     for(;;) {
2559         if (ff_check_interrupt(&ic->interrupt_callback)){
2560             ret= AVERROR_EXIT;
2561             av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2562             break;
2563         }
2564
2565         /* check if one codec still needs to be handled */
2566         for(i=0;i<ic->nb_streams;i++) {
2567             int fps_analyze_framecount = 20;
2568
2569             st = ic->streams[i];
2570             if (!has_codec_parameters(st, NULL))
2571                 break;
2572             /* if the timebase is coarse (like the usual millisecond precision
2573                of mkv), we need to analyze more frames to reliably arrive at
2574                the correct fps */
2575             if (av_q2d(st->time_base) > 0.0005)
2576                 fps_analyze_framecount *= 2;
2577             if (ic->fps_probe_size >= 0)
2578                 fps_analyze_framecount = ic->fps_probe_size;
2579             /* variable fps and no guess at the real fps */
2580             if(   tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2581                && st->info->duration_count < fps_analyze_framecount
2582                && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2583                 break;
2584             if(st->parser && st->parser->parser->split && !st->codec->extradata)
2585                 break;
2586             if (st->first_dts == AV_NOPTS_VALUE &&
2587                 (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2588                  st->codec->codec_type == AVMEDIA_TYPE_AUDIO))
2589                 break;
2590         }
2591         if (i == ic->nb_streams) {
2592             /* NOTE: if the format has no header, then we need to read
2593                some packets to get most of the streams, so we cannot
2594                stop here */
2595             if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2596                 /* if we found the info for all the codecs, we can stop */
2597                 ret = count;
2598                 av_log(ic, AV_LOG_DEBUG, "All info found\n");
2599                 flush_codecs = 0;
2600                 break;
2601             }
2602         }
2603         /* we did not get all the codec info, but we read too much data */
2604         if (read_size >= ic->probesize) {
2605             ret = count;
2606             av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2607             for (i = 0; i < ic->nb_streams; i++)
2608                 if (!ic->streams[i]->r_frame_rate.num &&
2609                     ic->streams[i]->info->duration_count <= 1)
2610                     av_log(ic, AV_LOG_WARNING,
2611                            "Stream #%d: not enough frames to estimate rate; "
2612                            "consider increasing probesize\n", i);
2613             break;
2614         }
2615
2616         /* NOTE: a new stream can be added there if no header in file
2617            (AVFMTCTX_NOHEADER) */
2618         ret = read_frame_internal(ic, &pkt1);
2619         if (ret == AVERROR(EAGAIN))
2620             continue;
2621
2622         if (ret < 0) {
2623             /* EOF or error*/
2624             break;
2625         }
2626
2627         pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2628         if ((ret = av_dup_packet(pkt)) < 0)
2629             goto find_stream_info_err;
2630
2631         read_size += pkt->size;
2632
2633         st = ic->streams[pkt->stream_index];
2634         if (st->codec_info_nb_frames>1) {
2635             int64_t t=0;
2636             if (st->time_base.den > 0)
2637                 t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
2638             if (st->avg_frame_rate.num > 0)
2639                 t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, (AVRational){st->avg_frame_rate.den, st->avg_frame_rate.num}, AV_TIME_BASE_Q));
2640
2641             if (t >= ic->max_analyze_duration) {
2642                 av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached at %"PRId64"\n", ic->max_analyze_duration, t);
2643                 break;
2644             }
2645             st->info->codec_info_duration += pkt->duration;
2646         }
2647         {
2648             int64_t last = st->info->last_dts;
2649
2650             if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && pkt->dts > last){
2651                 double dts= (is_relative(pkt->dts) ?  pkt->dts - RELATIVE_TS_BASE : pkt->dts) * av_q2d(st->time_base);
2652                 int64_t duration= pkt->dts - last;
2653
2654 //                 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2655 //                     av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
2656                 for (i=0; i<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); i++) {
2657                     int framerate= get_std_framerate(i);
2658                     double sdts= dts*framerate/(1001*12);
2659                     for(j=0; j<2; j++){
2660                         int ticks= lrintf(sdts+j*0.5);
2661                         double error= sdts - ticks + j*0.5;
2662                         st->info->duration_error[j][0][i] += error;
2663                         st->info->duration_error[j][1][i] += error*error;
2664                     }
2665                 }
2666                 st->info->duration_count++;
2667                 // ignore the first 4 values, they might have some random jitter
2668                 if (st->info->duration_count > 3)
2669                     st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2670             }
2671             if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2672                 st->info->last_dts = pkt->dts;
2673         }
2674         if(st->parser && st->parser->parser->split && !st->codec->extradata){
2675             int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2676             if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) {
2677                 st->codec->extradata_size= i;
2678                 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2679                 if (!st->codec->extradata)
2680                     return AVERROR(ENOMEM);
2681                 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2682                 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2683             }
2684         }
2685
2686         /* if still no information, we try to open the codec and to
2687            decompress the frame. We try to avoid that in most cases as
2688            it takes longer and uses more memory. For MPEG-4, we need to
2689            decompress for QuickTime.
2690
2691            If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
2692            least one frame of codec data, this makes sure the codec initializes
2693            the channel configuration and does not only trust the values from the container.
2694         */
2695         try_decode_frame(st, pkt, (options && i < orig_nb_streams ) ? &options[i] : NULL);
2696
2697         st->codec_info_nb_frames++;
2698         count++;
2699     }
2700
2701     if (flush_codecs) {
2702         AVPacket empty_pkt = { 0 };
2703         int err = 0;
2704         av_init_packet(&empty_pkt);
2705
2706         ret = -1; /* we could not have all the codec parameters before EOF */
2707         for(i=0;i<ic->nb_streams;i++) {
2708             const char *errmsg;
2709
2710             st = ic->streams[i];
2711
2712             /* flush the decoders */
2713             if (st->info->found_decoder == 1) {
2714                 do {
2715                     err = try_decode_frame(st, &empty_pkt,
2716                                             (options && i < orig_nb_streams) ?
2717                                             &options[i] : NULL);
2718                 } while (err > 0 && !has_codec_parameters(st, NULL));
2719
2720                 if (err < 0) {
2721                     av_log(ic, AV_LOG_INFO,
2722                         "decoding for stream %d failed\n", st->index);
2723                 }
2724             }
2725
2726             if (!has_codec_parameters(st, &errmsg)) {
2727                 char buf[256];
2728                 avcodec_string(buf, sizeof(buf), st->codec, 0);
2729                 av_log(ic, AV_LOG_WARNING,
2730                        "Could not find codec parameters for stream %d (%s): %s\n"
2731                        "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
2732                        i, buf, errmsg);
2733             } else {
2734                 ret = 0;
2735             }
2736         }
2737     }
2738
2739     // close codecs which were opened in try_decode_frame()
2740     for(i=0;i<ic->nb_streams;i++) {
2741         st = ic->streams[i];
2742         avcodec_close(st->codec);
2743     }
2744     for(i=0;i<ic->nb_streams;i++) {
2745         st = ic->streams[i];
2746         if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2747             if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample){
2748                 uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2749                 if(ff_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt)
2750                     st->codec->codec_tag= tag;
2751             }
2752
2753             if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2754                 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2755                           (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2756                           st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2757             // the check for tb_unreliable() is not completely correct, since this is not about handling
2758             // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2759             // ipmovie.c produces.
2760             if (tb_unreliable(st->codec) && st->info->duration_count > 15 && st->info->duration_gcd > FFMAX(1, st->time_base.den/(500LL*st->time_base.num)) && !st->r_frame_rate.num)
2761                 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, st->time_base.den, st->time_base.num * st->info->duration_gcd, INT_MAX);
2762             if (st->info->duration_count && !st->r_frame_rate.num
2763                && tb_unreliable(st->codec) /*&&
2764                //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2765                st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2766                 int num = 0;
2767                 double best_error= 0.01;
2768
2769                 for (j=0; j<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); j++) {
2770                     int k;
2771
2772                     if(st->info->codec_info_duration && st->info->codec_info_duration*av_q2d(st->time_base) < (1001*12.0)/get_std_framerate(j))
2773                         continue;
2774                     if(!st->info->codec_info_duration && 1.0 < (1001*12.0)/get_std_framerate(j))
2775                         continue;
2776                     for(k=0; k<2; k++){
2777                         int n= st->info->duration_count;
2778                         double a= st->info->duration_error[k][0][j] / n;
2779                         double error= st->info->duration_error[k][1][j]/n - a*a;
2780
2781                         if(error < best_error && best_error> 0.000000001){
2782                             best_error= error;
2783                             num = get_std_framerate(j);
2784                         }
2785                         if(error < 0.02)
2786                             av_log(NULL, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
2787                     }
2788                 }
2789                 // do not increase frame rate by more than 1 % in order to match a standard rate.
2790                 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2791                     av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2792             }
2793
2794             if (!st->r_frame_rate.num){
2795                 if(    st->codec->time_base.den * (int64_t)st->time_base.num
2796                     <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2797                     st->r_frame_rate.num = st->codec->time_base.den;
2798                     st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2799                 }else{
2800                     st->r_frame_rate.num = st->time_base.den;
2801                     st->r_frame_rate.den = st->time_base.num;
2802                 }
2803             }
2804         }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2805             if(!st->codec->bits_per_coded_sample)
2806                 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2807             // set stream disposition based on audio service type
2808             switch (st->codec->audio_service_type) {
2809             case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2810                 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS;    break;
2811             case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2812                 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED;  break;
2813             case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2814                 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2815             case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2816                 st->disposition = AV_DISPOSITION_COMMENT;          break;
2817             case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2818                 st->disposition = AV_DISPOSITION_KARAOKE;          break;
2819             }
2820         }
2821     }
2822
2823     if(ic->probesize)
2824     estimate_timings(ic, old_offset);
2825
2826     compute_chapters_end(ic);
2827
2828  find_stream_info_err:
2829     for (i=0; i < ic->nb_streams; i++) {
2830         if (ic->streams[i]->codec)
2831             ic->streams[i]->codec->thread_count = 0;
2832         av_freep(&ic->streams[i]->info);
2833     }
2834     if(ic->pb)
2835         av_log(ic, AV_LOG_DEBUG, "File position after avformat_find_stream_info() is %"PRId64"\n", avio_tell(ic->pb));
2836     return ret;
2837 }
2838
2839 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
2840 {
2841     int i, j;
2842
2843     for (i = 0; i < ic->nb_programs; i++) {
2844         if (ic->programs[i] == last) {
2845             last = NULL;
2846         } else {
2847             if (!last)
2848                 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2849                     if (ic->programs[i]->stream_index[j] == s)
2850                         return ic->programs[i];
2851         }
2852     }
2853     return NULL;
2854 }
2855
2856 int av_find_best_stream(AVFormatContext *ic,
2857                         enum AVMediaType type,
2858                         int wanted_stream_nb,
2859                         int related_stream,
2860                         AVCodec **decoder_ret,
2861                         int flags)
2862 {
2863     int i, nb_streams = ic->nb_streams;
2864     int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2865     unsigned *program = NULL;
2866     AVCodec *decoder = NULL, *best_decoder = NULL;
2867
2868     if (related_stream >= 0 && wanted_stream_nb < 0) {
2869         AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
2870         if (p) {
2871             program = p->stream_index;
2872             nb_streams = p->nb_stream_indexes;
2873         }
2874     }
2875     for (i = 0; i < nb_streams; i++) {
2876         int real_stream_index = program ? program[i] : i;
2877         AVStream *st = ic->streams[real_stream_index];
2878         AVCodecContext *avctx = st->codec;
2879         if (avctx->codec_type != type)
2880             continue;
2881         if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2882             continue;
2883         if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2884             continue;
2885         if (decoder_ret) {
2886             decoder = avcodec_find_decoder(st->codec->codec_id);
2887             if (!decoder) {
2888                 if (ret < 0)
2889                     ret = AVERROR_DECODER_NOT_FOUND;
2890                 continue;
2891             }
2892         }
2893         if (best_count >= st->codec_info_nb_frames)
2894             continue;
2895         best_count = st->codec_info_nb_frames;
2896         ret = real_stream_index;
2897         best_decoder = decoder;
2898         if (program && i == nb_streams - 1 && ret < 0) {
2899             program = NULL;
2900             nb_streams = ic->nb_streams;
2901             i = 0; /* no related stream found, try again with everything */
2902         }
2903     }
2904     if (decoder_ret)
2905         *decoder_ret = best_decoder;
2906     return ret;
2907 }
2908
2909 /*******************************************************/
2910
2911 int av_read_play(AVFormatContext *s)
2912 {
2913     if (s->iformat->read_play)
2914         return s->iformat->read_play(s);
2915     if (s->pb)
2916         return avio_pause(s->pb, 0);
2917     return AVERROR(ENOSYS);
2918 }
2919
2920 int av_read_pause(AVFormatContext *s)
2921 {
2922     if (s->iformat->read_pause)
2923         return s->iformat->read_pause(s);
2924     if (s->pb)
2925         return avio_pause(s->pb, 1);
2926     return AVERROR(ENOSYS);
2927 }
2928
2929 void avformat_free_context(AVFormatContext *s)
2930 {
2931     int i;
2932     AVStream *st;
2933
2934     av_opt_free(s);
2935     if (s->iformat && s->iformat->priv_class && s->priv_data)
2936         av_opt_free(s->priv_data);
2937
2938     for(i=0;i<s->nb_streams;i++) {
2939         /* free all data in a stream component */
2940         st = s->streams[i];
2941         if (st->parser) {
2942             av_parser_close(st->parser);
2943         }
2944         if (st->attached_pic.data)
2945             av_free_packet(&st->attached_pic);
2946         av_dict_free(&st->metadata);
2947         av_freep(&st->index_entries);
2948         av_freep(&st->codec->extradata);
2949         av_freep(&st->codec->subtitle_header);
2950         av_freep(&st->codec);
2951         av_freep(&st->priv_data);
2952         av_freep(&st->info);
2953         av_freep(&st);
2954     }
2955     for(i=s->nb_programs-1; i>=0; i--) {
2956         av_dict_free(&s->programs[i]->metadata);
2957         av_freep(&s->programs[i]->stream_index);
2958         av_freep(&s->programs[i]);
2959     }
2960     av_freep(&s->programs);
2961     av_freep(&s->priv_data);
2962     while(s->nb_chapters--) {
2963         av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2964         av_freep(&s->chapters[s->nb_chapters]);
2965     }
2966     av_freep(&s->chapters);
2967     av_dict_free(&s->metadata);
2968     av_freep(&s->streams);
2969     av_free(s);
2970 }
2971
2972 #if FF_API_CLOSE_INPUT_FILE
2973 void av_close_input_file(AVFormatContext *s)
2974 {
2975     avformat_close_input(&s);
2976 }
2977 #endif
2978
2979 void avformat_close_input(AVFormatContext **ps)
2980 {
2981     AVFormatContext *s = *ps;
2982     AVIOContext *pb = (s->iformat && (s->iformat->flags & AVFMT_NOFILE)) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
2983                        NULL : s->pb;
2984     flush_packet_queue(s);
2985     if (s->iformat && (s->iformat->read_close))
2986         s->iformat->read_close(s);
2987     avformat_free_context(s);
2988     *ps = NULL;
2989     if (pb)
2990         avio_close(pb);
2991 }
2992
2993 #if FF_API_NEW_STREAM
2994 AVStream *av_new_stream(AVFormatContext *s, int id)
2995 {
2996     AVStream *st = avformat_new_stream(s, NULL);
2997     if (st)
2998         st->id = id;
2999     return st;
3000 }
3001 #endif
3002
3003 AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)
3004 {
3005     AVStream *st;
3006     int i;
3007     AVStream **streams;
3008
3009     if (s->nb_streams >= INT_MAX/sizeof(*streams))
3010         return NULL;
3011     streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
3012     if (!streams)
3013         return NULL;
3014     s->streams = streams;
3015
3016     st = av_mallocz(sizeof(AVStream));
3017     if (!st)
3018         return NULL;
3019     if (!(st->info = av_mallocz(sizeof(*st->info)))) {
3020         av_free(st);
3021         return NULL;
3022     }
3023     st->info->last_dts = AV_NOPTS_VALUE;
3024
3025     st->codec = avcodec_alloc_context3(c);
3026     if (s->iformat) {
3027         /* no default bitrate if decoding */
3028         st->codec->bit_rate = 0;
3029     }
3030     st->index = s->nb_streams;
3031     st->start_time = AV_NOPTS_VALUE;
3032     st->duration = AV_NOPTS_VALUE;
3033         /* we set the current DTS to 0 so that formats without any timestamps
3034            but durations get some timestamps, formats with some unknown
3035            timestamps have their first few packets buffered and the
3036            timestamps corrected before they are returned to the user */
3037     st->cur_dts = s->iformat ? RELATIVE_TS_BASE : 0;
3038     st->first_dts = AV_NOPTS_VALUE;
3039     st->probe_packets = MAX_PROBE_PACKETS;
3040
3041     /* default pts setting is MPEG-like */
3042     avpriv_set_pts_info(st, 33, 1, 90000);
3043     st->last_IP_pts = AV_NOPTS_VALUE;
3044     for(i=0; i<MAX_REORDER_DELAY+1; i++)
3045         st->pts_buffer[i]= AV_NOPTS_VALUE;
3046     st->reference_dts = AV_NOPTS_VALUE;
3047
3048     st->sample_aspect_ratio = (AVRational){0,1};
3049
3050     s->streams[s->nb_streams++] = st;
3051     return st;
3052 }
3053
3054 AVProgram *av_new_program(AVFormatContext *ac, int id)
3055 {
3056     AVProgram *program=NULL;
3057     int i;
3058
3059     av_dlog(ac, "new_program: id=0x%04x\n", id);
3060
3061     for(i=0; i<ac->nb_programs; i++)
3062         if(ac->programs[i]->id == id)
3063             program = ac->programs[i];
3064
3065     if(!program){
3066         program = av_mallocz(sizeof(AVProgram));
3067         if (!program)
3068             return NULL;
3069         dynarray_add(&ac->programs, &ac->nb_programs, program);
3070         program->discard = AVDISCARD_NONE;
3071     }
3072     program->id = id;
3073
3074     return program;
3075 }
3076
3077 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
3078 {
3079     AVChapter *chapter = NULL;
3080     int i;
3081
3082     for(i=0; i<s->nb_chapters; i++)
3083         if(s->chapters[i]->id == id)
3084             chapter = s->chapters[i];
3085
3086     if(!chapter){
3087         chapter= av_mallocz(sizeof(AVChapter));
3088         if(!chapter)
3089             return NULL;
3090         dynarray_add(&s->chapters, &s->nb_chapters, chapter);
3091     }
3092     av_dict_set(&chapter->metadata, "title", title, 0);
3093     chapter->id    = id;
3094     chapter->time_base= time_base;
3095     chapter->start = start;
3096     chapter->end   = end;
3097
3098     return chapter;
3099 }
3100
3101 /************************************************************/
3102 /* output media file */
3103
3104 int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat,
3105                                    const char *format, const char *filename)
3106 {
3107     AVFormatContext *s = avformat_alloc_context();
3108     int ret = 0;
3109
3110     *avctx = NULL;
3111     if (!s)
3112         goto nomem;
3113
3114     if (!oformat) {
3115         if (format) {
3116             oformat = av_guess_format(format, NULL, NULL);
3117             if (!oformat) {
3118                 av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not a suitable output format\n", format);
3119                 ret = AVERROR(EINVAL);
3120                 goto error;
3121             }
3122         } else {
3123             oformat = av_guess_format(NULL, filename, NULL);
3124             if (!oformat) {
3125                 ret = AVERROR(EINVAL);
3126                 av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n",
3127                        filename);
3128                 goto error;
3129             }
3130         }
3131     }
3132
3133     s->oformat = oformat;
3134     if (s->oformat->priv_data_size > 0) {
3135         s->priv_data = av_mallocz(s->oformat->priv_data_size);
3136         if (!s->priv_data)
3137             goto nomem;
3138         if (s->oformat->priv_class) {
3139             *(const AVClass**)s->priv_data= s->oformat->priv_class;
3140             av_opt_set_defaults(s->priv_data);
3141         }
3142     } else
3143         s->priv_data = NULL;
3144
3145     if (filename)
3146         av_strlcpy(s->filename, filename, sizeof(s->filename));
3147     *avctx = s;
3148     return 0;
3149 nomem:
3150     av_log(s, AV_LOG_ERROR, "Out of memory\n");
3151     ret = AVERROR(ENOMEM);
3152 error:
3153     avformat_free_context(s);
3154     return ret;
3155 }
3156
3157 #if FF_API_ALLOC_OUTPUT_CONTEXT
3158 AVFormatContext *avformat_alloc_output_context(const char *format,
3159                                                AVOutputFormat *oformat, const char *filename)
3160 {
3161     AVFormatContext *avctx;
3162     int ret = avformat_alloc_output_context2(&avctx, oformat, format, filename);
3163     return ret < 0 ? NULL : avctx;
3164 }
3165 #endif
3166
3167 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
3168 {
3169     const AVCodecTag *avctag;
3170     int n;
3171     enum CodecID id = CODEC_ID_NONE;
3172     unsigned int tag = 0;
3173
3174     /**
3175      * Check that tag + id is in the table
3176      * If neither is in the table -> OK
3177      * If tag is in the table with another id -> FAIL
3178      * If id is in the table with another tag -> FAIL unless strict < normal
3179      */
3180     for (n = 0; s->oformat->codec_tag[n]; n++) {
3181         avctag = s->oformat->codec_tag[n];
3182         while (avctag->id != CODEC_ID_NONE) {
3183             if (avpriv_toupper4(avctag->tag) == avpriv_toupper4(st->codec->codec_tag)) {
3184                 id = avctag->id;
3185                 if (id == st->codec->codec_id)
3186                     return 1;
3187             }
3188             if (avctag->id == st->codec->codec_id)
3189                 tag = avctag->tag;
3190             avctag++;
3191         }
3192     }
3193     if (id != CODEC_ID_NONE)
3194         return 0;
3195     if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
3196         return 0;
3197     return 1;
3198 }
3199
3200 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
3201 {
3202     int ret = 0, i;
3203     AVStream *st;
3204     AVDictionary *tmp = NULL;
3205
3206     if (options)
3207         av_dict_copy(&tmp, *options, 0);
3208     if ((ret = av_opt_set_dict(s, &tmp)) < 0)
3209         goto fail;
3210     if (s->priv_data && s->oformat->priv_class && *(const AVClass**)s->priv_data==s->oformat->priv_class &&
3211         (ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3212         goto fail;
3213
3214     // some sanity checks
3215     if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
3216         av_log(s, AV_LOG_ERROR, "no streams\n");
3217         ret = AVERROR(EINVAL);
3218         goto fail;
3219     }
3220
3221     for(i=0;i<s->nb_streams;i++) {
3222         st = s->streams[i];
3223
3224         switch (st->codec->codec_type) {
3225         case AVMEDIA_TYPE_AUDIO:
3226             if(st->codec->sample_rate<=0){
3227                 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
3228                 ret = AVERROR(EINVAL);
3229                 goto fail;
3230             }
3231             if(!st->codec->block_align)
3232                 st->codec->block_align = st->codec->channels *
3233                     av_get_bits_per_sample(st->codec->codec_id) >> 3;
3234             break;
3235         case AVMEDIA_TYPE_VIDEO:
3236             if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
3237                 av_log(s, AV_LOG_ERROR, "time base not set\n");
3238                 ret = AVERROR(EINVAL);
3239                 goto fail;
3240             }
3241             if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
3242                 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
3243                 ret = AVERROR(EINVAL);
3244                 goto fail;
3245             }
3246             if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)
3247                && FFABS(av_q2d(st->sample_aspect_ratio) - av_q2d(st->codec->sample_aspect_ratio)) > 0.004*av_q2d(st->sample_aspect_ratio)
3248             ){
3249                 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between muxer "
3250                        "(%d/%d) and encoder layer (%d/%d)\n",
3251                        st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3252                        st->codec->sample_aspect_ratio.num,
3253                        st->codec->sample_aspect_ratio.den);
3254                 ret = AVERROR(EINVAL);
3255                 goto fail;
3256             }
3257             break;
3258         }
3259
3260         if(s->oformat->codec_tag){
3261             if(   st->codec->codec_tag
3262                && st->codec->codec_id == CODEC_ID_RAWVIDEO
3263                && (av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id) == 0 || av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id) ==MKTAG('r', 'a', 'w', ' '))
3264                && !validate_codec_tag(s, st)){
3265                 //the current rawvideo encoding system ends up setting the wrong codec_tag for avi/mov, we override it here
3266                 st->codec->codec_tag= 0;
3267             }
3268             if(st->codec->codec_tag){
3269                 if (!validate_codec_tag(s, st)) {
3270                     char tagbuf[32], cortag[32];
3271                     av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
3272                     av_get_codec_tag_string(cortag, sizeof(cortag), av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id));
3273                     av_log(s, AV_LOG_ERROR,
3274                            "Tag %s/0x%08x incompatible with output codec id '%d' (%s)\n",
3275                            tagbuf, st->codec->codec_tag, st->codec->codec_id, cortag);
3276                     ret = AVERROR_INVALIDDATA;
3277                     goto fail;
3278                 }
3279             }else
3280                 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
3281         }
3282
3283         if(s->oformat->flags & AVFMT_GLOBALHEADER &&
3284             !(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
3285           av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
3286     }
3287
3288     if (!s->priv_data && s->oformat->priv_data_size > 0) {
3289         s->priv_data = av_mallocz(s->oformat->priv_data_size);
3290         if (!s->priv_data) {
3291             ret = AVERROR(ENOMEM);
3292             goto fail;
3293         }
3294         if (s->oformat->priv_class) {
3295             *(const AVClass**)s->priv_data= s->oformat->priv_class;
3296             av_opt_set_defaults(s->priv_data);
3297             if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
3298                 goto fail;
3299         }
3300     }
3301
3302     /* set muxer identification string */
3303     if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
3304         av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
3305     }
3306
3307     if(s->oformat->write_header){
3308         ret = s->oformat->write_header(s);
3309         if (ret < 0)
3310             goto fail;
3311     }
3312
3313     /* init PTS generation */
3314     for(i=0;i<s->nb_streams;i++) {
3315         int64_t den = AV_NOPTS_VALUE;
3316         st = s->streams[i];
3317
3318         switch (st->codec->codec_type) {
3319         case AVMEDIA_TYPE_AUDIO:
3320             den = (int64_t)st->time_base.num * st->codec->sample_rate;
3321             break;
3322         case AVMEDIA_TYPE_VIDEO:
3323             den = (int64_t)st->time_base.num * st->codec->time_base.den;
3324             break;
3325         default:
3326             break;
3327         }
3328         if (den != AV_NOPTS_VALUE) {
3329             if (den <= 0) {
3330                 ret = AVERROR_INVALIDDATA;
3331                 goto fail;
3332             }
3333             frac_init(&st->pts, 0, 0, den);
3334         }
3335     }
3336
3337     if (options) {
3338         av_dict_free(options);
3339         *options = tmp;
3340     }
3341     return 0;
3342 fail:
3343     av_dict_free(&tmp);
3344     return ret;
3345 }
3346
3347 //FIXME merge with compute_pkt_fields
3348 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
3349     int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
3350     int num, den, frame_size, i;
3351
3352     av_dlog(s, "compute_pkt_fields2: pts:%s dts:%s cur_dts:%s b:%d size:%d st:%d\n",
3353             av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts), delay, pkt->size, pkt->stream_index);
3354
3355     /* duration field */
3356     if (pkt->duration == 0) {
3357         compute_frame_duration(&num, &den, st, NULL, pkt);
3358         if (den && num) {
3359             pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
3360         }
3361     }
3362
3363     if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
3364         pkt->pts= pkt->dts;
3365
3366     //XXX/FIXME this is a temporary hack until all encoders output pts
3367     if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
3368         static int warned;
3369         if (!warned) {
3370             av_log(s, AV_LOG_WARNING, "Encoder did not produce proper pts, making some up.\n");
3371             warned = 1;
3372         }
3373         pkt->dts=
3374 //        pkt->pts= st->cur_dts;
3375         pkt->pts= st->pts.val;
3376     }
3377
3378     //calculate dts from pts
3379     if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
3380         st->pts_buffer[0]= pkt->pts;
3381         for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
3382             st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
3383         for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
3384             FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
3385
3386         pkt->dts= st->pts_buffer[0];
3387     }
3388
3389     if (st->cur_dts && st->cur_dts != AV_NOPTS_VALUE &&
3390         ((!(s->oformat->flags & AVFMT_TS_NONSTRICT) &&
3391           st->cur_dts >= pkt->dts) || st->cur_dts > pkt->dts)) {
3392         av_log(s, AV_LOG_ERROR,
3393                "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %s >= %s\n",
3394                st->index, av_ts2str(st->cur_dts), av_ts2str(pkt->dts));
3395         return AVERROR(EINVAL);
3396     }
3397     if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
3398         av_log(s, AV_LOG_ERROR, "pts (%s) < dts (%s) in stream %d\n",
3399                av_ts2str(pkt->pts), av_ts2str(pkt->dts), st->index);
3400         return AVERROR(EINVAL);
3401     }
3402
3403 //    av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%s dts2:%s\n", av_ts2str(pkt->pts), av_ts2str(pkt->dts));
3404     st->cur_dts= pkt->dts;
3405     st->pts.val= pkt->dts;
3406
3407     /* update pts */
3408     switch (st->codec->codec_type) {
3409     case AVMEDIA_TYPE_AUDIO:
3410         frame_size = get_audio_frame_size(st->codec, pkt->size, 1);
3411
3412         /* HACK/FIXME, we skip the initial 0 size packets as they are most
3413            likely equal to the encoder delay, but it would be better if we
3414            had the real timestamps from the encoder */
3415         if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3416             frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3417         }
3418         break;
3419     case AVMEDIA_TYPE_VIDEO:
3420         frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3421         break;
3422     default:
3423         break;
3424     }
3425     return 0;
3426 }
3427
3428 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3429 {
3430     int ret;
3431
3432     if (!pkt) {
3433         if (s->oformat->flags & AVFMT_ALLOW_FLUSH)
3434             return s->oformat->write_packet(s, pkt);
3435         return 1;
3436     }
3437
3438     ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3439
3440     if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3441         return ret;
3442
3443     ret= s->oformat->write_packet(s, pkt);
3444
3445     if (ret >= 0)
3446         s->streams[pkt->stream_index]->nb_frames++;
3447     return ret;
3448 }
3449
3450 #define CHUNK_START 0x1000
3451
3452 int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3453                               int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3454 {
3455     AVPacketList **next_point, *this_pktl;
3456     AVStream *st= s->streams[pkt->stream_index];
3457     int chunked= s->max_chunk_size || s->max_chunk_duration;
3458
3459     this_pktl = av_mallocz(sizeof(AVPacketList));
3460     if (!this_pktl)
3461         return AVERROR(ENOMEM);
3462     this_pktl->pkt= *pkt;
3463     pkt->destruct= NULL;             // do not free original but only the copy
3464     av_dup_packet(&this_pktl->pkt);  // duplicate the packet if it uses non-alloced memory
3465
3466     if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3467         next_point = &(st->last_in_packet_buffer->next);
3468     }else{
3469         next_point = &s->packet_buffer;
3470     }
3471
3472     if(*next_point){
3473         if(chunked){
3474             uint64_t max= av_rescale_q(s->max_chunk_duration, AV_TIME_BASE_Q, st->time_base);
3475             if(   st->interleaver_chunk_size     + pkt->size     <= s->max_chunk_size-1U
3476                && st->interleaver_chunk_duration + pkt->duration <= max-1U){
3477                 st->interleaver_chunk_size     += pkt->size;
3478                 st->interleaver_chunk_duration += pkt->duration;
3479                 goto next_non_null;
3480             }else{
3481                 st->interleaver_chunk_size     =
3482                 st->interleaver_chunk_duration = 0;
3483                 this_pktl->pkt.flags |= CHUNK_START;
3484             }
3485         }
3486
3487         if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3488             while(   *next_point
3489                   && ((chunked && !((*next_point)->pkt.flags&CHUNK_START))
3490                       || !compare(s, &(*next_point)->pkt, pkt))){
3491                 next_point= &(*next_point)->next;
3492             }
3493             if(*next_point)
3494                 goto next_non_null;
3495         }else{
3496             next_point = &(s->packet_buffer_end->next);
3497         }
3498     }
3499     assert(!*next_point);
3500
3501     s->packet_buffer_end= this_pktl;
3502 next_non_null:
3503
3504     this_pktl->next= *next_point;
3505
3506     s->streams[pkt->stream_index]->last_in_packet_buffer=
3507     *next_point= this_pktl;
3508     return 0;
3509 }
3510
3511 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3512 {
3513     AVStream *st = s->streams[ pkt ->stream_index];
3514     AVStream *st2= s->streams[ next->stream_index];
3515     int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3516                              st->time_base);
3517     if(s->audio_preload && ((st->codec->codec_type == AVMEDIA_TYPE_AUDIO) != (st2->codec->codec_type == AVMEDIA_TYPE_AUDIO))){
3518         int64_t ts = av_rescale_q(pkt ->dts, st ->time_base, AV_TIME_BASE_Q) - s->audio_preload*(st ->codec->codec_type == AVMEDIA_TYPE_AUDIO);
3519         int64_t ts2= av_rescale_q(next->dts, st2->time_base, AV_TIME_BASE_Q) - s->audio_preload*(st2->codec->codec_type == AVMEDIA_TYPE_AUDIO);
3520         if(ts == ts2){
3521             ts= ( pkt ->dts* st->time_base.num*AV_TIME_BASE - s->audio_preload*(int64_t)(st ->codec->codec_type == AVMEDIA_TYPE_AUDIO)* st->time_base.den)*st2->time_base.den
3522                -( next->dts*st2->time_base.num*AV_TIME_BASE - s->audio_preload*(int64_t)(st2->codec->codec_type == AVMEDIA_TYPE_AUDIO)*st2->time_base.den)* st->time_base.den;
3523             ts2=0;
3524         }
3525         comp= (ts>ts2) - (ts<ts2);
3526     }
3527
3528     if (comp == 0)
3529         return pkt->stream_index < next->stream_index;
3530     return comp > 0;
3531 }
3532
3533 int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
3534                                  AVPacket *pkt, int flush)
3535 {
3536     AVPacketList *pktl;
3537     int stream_count=0, noninterleaved_count=0;
3538     int64_t delta_dts_max = 0;
3539     int i, ret;
3540
3541     if(pkt){
3542         ret = ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3543         if (ret < 0)
3544             return ret;
3545     }
3546
3547     for(i=0; i < s->nb_streams; i++) {
3548         if (s->streams[i]->last_in_packet_buffer) {
3549             ++stream_count;
3550         } else if(s->streams[i]->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3551             ++noninterleaved_count;
3552         }
3553     }
3554
3555     if (s->nb_streams == stream_count) {
3556         flush = 1;
3557     } else if (!flush){
3558         for(i=0; i < s->nb_streams; i++) {
3559             if (s->streams[i]->last_in_packet_buffer) {
3560                 int64_t delta_dts =
3561                     av_rescale_q(s->streams[i]->last_in_packet_buffer->pkt.dts,
3562                                 s->streams[i]->time_base,
3563                                 AV_TIME_BASE_Q) -
3564                     av_rescale_q(s->packet_buffer->pkt.dts,
3565                                 s->streams[s->packet_buffer->pkt.stream_index]->time_base,
3566                                 AV_TIME_BASE_Q);
3567                 delta_dts_max= FFMAX(delta_dts_max, delta_dts);
3568             }
3569         }
3570         if(s->nb_streams == stream_count+noninterleaved_count &&
3571            delta_dts_max > 20*AV_TIME_BASE) {
3572             av_log(s, AV_LOG_DEBUG, "flushing with %d noninterleaved\n", noninterleaved_count);
3573             flush = 1;
3574         }
3575     }
3576     if(stream_count && flush){
3577         pktl= s->packet_buffer;
3578         *out= pktl->pkt;
3579
3580         s->packet_buffer= pktl->next;
3581         if(!s->packet_buffer)
3582             s->packet_buffer_end= NULL;
3583
3584         if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3585             s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3586         av_freep(&pktl);
3587         return 1;
3588     }else{
3589         av_init_packet(out);
3590         return 0;
3591     }
3592 }
3593
3594 #if FF_API_INTERLEAVE_PACKET
3595 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
3596                                  AVPacket *pkt, int flush)
3597 {
3598     return ff_interleave_packet_per_dts(s, out, pkt, flush);
3599 }
3600 #endif
3601
3602 /**
3603  * Interleave an AVPacket correctly so it can be muxed.
3604  * @param out the interleaved packet will be output here
3605  * @param in the input packet