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