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