]> git.sesse.net Git - ffmpeg/blob - libavformat/utils.c
avformat/utils: Check timebase before use in estimate_timings()
[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
22 #include <stdarg.h>
23 #include <stdint.h>
24
25 #include "config.h"
26
27 #include "libavutil/avassert.h"
28 #include "libavutil/avstring.h"
29 #include "libavutil/dict.h"
30 #include "libavutil/internal.h"
31 #include "libavutil/mathematics.h"
32 #include "libavutil/opt.h"
33 #include "libavutil/parseutils.h"
34 #include "libavutil/pixdesc.h"
35 #include "libavutil/thread.h"
36 #include "libavutil/time.h"
37 #include "libavutil/time_internal.h"
38 #include "libavutil/timestamp.h"
39
40 #include "libavcodec/bytestream.h"
41 #include "libavcodec/internal.h"
42 #include "libavcodec/raw.h"
43
44 #include "audiointerleave.h"
45 #include "avformat.h"
46 #include "avio_internal.h"
47 #include "id3v2.h"
48 #include "internal.h"
49 #include "metadata.h"
50 #if CONFIG_NETWORK
51 #include "network.h"
52 #endif
53 #include "riff.h"
54 #include "url.h"
55
56 #include "libavutil/ffversion.h"
57 const char av_format_ffversion[] = "FFmpeg version " FFMPEG_VERSION;
58
59 static AVMutex avformat_mutex = AV_MUTEX_INITIALIZER;
60
61 /**
62  * @file
63  * various utility functions for use within FFmpeg
64  */
65
66 unsigned avformat_version(void)
67 {
68     av_assert0(LIBAVFORMAT_VERSION_MICRO >= 100);
69     return LIBAVFORMAT_VERSION_INT;
70 }
71
72 const char *avformat_configuration(void)
73 {
74     return FFMPEG_CONFIGURATION;
75 }
76
77 const char *avformat_license(void)
78 {
79 #define LICENSE_PREFIX "libavformat license: "
80     return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
81 }
82
83 int ff_lock_avformat(void)
84 {
85     return ff_mutex_lock(&avformat_mutex) ? -1 : 0;
86 }
87
88 int ff_unlock_avformat(void)
89 {
90     return ff_mutex_unlock(&avformat_mutex) ? -1 : 0;
91 }
92
93 #define RELATIVE_TS_BASE (INT64_MAX - (1LL<<48))
94
95 static int is_relative(int64_t ts) {
96     return ts > (RELATIVE_TS_BASE - (1LL<<48));
97 }
98
99 /**
100  * Wrap a given time stamp, if there is an indication for an overflow
101  *
102  * @param st stream
103  * @param timestamp the time stamp to wrap
104  * @return resulting time stamp
105  */
106 static int64_t wrap_timestamp(const AVStream *st, int64_t timestamp)
107 {
108     if (st->pts_wrap_behavior != AV_PTS_WRAP_IGNORE &&
109         st->pts_wrap_reference != AV_NOPTS_VALUE && timestamp != AV_NOPTS_VALUE) {
110         if (st->pts_wrap_behavior == AV_PTS_WRAP_ADD_OFFSET &&
111             timestamp < st->pts_wrap_reference)
112             return timestamp + (1ULL << st->pts_wrap_bits);
113         else if (st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET &&
114             timestamp >= st->pts_wrap_reference)
115             return timestamp - (1ULL << st->pts_wrap_bits);
116     }
117     return timestamp;
118 }
119
120 #if FF_API_FORMAT_GET_SET
121 MAKE_ACCESSORS(AVStream, stream, AVRational, r_frame_rate)
122 #if FF_API_LAVF_FFSERVER
123 FF_DISABLE_DEPRECATION_WARNINGS
124 MAKE_ACCESSORS(AVStream, stream, char *, recommended_encoder_configuration)
125 FF_ENABLE_DEPRECATION_WARNINGS
126 #endif
127 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, video_codec)
128 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, audio_codec)
129 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, subtitle_codec)
130 MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, data_codec)
131 MAKE_ACCESSORS(AVFormatContext, format, int, metadata_header_padding)
132 MAKE_ACCESSORS(AVFormatContext, format, void *, opaque)
133 MAKE_ACCESSORS(AVFormatContext, format, av_format_control_message, control_message_cb)
134 #if FF_API_OLD_OPEN_CALLBACKS
135 FF_DISABLE_DEPRECATION_WARNINGS
136 MAKE_ACCESSORS(AVFormatContext, format, AVOpenCallback, open_cb)
137 FF_ENABLE_DEPRECATION_WARNINGS
138 #endif
139 #endif
140
141 int64_t av_stream_get_end_pts(const AVStream *st)
142 {
143     if (st->internal->priv_pts) {
144         return st->internal->priv_pts->val;
145     } else
146         return AV_NOPTS_VALUE;
147 }
148
149 struct AVCodecParserContext *av_stream_get_parser(const AVStream *st)
150 {
151     return st->parser;
152 }
153
154 void av_format_inject_global_side_data(AVFormatContext *s)
155 {
156     int i;
157     s->internal->inject_global_side_data = 1;
158     for (i = 0; i < s->nb_streams; i++) {
159         AVStream *st = s->streams[i];
160         st->inject_global_side_data = 1;
161     }
162 }
163
164 int ff_copy_whiteblacklists(AVFormatContext *dst, const AVFormatContext *src)
165 {
166     av_assert0(!dst->codec_whitelist &&
167                !dst->format_whitelist &&
168                !dst->protocol_whitelist &&
169                !dst->protocol_blacklist);
170     dst-> codec_whitelist = av_strdup(src->codec_whitelist);
171     dst->format_whitelist = av_strdup(src->format_whitelist);
172     dst->protocol_whitelist = av_strdup(src->protocol_whitelist);
173     dst->protocol_blacklist = av_strdup(src->protocol_blacklist);
174     if (   (src-> codec_whitelist && !dst-> codec_whitelist)
175         || (src->  format_whitelist && !dst->  format_whitelist)
176         || (src->protocol_whitelist && !dst->protocol_whitelist)
177         || (src->protocol_blacklist && !dst->protocol_blacklist)) {
178         av_log(dst, AV_LOG_ERROR, "Failed to duplicate black/whitelist\n");
179         return AVERROR(ENOMEM);
180     }
181     return 0;
182 }
183
184 static const AVCodec *find_decoder(AVFormatContext *s, const AVStream *st, enum AVCodecID codec_id)
185 {
186 #if FF_API_LAVF_AVCTX
187 FF_DISABLE_DEPRECATION_WARNINGS
188     if (st->codec->codec)
189         return st->codec->codec;
190 FF_ENABLE_DEPRECATION_WARNINGS
191 #endif
192
193     switch (st->codecpar->codec_type) {
194     case AVMEDIA_TYPE_VIDEO:
195         if (s->video_codec)    return s->video_codec;
196         break;
197     case AVMEDIA_TYPE_AUDIO:
198         if (s->audio_codec)    return s->audio_codec;
199         break;
200     case AVMEDIA_TYPE_SUBTITLE:
201         if (s->subtitle_codec) return s->subtitle_codec;
202         break;
203     }
204
205     return avcodec_find_decoder(codec_id);
206 }
207
208 static const AVCodec *find_probe_decoder(AVFormatContext *s, const AVStream *st, enum AVCodecID codec_id)
209 {
210     const AVCodec *codec;
211
212 #if CONFIG_H264_DECODER
213     /* Other parts of the code assume this decoder to be used for h264,
214      * so force it if possible. */
215     if (codec_id == AV_CODEC_ID_H264)
216         return avcodec_find_decoder_by_name("h264");
217 #endif
218
219     codec = find_decoder(s, st, codec_id);
220     if (!codec)
221         return NULL;
222
223     if (codec->capabilities & AV_CODEC_CAP_AVOID_PROBING) {
224         const AVCodec *probe_codec = NULL;
225         while (probe_codec = av_codec_next(probe_codec)) {
226             if (probe_codec->id == codec_id &&
227                     av_codec_is_decoder(probe_codec) &&
228                     !(probe_codec->capabilities & (AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_EXPERIMENTAL))) {
229                 return probe_codec;
230             }
231         }
232     }
233
234     return codec;
235 }
236
237 #if FF_API_FORMAT_GET_SET
238 int av_format_get_probe_score(const AVFormatContext *s)
239 {
240     return s->probe_score;
241 }
242 #endif
243
244 /* an arbitrarily chosen "sane" max packet size -- 50M */
245 #define SANE_CHUNK_SIZE (50000000)
246
247 int ffio_limit(AVIOContext *s, int size)
248 {
249     if (s->maxsize>= 0) {
250         int64_t remaining= s->maxsize - avio_tell(s);
251         if (remaining < size) {
252             int64_t newsize = avio_size(s);
253             if (!s->maxsize || s->maxsize<newsize)
254                 s->maxsize = newsize - !newsize;
255             remaining= s->maxsize - avio_tell(s);
256             remaining= FFMAX(remaining, 0);
257         }
258
259         if (s->maxsize>= 0 && remaining+1 < size) {
260             av_log(NULL, remaining ? AV_LOG_ERROR : AV_LOG_DEBUG, "Truncating packet of size %d to %"PRId64"\n", size, remaining+1);
261             size = remaining+1;
262         }
263     }
264     return size;
265 }
266
267 /* Read the data in sane-sized chunks and append to pkt.
268  * Return the number of bytes read or an error. */
269 static int append_packet_chunked(AVIOContext *s, AVPacket *pkt, int size)
270 {
271     int64_t orig_pos   = pkt->pos; // av_grow_packet might reset pos
272     int orig_size      = pkt->size;
273     int ret;
274
275     do {
276         int prev_size = pkt->size;
277         int read_size;
278
279         /* When the caller requests a lot of data, limit it to the amount
280          * left in file or SANE_CHUNK_SIZE when it is not known. */
281         read_size = size;
282         if (read_size > SANE_CHUNK_SIZE/10) {
283             read_size = ffio_limit(s, read_size);
284             // If filesize/maxsize is unknown, limit to SANE_CHUNK_SIZE
285             if (s->maxsize < 0)
286                 read_size = FFMIN(read_size, SANE_CHUNK_SIZE);
287         }
288
289         ret = av_grow_packet(pkt, read_size);
290         if (ret < 0)
291             break;
292
293         ret = avio_read(s, pkt->data + prev_size, read_size);
294         if (ret != read_size) {
295             av_shrink_packet(pkt, prev_size + FFMAX(ret, 0));
296             break;
297         }
298
299         size -= read_size;
300     } while (size > 0);
301     if (size > 0)
302         pkt->flags |= AV_PKT_FLAG_CORRUPT;
303
304     pkt->pos = orig_pos;
305     if (!pkt->size)
306         av_packet_unref(pkt);
307     return pkt->size > orig_size ? pkt->size - orig_size : ret;
308 }
309
310 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
311 {
312     av_init_packet(pkt);
313     pkt->data = NULL;
314     pkt->size = 0;
315     pkt->pos  = avio_tell(s);
316
317     return append_packet_chunked(s, pkt, size);
318 }
319
320 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
321 {
322     if (!pkt->size)
323         return av_get_packet(s, pkt, size);
324     return append_packet_chunked(s, pkt, size);
325 }
326
327 int av_filename_number_test(const char *filename)
328 {
329     char buf[1024];
330     return filename &&
331            (av_get_frame_filename(buf, sizeof(buf), filename, 1) >= 0);
332 }
333
334 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st,
335                                      AVProbeData *pd)
336 {
337     static const struct {
338         const char *name;
339         enum AVCodecID id;
340         enum AVMediaType type;
341     } fmt_id_type[] = {
342         { "aac",       AV_CODEC_ID_AAC,        AVMEDIA_TYPE_AUDIO },
343         { "ac3",       AV_CODEC_ID_AC3,        AVMEDIA_TYPE_AUDIO },
344         { "aptx",      AV_CODEC_ID_APTX,       AVMEDIA_TYPE_AUDIO },
345         { "dts",       AV_CODEC_ID_DTS,        AVMEDIA_TYPE_AUDIO },
346         { "dvbsub",    AV_CODEC_ID_DVB_SUBTITLE,AVMEDIA_TYPE_SUBTITLE },
347         { "dvbtxt",    AV_CODEC_ID_DVB_TELETEXT,AVMEDIA_TYPE_SUBTITLE },
348         { "eac3",      AV_CODEC_ID_EAC3,       AVMEDIA_TYPE_AUDIO },
349         { "h264",      AV_CODEC_ID_H264,       AVMEDIA_TYPE_VIDEO },
350         { "hevc",      AV_CODEC_ID_HEVC,       AVMEDIA_TYPE_VIDEO },
351         { "loas",      AV_CODEC_ID_AAC_LATM,   AVMEDIA_TYPE_AUDIO },
352         { "m4v",       AV_CODEC_ID_MPEG4,      AVMEDIA_TYPE_VIDEO },
353         { "mjpeg_2000",AV_CODEC_ID_JPEG2000,   AVMEDIA_TYPE_VIDEO },
354         { "mp3",       AV_CODEC_ID_MP3,        AVMEDIA_TYPE_AUDIO },
355         { "mpegvideo", AV_CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
356         { "truehd",    AV_CODEC_ID_TRUEHD,     AVMEDIA_TYPE_AUDIO },
357         { 0 }
358     };
359     int score;
360     const AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
361
362     if (fmt) {
363         int i;
364         av_log(s, AV_LOG_DEBUG,
365                "Probe with size=%d, packets=%d detected %s with score=%d\n",
366                pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets,
367                fmt->name, score);
368         for (i = 0; fmt_id_type[i].name; i++) {
369             if (!strcmp(fmt->name, fmt_id_type[i].name)) {
370                 if (fmt_id_type[i].type != AVMEDIA_TYPE_AUDIO &&
371                     st->codecpar->sample_rate)
372                     continue;
373                 if (st->request_probe > score &&
374                     st->codecpar->codec_id != fmt_id_type[i].id)
375                     continue;
376                 st->codecpar->codec_id   = fmt_id_type[i].id;
377                 st->codecpar->codec_type = fmt_id_type[i].type;
378                 st->internal->need_context_update = 1;
379 #if FF_API_LAVF_AVCTX
380 FF_DISABLE_DEPRECATION_WARNINGS
381                 st->codec->codec_type = st->codecpar->codec_type;
382                 st->codec->codec_id   = st->codecpar->codec_id;
383 FF_ENABLE_DEPRECATION_WARNINGS
384 #endif
385                 return score;
386             }
387         }
388     }
389     return 0;
390 }
391
392 /************************************************************/
393 /* input media file */
394
395 int av_demuxer_open(AVFormatContext *ic) {
396     int err;
397
398     if (ic->format_whitelist && av_match_list(ic->iformat->name, ic->format_whitelist, ',') <= 0) {
399         av_log(ic, AV_LOG_ERROR, "Format not on whitelist \'%s\'\n", ic->format_whitelist);
400         return AVERROR(EINVAL);
401     }
402
403     if (ic->iformat->read_header) {
404         err = ic->iformat->read_header(ic);
405         if (err < 0)
406             return err;
407     }
408
409     if (ic->pb && !ic->internal->data_offset)
410         ic->internal->data_offset = avio_tell(ic->pb);
411
412     return 0;
413 }
414
415 /* Open input file and probe the format if necessary. */
416 static int init_input(AVFormatContext *s, const char *filename,
417                       AVDictionary **options)
418 {
419     int ret;
420     AVProbeData pd = { filename, NULL, 0 };
421     int score = AVPROBE_SCORE_RETRY;
422
423     if (s->pb) {
424         s->flags |= AVFMT_FLAG_CUSTOM_IO;
425         if (!s->iformat)
426             return av_probe_input_buffer2(s->pb, &s->iformat, filename,
427                                          s, 0, s->format_probesize);
428         else if (s->iformat->flags & AVFMT_NOFILE)
429             av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
430                                       "will be ignored with AVFMT_NOFILE format.\n");
431         return 0;
432     }
433
434     if ((s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
435         (!s->iformat && (s->iformat = av_probe_input_format2(&pd, 0, &score))))
436         return score;
437
438     if ((ret = s->io_open(s, &s->pb, filename, AVIO_FLAG_READ | s->avio_flags, options)) < 0)
439         return ret;
440
441     if (s->iformat)
442         return 0;
443     return av_probe_input_buffer2(s->pb, &s->iformat, filename,
444                                  s, 0, s->format_probesize);
445 }
446
447 int ff_packet_list_put(AVPacketList **packet_buffer,
448                        AVPacketList **plast_pktl,
449                        AVPacket      *pkt, int flags)
450 {
451     AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
452     int ret;
453
454     if (!pktl)
455         return AVERROR(ENOMEM);
456
457     if (flags & FF_PACKETLIST_FLAG_REF_PACKET) {
458         if ((ret = av_packet_ref(&pktl->pkt, pkt)) < 0) {
459             av_free(pktl);
460             return ret;
461         }
462     } else {
463         // TODO: Adapt callers in this file so the line below can use
464         //       av_packet_move_ref() to effectively move the reference
465         //       to the list.
466         pktl->pkt = *pkt;
467     }
468
469     if (*packet_buffer)
470         (*plast_pktl)->next = pktl;
471     else
472         *packet_buffer = pktl;
473
474     /* Add the packet in the buffered packet list. */
475     *plast_pktl = pktl;
476     return 0;
477 }
478
479 int avformat_queue_attached_pictures(AVFormatContext *s)
480 {
481     int i, ret;
482     for (i = 0; i < s->nb_streams; i++)
483         if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC &&
484             s->streams[i]->discard < AVDISCARD_ALL) {
485             if (s->streams[i]->attached_pic.size <= 0) {
486                 av_log(s, AV_LOG_WARNING,
487                     "Attached picture on stream %d has invalid size, "
488                     "ignoring\n", i);
489                 continue;
490             }
491
492             ret = ff_packet_list_put(&s->internal->raw_packet_buffer,
493                                      &s->internal->raw_packet_buffer_end,
494                                      &s->streams[i]->attached_pic,
495                                      FF_PACKETLIST_FLAG_REF_PACKET);
496             if (ret < 0)
497                 return ret;
498         }
499     return 0;
500 }
501
502 static int update_stream_avctx(AVFormatContext *s)
503 {
504     int i, ret;
505     for (i = 0; i < s->nb_streams; i++) {
506         AVStream *st = s->streams[i];
507
508         if (!st->internal->need_context_update)
509             continue;
510
511         /* close parser, because it depends on the codec */
512         if (st->parser && st->internal->avctx->codec_id != st->codecpar->codec_id) {
513             av_parser_close(st->parser);
514             st->parser = NULL;
515         }
516
517         /* update internal codec context, for the parser */
518         ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
519         if (ret < 0)
520             return ret;
521
522 #if FF_API_LAVF_AVCTX
523 FF_DISABLE_DEPRECATION_WARNINGS
524         /* update deprecated public codec context */
525         ret = avcodec_parameters_to_context(st->codec, st->codecpar);
526         if (ret < 0)
527             return ret;
528 FF_ENABLE_DEPRECATION_WARNINGS
529 #endif
530
531         st->internal->need_context_update = 0;
532     }
533     return 0;
534 }
535
536
537 int avformat_open_input(AVFormatContext **ps, const char *filename,
538                         ff_const59 AVInputFormat *fmt, AVDictionary **options)
539 {
540     AVFormatContext *s = *ps;
541     int i, ret = 0;
542     AVDictionary *tmp = NULL;
543     ID3v2ExtraMeta *id3v2_extra_meta = NULL;
544
545     if (!s && !(s = avformat_alloc_context()))
546         return AVERROR(ENOMEM);
547     if (!s->av_class) {
548         av_log(NULL, AV_LOG_ERROR, "Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n");
549         return AVERROR(EINVAL);
550     }
551     if (fmt)
552         s->iformat = fmt;
553
554     if (options)
555         av_dict_copy(&tmp, *options, 0);
556
557     if (s->pb) // must be before any goto fail
558         s->flags |= AVFMT_FLAG_CUSTOM_IO;
559
560     if ((ret = av_opt_set_dict(s, &tmp)) < 0)
561         goto fail;
562
563     if (!(s->url = av_strdup(filename ? filename : ""))) {
564         ret = AVERROR(ENOMEM);
565         goto fail;
566     }
567
568 #if FF_API_FORMAT_FILENAME
569 FF_DISABLE_DEPRECATION_WARNINGS
570     av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename));
571 FF_ENABLE_DEPRECATION_WARNINGS
572 #endif
573     if ((ret = init_input(s, filename, &tmp)) < 0)
574         goto fail;
575     s->probe_score = ret;
576
577     if (!s->protocol_whitelist && s->pb && s->pb->protocol_whitelist) {
578         s->protocol_whitelist = av_strdup(s->pb->protocol_whitelist);
579         if (!s->protocol_whitelist) {
580             ret = AVERROR(ENOMEM);
581             goto fail;
582         }
583     }
584
585     if (!s->protocol_blacklist && s->pb && s->pb->protocol_blacklist) {
586         s->protocol_blacklist = av_strdup(s->pb->protocol_blacklist);
587         if (!s->protocol_blacklist) {
588             ret = AVERROR(ENOMEM);
589             goto fail;
590         }
591     }
592
593     if (s->format_whitelist && av_match_list(s->iformat->name, s->format_whitelist, ',') <= 0) {
594         av_log(s, AV_LOG_ERROR, "Format not on whitelist \'%s\'\n", s->format_whitelist);
595         ret = AVERROR(EINVAL);
596         goto fail;
597     }
598
599     avio_skip(s->pb, s->skip_initial_bytes);
600
601     /* Check filename in case an image number is expected. */
602     if (s->iformat->flags & AVFMT_NEEDNUMBER) {
603         if (!av_filename_number_test(filename)) {
604             ret = AVERROR(EINVAL);
605             goto fail;
606         }
607     }
608
609     s->duration = s->start_time = AV_NOPTS_VALUE;
610
611     /* Allocate private data. */
612     if (s->iformat->priv_data_size > 0) {
613         if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
614             ret = AVERROR(ENOMEM);
615             goto fail;
616         }
617         if (s->iformat->priv_class) {
618             *(const AVClass **) s->priv_data = s->iformat->priv_class;
619             av_opt_set_defaults(s->priv_data);
620             if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
621                 goto fail;
622         }
623     }
624
625     /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
626     if (s->pb)
627         ff_id3v2_read_dict(s->pb, &s->internal->id3v2_meta, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
628
629
630     if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
631         if ((ret = s->iformat->read_header(s)) < 0)
632             goto fail;
633
634     if (!s->metadata) {
635         s->metadata = s->internal->id3v2_meta;
636         s->internal->id3v2_meta = NULL;
637     } else if (s->internal->id3v2_meta) {
638         int level = AV_LOG_WARNING;
639         if (s->error_recognition & AV_EF_COMPLIANT)
640             level = AV_LOG_ERROR;
641         av_log(s, level, "Discarding ID3 tags because more suitable tags were found.\n");
642         av_dict_free(&s->internal->id3v2_meta);
643         if (s->error_recognition & AV_EF_EXPLODE)
644             return AVERROR_INVALIDDATA;
645     }
646
647     if (id3v2_extra_meta) {
648         if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") ||
649             !strcmp(s->iformat->name, "tta") || !strcmp(s->iformat->name, "wav")) {
650             if ((ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
651                 goto fail;
652             if ((ret = ff_id3v2_parse_chapters(s, &id3v2_extra_meta)) < 0)
653                 goto fail;
654             if ((ret = ff_id3v2_parse_priv(s, &id3v2_extra_meta)) < 0)
655                 goto fail;
656         } else
657             av_log(s, AV_LOG_DEBUG, "demuxer does not support additional id3 data, skipping\n");
658     }
659     ff_id3v2_free_extra_meta(&id3v2_extra_meta);
660
661     if ((ret = avformat_queue_attached_pictures(s)) < 0)
662         goto fail;
663
664     if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->internal->data_offset)
665         s->internal->data_offset = avio_tell(s->pb);
666
667     s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
668
669     update_stream_avctx(s);
670
671     for (i = 0; i < s->nb_streams; i++)
672         s->streams[i]->internal->orig_codec_id = s->streams[i]->codecpar->codec_id;
673
674     if (options) {
675         av_dict_free(options);
676         *options = tmp;
677     }
678     *ps = s;
679     return 0;
680
681 fail:
682     ff_id3v2_free_extra_meta(&id3v2_extra_meta);
683     av_dict_free(&tmp);
684     if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
685         avio_closep(&s->pb);
686     avformat_free_context(s);
687     *ps = NULL;
688     return ret;
689 }
690
691 /*******************************************************/
692
693 static void force_codec_ids(AVFormatContext *s, AVStream *st)
694 {
695     switch (st->codecpar->codec_type) {
696     case AVMEDIA_TYPE_VIDEO:
697         if (s->video_codec_id)
698             st->codecpar->codec_id = s->video_codec_id;
699         break;
700     case AVMEDIA_TYPE_AUDIO:
701         if (s->audio_codec_id)
702             st->codecpar->codec_id = s->audio_codec_id;
703         break;
704     case AVMEDIA_TYPE_SUBTITLE:
705         if (s->subtitle_codec_id)
706             st->codecpar->codec_id = s->subtitle_codec_id;
707         break;
708     case AVMEDIA_TYPE_DATA:
709         if (s->data_codec_id)
710             st->codecpar->codec_id = s->data_codec_id;
711         break;
712     }
713 }
714
715 static int probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
716 {
717     if (st->request_probe>0) {
718         AVProbeData *pd = &st->probe_data;
719         int end;
720         av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
721         --st->probe_packets;
722
723         if (pkt) {
724             uint8_t *new_buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
725             if (!new_buf) {
726                 av_log(s, AV_LOG_WARNING,
727                        "Failed to reallocate probe buffer for stream %d\n",
728                        st->index);
729                 goto no_packet;
730             }
731             pd->buf = new_buf;
732             memcpy(pd->buf + pd->buf_size, pkt->data, pkt->size);
733             pd->buf_size += pkt->size;
734             memset(pd->buf + pd->buf_size, 0, AVPROBE_PADDING_SIZE);
735         } else {
736 no_packet:
737             st->probe_packets = 0;
738             if (!pd->buf_size) {
739                 av_log(s, AV_LOG_WARNING,
740                        "nothing to probe for stream %d\n", st->index);
741             }
742         }
743
744         end=    s->internal->raw_packet_buffer_remaining_size <= 0
745                 || st->probe_packets<= 0;
746
747         if (end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)) {
748             int score = set_codec_from_probe_data(s, st, pd);
749             if (    (st->codecpar->codec_id != AV_CODEC_ID_NONE && score > AVPROBE_SCORE_STREAM_RETRY)
750                 || end) {
751                 pd->buf_size = 0;
752                 av_freep(&pd->buf);
753                 st->request_probe = -1;
754                 if (st->codecpar->codec_id != AV_CODEC_ID_NONE) {
755                     av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
756                 } else
757                     av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
758             }
759             force_codec_ids(s, st);
760         }
761     }
762     return 0;
763 }
764
765 static int update_wrap_reference(AVFormatContext *s, AVStream *st, int stream_index, AVPacket *pkt)
766 {
767     int64_t ref = pkt->dts;
768     int i, pts_wrap_behavior;
769     int64_t pts_wrap_reference;
770     AVProgram *first_program;
771
772     if (ref == AV_NOPTS_VALUE)
773         ref = pkt->pts;
774     if (st->pts_wrap_reference != AV_NOPTS_VALUE || st->pts_wrap_bits >= 63 || ref == AV_NOPTS_VALUE || !s->correct_ts_overflow)
775         return 0;
776     ref &= (1LL << st->pts_wrap_bits)-1;
777
778     // reference time stamp should be 60 s before first time stamp
779     pts_wrap_reference = ref - av_rescale(60, st->time_base.den, st->time_base.num);
780     // if first time stamp is not more than 1/8 and 60s before the wrap point, subtract rather than add wrap offset
781     pts_wrap_behavior = (ref < (1LL << st->pts_wrap_bits) - (1LL << st->pts_wrap_bits-3)) ||
782         (ref < (1LL << st->pts_wrap_bits) - av_rescale(60, st->time_base.den, st->time_base.num)) ?
783         AV_PTS_WRAP_ADD_OFFSET : AV_PTS_WRAP_SUB_OFFSET;
784
785     first_program = av_find_program_from_stream(s, NULL, stream_index);
786
787     if (!first_program) {
788         int default_stream_index = av_find_default_stream_index(s);
789         if (s->streams[default_stream_index]->pts_wrap_reference == AV_NOPTS_VALUE) {
790             for (i = 0; i < s->nb_streams; i++) {
791                 if (av_find_program_from_stream(s, NULL, i))
792                     continue;
793                 s->streams[i]->pts_wrap_reference = pts_wrap_reference;
794                 s->streams[i]->pts_wrap_behavior = pts_wrap_behavior;
795             }
796         }
797         else {
798             st->pts_wrap_reference = s->streams[default_stream_index]->pts_wrap_reference;
799             st->pts_wrap_behavior = s->streams[default_stream_index]->pts_wrap_behavior;
800         }
801     }
802     else {
803         AVProgram *program = first_program;
804         while (program) {
805             if (program->pts_wrap_reference != AV_NOPTS_VALUE) {
806                 pts_wrap_reference = program->pts_wrap_reference;
807                 pts_wrap_behavior = program->pts_wrap_behavior;
808                 break;
809             }
810             program = av_find_program_from_stream(s, program, stream_index);
811         }
812
813         // update every program with differing pts_wrap_reference
814         program = first_program;
815         while (program) {
816             if (program->pts_wrap_reference != pts_wrap_reference) {
817                 for (i = 0; i<program->nb_stream_indexes; i++) {
818                     s->streams[program->stream_index[i]]->pts_wrap_reference = pts_wrap_reference;
819                     s->streams[program->stream_index[i]]->pts_wrap_behavior = pts_wrap_behavior;
820                 }
821
822                 program->pts_wrap_reference = pts_wrap_reference;
823                 program->pts_wrap_behavior = pts_wrap_behavior;
824             }
825             program = av_find_program_from_stream(s, program, stream_index);
826         }
827     }
828     return 1;
829 }
830
831 int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
832 {
833     int ret, i, err;
834     AVStream *st;
835
836     for (;;) {
837         AVPacketList *pktl = s->internal->raw_packet_buffer;
838
839         if (pktl) {
840             *pkt = pktl->pkt;
841             st   = s->streams[pkt->stream_index];
842             if (s->internal->raw_packet_buffer_remaining_size <= 0)
843                 if ((err = probe_codec(s, st, NULL)) < 0)
844                     return err;
845             if (st->request_probe <= 0) {
846                 s->internal->raw_packet_buffer                 = pktl->next;
847                 s->internal->raw_packet_buffer_remaining_size += pkt->size;
848                 av_free(pktl);
849                 return 0;
850             }
851         }
852
853         pkt->data = NULL;
854         pkt->size = 0;
855         av_init_packet(pkt);
856         ret = s->iformat->read_packet(s, pkt);
857         if (ret < 0) {
858             /* Some demuxers return FFERROR_REDO when they consume
859                data and discard it (ignored streams, junk, extradata).
860                We must re-call the demuxer to get the real packet. */
861             if (ret == FFERROR_REDO)
862                 continue;
863             if (!pktl || ret == AVERROR(EAGAIN))
864                 return ret;
865             for (i = 0; i < s->nb_streams; i++) {
866                 st = s->streams[i];
867                 if (st->probe_packets || st->request_probe > 0)
868                     if ((err = probe_codec(s, st, NULL)) < 0)
869                         return err;
870                 av_assert0(st->request_probe <= 0);
871             }
872             continue;
873         }
874
875         err = av_packet_make_refcounted(pkt);
876         if (err < 0)
877             return err;
878
879         if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
880             (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
881             av_log(s, AV_LOG_WARNING,
882                    "Dropped corrupted packet (stream = %d)\n",
883                    pkt->stream_index);
884             av_packet_unref(pkt);
885             continue;
886         }
887
888         if (pkt->stream_index >= (unsigned)s->nb_streams) {
889             av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
890             continue;
891         }
892
893         st = s->streams[pkt->stream_index];
894
895         if (update_wrap_reference(s, st, pkt->stream_index, pkt) && st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET) {
896             // correct first time stamps to negative values
897             if (!is_relative(st->first_dts))
898                 st->first_dts = wrap_timestamp(st, st->first_dts);
899             if (!is_relative(st->start_time))
900                 st->start_time = wrap_timestamp(st, st->start_time);
901             if (!is_relative(st->cur_dts))
902                 st->cur_dts = wrap_timestamp(st, st->cur_dts);
903         }
904
905         pkt->dts = wrap_timestamp(st, pkt->dts);
906         pkt->pts = wrap_timestamp(st, pkt->pts);
907
908         force_codec_ids(s, st);
909
910         /* TODO: audio: time filter; video: frame reordering (pts != dts) */
911         if (s->use_wallclock_as_timestamps)
912             pkt->dts = pkt->pts = av_rescale_q(av_gettime(), AV_TIME_BASE_Q, st->time_base);
913
914         if (!pktl && st->request_probe <= 0)
915             return ret;
916
917         err = ff_packet_list_put(&s->internal->raw_packet_buffer,
918                                  &s->internal->raw_packet_buffer_end,
919                                  pkt, 0);
920         if (err)
921             return err;
922         s->internal->raw_packet_buffer_remaining_size -= pkt->size;
923
924         if ((err = probe_codec(s, st, pkt)) < 0)
925             return err;
926     }
927 }
928
929
930 /**********************************************************/
931
932 static int determinable_frame_size(AVCodecContext *avctx)
933 {
934     switch(avctx->codec_id) {
935     case AV_CODEC_ID_MP1:
936     case AV_CODEC_ID_MP2:
937     case AV_CODEC_ID_MP3:
938     case AV_CODEC_ID_CODEC2:
939         return 1;
940     }
941
942     return 0;
943 }
944
945 /**
946  * Return the frame duration in seconds. Return 0 if not available.
947  */
948 void ff_compute_frame_duration(AVFormatContext *s, int *pnum, int *pden, AVStream *st,
949                                AVCodecParserContext *pc, AVPacket *pkt)
950 {
951     AVRational codec_framerate = s->iformat ? st->internal->avctx->framerate :
952                                               av_mul_q(av_inv_q(st->internal->avctx->time_base), (AVRational){1, st->internal->avctx->ticks_per_frame});
953     int frame_size, sample_rate;
954
955 #if FF_API_LAVF_AVCTX
956 FF_DISABLE_DEPRECATION_WARNINGS
957     if ((!codec_framerate.den || !codec_framerate.num) && st->codec->time_base.den && st->codec->time_base.num)
958         codec_framerate = av_mul_q(av_inv_q(st->codec->time_base), (AVRational){1, st->codec->ticks_per_frame});
959 FF_ENABLE_DEPRECATION_WARNINGS
960 #endif
961
962     *pnum = 0;
963     *pden = 0;
964     switch (st->codecpar->codec_type) {
965     case AVMEDIA_TYPE_VIDEO:
966         if (st->r_frame_rate.num && !pc && s->iformat) {
967             *pnum = st->r_frame_rate.den;
968             *pden = st->r_frame_rate.num;
969         } else if (st->time_base.num * 1000LL > st->time_base.den) {
970             *pnum = st->time_base.num;
971             *pden = st->time_base.den;
972         } else if (codec_framerate.den * 1000LL > codec_framerate.num) {
973             av_assert0(st->internal->avctx->ticks_per_frame);
974             av_reduce(pnum, pden,
975                       codec_framerate.den,
976                       codec_framerate.num * (int64_t)st->internal->avctx->ticks_per_frame,
977                       INT_MAX);
978
979             if (pc && pc->repeat_pict) {
980                 av_assert0(s->iformat); // this may be wrong for interlaced encoding but its not used for that case
981                 av_reduce(pnum, pden,
982                           (*pnum) * (1LL + pc->repeat_pict),
983                           (*pden),
984                           INT_MAX);
985             }
986             /* If this codec can be interlaced or progressive then we need
987              * a parser to compute duration of a packet. Thus if we have
988              * no parser in such case leave duration undefined. */
989             if (st->internal->avctx->ticks_per_frame > 1 && !pc)
990                 *pnum = *pden = 0;
991         }
992         break;
993     case AVMEDIA_TYPE_AUDIO:
994         if (st->internal->avctx_inited) {
995             frame_size = av_get_audio_frame_duration(st->internal->avctx, pkt->size);
996             sample_rate = st->internal->avctx->sample_rate;
997         } else {
998             frame_size = av_get_audio_frame_duration2(st->codecpar, pkt->size);
999             sample_rate = st->codecpar->sample_rate;
1000         }
1001         if (frame_size <= 0 || sample_rate <= 0)
1002             break;
1003         *pnum = frame_size;
1004         *pden = sample_rate;
1005         break;
1006     default:
1007         break;
1008     }
1009 }
1010
1011 static int is_intra_only(enum AVCodecID id)
1012 {
1013     const AVCodecDescriptor *d = avcodec_descriptor_get(id);
1014     if (!d)
1015         return 0;
1016     if (d->type == AVMEDIA_TYPE_VIDEO && !(d->props & AV_CODEC_PROP_INTRA_ONLY))
1017         return 0;
1018     return 1;
1019 }
1020
1021 static int has_decode_delay_been_guessed(AVStream *st)
1022 {
1023     if (st->codecpar->codec_id != AV_CODEC_ID_H264) return 1;
1024     if (!st->info) // if we have left find_stream_info then nb_decoded_frames won't increase anymore for stream copy
1025         return 1;
1026 #if CONFIG_H264_DECODER
1027     if (st->internal->avctx->has_b_frames &&
1028        avpriv_h264_has_num_reorder_frames(st->internal->avctx) == st->internal->avctx->has_b_frames)
1029         return 1;
1030 #endif
1031     if (st->internal->avctx->has_b_frames<3)
1032         return st->nb_decoded_frames >= 7;
1033     else if (st->internal->avctx->has_b_frames<4)
1034         return st->nb_decoded_frames >= 18;
1035     else
1036         return st->nb_decoded_frames >= 20;
1037 }
1038
1039 static AVPacketList *get_next_pkt(AVFormatContext *s, AVStream *st, AVPacketList *pktl)
1040 {
1041     if (pktl->next)
1042         return pktl->next;
1043     if (pktl == s->internal->packet_buffer_end)
1044         return s->internal->parse_queue;
1045     return NULL;
1046 }
1047
1048 static int64_t select_from_pts_buffer(AVStream *st, int64_t *pts_buffer, int64_t dts) {
1049     int onein_oneout = st->codecpar->codec_id != AV_CODEC_ID_H264 &&
1050                        st->codecpar->codec_id != AV_CODEC_ID_HEVC;
1051
1052     if(!onein_oneout) {
1053         int delay = st->internal->avctx->has_b_frames;
1054         int i;
1055
1056         if (dts == AV_NOPTS_VALUE) {
1057             int64_t best_score = INT64_MAX;
1058             for (i = 0; i<delay; i++) {
1059                 if (st->pts_reorder_error_count[i]) {
1060                     int64_t score = st->pts_reorder_error[i] / st->pts_reorder_error_count[i];
1061                     if (score < best_score) {
1062                         best_score = score;
1063                         dts = pts_buffer[i];
1064                     }
1065                 }
1066             }
1067         } else {
1068             for (i = 0; i<delay; i++) {
1069                 if (pts_buffer[i] != AV_NOPTS_VALUE) {
1070                     int64_t diff =  FFABS(pts_buffer[i] - dts)
1071                                     + (uint64_t)st->pts_reorder_error[i];
1072                     diff = FFMAX(diff, st->pts_reorder_error[i]);
1073                     st->pts_reorder_error[i] = diff;
1074                     st->pts_reorder_error_count[i]++;
1075                     if (st->pts_reorder_error_count[i] > 250) {
1076                         st->pts_reorder_error[i] >>= 1;
1077                         st->pts_reorder_error_count[i] >>= 1;
1078                     }
1079                 }
1080             }
1081         }
1082     }
1083
1084     if (dts == AV_NOPTS_VALUE)
1085         dts = pts_buffer[0];
1086
1087     return dts;
1088 }
1089
1090 /**
1091  * Updates the dts of packets of a stream in pkt_buffer, by re-ordering the pts
1092  * of the packets in a window.
1093  */
1094 static void update_dts_from_pts(AVFormatContext *s, int stream_index,
1095                                 AVPacketList *pkt_buffer)
1096 {
1097     AVStream *st       = s->streams[stream_index];
1098     int delay          = st->internal->avctx->has_b_frames;
1099     int i;
1100
1101     int64_t pts_buffer[MAX_REORDER_DELAY+1];
1102
1103     for (i = 0; i<MAX_REORDER_DELAY+1; i++)
1104         pts_buffer[i] = AV_NOPTS_VALUE;
1105
1106     for (; pkt_buffer; pkt_buffer = get_next_pkt(s, st, pkt_buffer)) {
1107         if (pkt_buffer->pkt.stream_index != stream_index)
1108             continue;
1109
1110         if (pkt_buffer->pkt.pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
1111             pts_buffer[0] = pkt_buffer->pkt.pts;
1112             for (i = 0; i<delay && pts_buffer[i] > pts_buffer[i + 1]; i++)
1113                 FFSWAP(int64_t, pts_buffer[i], pts_buffer[i + 1]);
1114
1115             pkt_buffer->pkt.dts = select_from_pts_buffer(st, pts_buffer, pkt_buffer->pkt.dts);
1116         }
1117     }
1118 }
1119
1120 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
1121                                       int64_t dts, int64_t pts, AVPacket *pkt)
1122 {
1123     AVStream *st       = s->streams[stream_index];
1124     AVPacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1125     AVPacketList *pktl_it;
1126
1127     uint64_t shift;
1128
1129     if (st->first_dts != AV_NOPTS_VALUE ||
1130         dts           == AV_NOPTS_VALUE ||
1131         st->cur_dts   == AV_NOPTS_VALUE ||
1132         st->cur_dts < INT_MIN + RELATIVE_TS_BASE ||
1133         is_relative(dts))
1134         return;
1135
1136     st->first_dts = dts - (st->cur_dts - RELATIVE_TS_BASE);
1137     st->cur_dts   = dts;
1138     shift         = (uint64_t)st->first_dts - RELATIVE_TS_BASE;
1139
1140     if (is_relative(pts))
1141         pts += shift;
1142
1143     for (pktl_it = pktl; pktl_it; pktl_it = get_next_pkt(s, st, pktl_it)) {
1144         if (pktl_it->pkt.stream_index != stream_index)
1145             continue;
1146         if (is_relative(pktl_it->pkt.pts))
1147             pktl_it->pkt.pts += shift;
1148
1149         if (is_relative(pktl_it->pkt.dts))
1150             pktl_it->pkt.dts += shift;
1151
1152         if (st->start_time == AV_NOPTS_VALUE && pktl_it->pkt.pts != AV_NOPTS_VALUE) {
1153             st->start_time = pktl_it->pkt.pts;
1154             if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && st->codecpar->sample_rate)
1155                 st->start_time += av_rescale_q(st->skip_samples, (AVRational){1, st->codecpar->sample_rate}, st->time_base);
1156         }
1157     }
1158
1159     if (has_decode_delay_been_guessed(st)) {
1160         update_dts_from_pts(s, stream_index, pktl);
1161     }
1162
1163     if (st->start_time == AV_NOPTS_VALUE) {
1164         if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO || !(pkt->flags & AV_PKT_FLAG_DISCARD)) {
1165             st->start_time = pts;
1166         }
1167         if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && st->codecpar->sample_rate)
1168             st->start_time += av_rescale_q(st->skip_samples, (AVRational){1, st->codecpar->sample_rate}, st->time_base);
1169     }
1170 }
1171
1172 static void update_initial_durations(AVFormatContext *s, AVStream *st,
1173                                      int stream_index, int duration)
1174 {
1175     AVPacketList *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1176     int64_t cur_dts    = RELATIVE_TS_BASE;
1177
1178     if (st->first_dts != AV_NOPTS_VALUE) {
1179         if (st->update_initial_durations_done)
1180             return;
1181         st->update_initial_durations_done = 1;
1182         cur_dts = st->first_dts;
1183         for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
1184             if (pktl->pkt.stream_index == stream_index) {
1185                 if (pktl->pkt.pts != pktl->pkt.dts  ||
1186                     pktl->pkt.dts != AV_NOPTS_VALUE ||
1187                     pktl->pkt.duration)
1188                     break;
1189                 cur_dts -= duration;
1190             }
1191         }
1192         if (pktl && pktl->pkt.dts != st->first_dts) {
1193             av_log(s, AV_LOG_DEBUG, "first_dts %s not matching first dts %s (pts %s, duration %"PRId64") in the queue\n",
1194                    av_ts2str(st->first_dts), av_ts2str(pktl->pkt.dts), av_ts2str(pktl->pkt.pts), pktl->pkt.duration);
1195             return;
1196         }
1197         if (!pktl) {
1198             av_log(s, AV_LOG_DEBUG, "first_dts %s but no packet with dts in the queue\n", av_ts2str(st->first_dts));
1199             return;
1200         }
1201         pktl          = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
1202         st->first_dts = cur_dts;
1203     } else if (st->cur_dts != RELATIVE_TS_BASE)
1204         return;
1205
1206     for (; pktl; pktl = get_next_pkt(s, st, pktl)) {
1207         if (pktl->pkt.stream_index != stream_index)
1208             continue;
1209         if ((pktl->pkt.pts == pktl->pkt.dts ||
1210              pktl->pkt.pts == AV_NOPTS_VALUE) &&
1211             (pktl->pkt.dts == AV_NOPTS_VALUE ||
1212              pktl->pkt.dts == st->first_dts ||
1213              pktl->pkt.dts == RELATIVE_TS_BASE) &&
1214             !pktl->pkt.duration) {
1215             pktl->pkt.dts = cur_dts;
1216             if (!st->internal->avctx->has_b_frames)
1217                 pktl->pkt.pts = cur_dts;
1218 //            if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO)
1219                 pktl->pkt.duration = duration;
1220         } else
1221             break;
1222         cur_dts = pktl->pkt.dts + pktl->pkt.duration;
1223     }
1224     if (!pktl)
1225         st->cur_dts = cur_dts;
1226 }
1227
1228 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
1229                                AVCodecParserContext *pc, AVPacket *pkt,
1230                                int64_t next_dts, int64_t next_pts)
1231 {
1232     int num, den, presentation_delayed, delay, i;
1233     int64_t offset;
1234     AVRational duration;
1235     int onein_oneout = st->codecpar->codec_id != AV_CODEC_ID_H264 &&
1236                        st->codecpar->codec_id != AV_CODEC_ID_HEVC;
1237
1238     if (s->flags & AVFMT_FLAG_NOFILLIN)
1239         return;
1240
1241     if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && pkt->dts != AV_NOPTS_VALUE) {
1242         if (pkt->dts == pkt->pts && st->last_dts_for_order_check != AV_NOPTS_VALUE) {
1243             if (st->last_dts_for_order_check <= pkt->dts) {
1244                 st->dts_ordered++;
1245             } else {
1246                 av_log(s, st->dts_misordered ? AV_LOG_DEBUG : AV_LOG_WARNING,
1247                        "DTS %"PRIi64" < %"PRIi64" out of order\n",
1248                        pkt->dts,
1249                        st->last_dts_for_order_check);
1250                 st->dts_misordered++;
1251             }
1252             if (st->dts_ordered + st->dts_misordered > 250) {
1253                 st->dts_ordered    >>= 1;
1254                 st->dts_misordered >>= 1;
1255             }
1256         }
1257
1258         st->last_dts_for_order_check = pkt->dts;
1259         if (st->dts_ordered < 8*st->dts_misordered && pkt->dts == pkt->pts)
1260             pkt->dts = AV_NOPTS_VALUE;
1261     }
1262
1263     if ((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
1264         pkt->dts = AV_NOPTS_VALUE;
1265
1266     if (pc && pc->pict_type == AV_PICTURE_TYPE_B
1267         && !st->internal->avctx->has_b_frames)
1268         //FIXME Set low_delay = 0 when has_b_frames = 1
1269         st->internal->avctx->has_b_frames = 1;
1270
1271     /* do we have a video B-frame ? */
1272     delay = st->internal->avctx->has_b_frames;
1273     presentation_delayed = 0;
1274
1275     /* XXX: need has_b_frame, but cannot get it if the codec is
1276      *  not initialized */
1277     if (delay &&
1278         pc && pc->pict_type != AV_PICTURE_TYPE_B)
1279         presentation_delayed = 1;
1280
1281     if (pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE &&
1282         st->pts_wrap_bits < 63 &&
1283         pkt->dts - (1LL << (st->pts_wrap_bits - 1)) > pkt->pts) {
1284         if (is_relative(st->cur_dts) || pkt->dts - (1LL<<(st->pts_wrap_bits - 1)) > st->cur_dts) {
1285             pkt->dts -= 1LL << st->pts_wrap_bits;
1286         } else
1287             pkt->pts += 1LL << st->pts_wrap_bits;
1288     }
1289
1290     /* Some MPEG-2 in MPEG-PS lack dts (issue #171 / input_file.mpg).
1291      * We take the conservative approach and discard both.
1292      * Note: If this is misbehaving for an H.264 file, then possibly
1293      * presentation_delayed is not set correctly. */
1294     if (delay == 1 && pkt->dts == pkt->pts &&
1295         pkt->dts != AV_NOPTS_VALUE && presentation_delayed) {
1296         av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1297         if (    strcmp(s->iformat->name, "mov,mp4,m4a,3gp,3g2,mj2")
1298              && strcmp(s->iformat->name, "flv")) // otherwise we discard correct timestamps for vc1-wmapro.ism
1299             pkt->dts = AV_NOPTS_VALUE;
1300     }
1301
1302     duration = av_mul_q((AVRational) {pkt->duration, 1}, st->time_base);
1303     if (pkt->duration == 0) {
1304         ff_compute_frame_duration(s, &num, &den, st, pc, pkt);
1305         if (den && num) {
1306             duration = (AVRational) {num, den};
1307             pkt->duration = av_rescale_rnd(1,
1308                                            num * (int64_t) st->time_base.den,
1309                                            den * (int64_t) st->time_base.num,
1310                                            AV_ROUND_DOWN);
1311         }
1312     }
1313
1314     if (pkt->duration != 0 && (s->internal->packet_buffer || s->internal->parse_queue))
1315         update_initial_durations(s, st, pkt->stream_index, pkt->duration);
1316
1317     /* Correct timestamps with byte offset if demuxers only have timestamps
1318      * on packet boundaries */
1319     if (pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size) {
1320         /* this will estimate bitrate based on this frame's duration and size */
1321         offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1322         if (pkt->pts != AV_NOPTS_VALUE)
1323             pkt->pts += offset;
1324         if (pkt->dts != AV_NOPTS_VALUE)
1325             pkt->dts += offset;
1326     }
1327
1328     /* This may be redundant, but it should not hurt. */
1329     if (pkt->dts != AV_NOPTS_VALUE &&
1330         pkt->pts != AV_NOPTS_VALUE &&
1331         pkt->pts > pkt->dts)
1332         presentation_delayed = 1;
1333
1334     if (s->debug & FF_FDEBUG_TS)
1335         av_log(s, AV_LOG_DEBUG,
1336             "IN delayed:%d pts:%s, dts:%s cur_dts:%s st:%d pc:%p duration:%"PRId64" delay:%d onein_oneout:%d\n",
1337             presentation_delayed, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts),
1338             pkt->stream_index, pc, pkt->duration, delay, onein_oneout);
1339
1340     /* Interpolate PTS and DTS if they are not present. We skip H264
1341      * currently because delay and has_b_frames are not reliably set. */
1342     if ((delay == 0 || (delay == 1 && pc)) &&
1343         onein_oneout) {
1344         if (presentation_delayed) {
1345             /* DTS = decompression timestamp */
1346             /* PTS = presentation timestamp */
1347             if (pkt->dts == AV_NOPTS_VALUE)
1348                 pkt->dts = st->last_IP_pts;
1349             update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1350             if (pkt->dts == AV_NOPTS_VALUE)
1351                 pkt->dts = st->cur_dts;
1352
1353             /* This is tricky: the dts must be incremented by the duration
1354              * of the frame we are displaying, i.e. the last I- or P-frame. */
1355             if (st->last_IP_duration == 0 && (uint64_t)pkt->duration <= INT32_MAX)
1356                 st->last_IP_duration = pkt->duration;
1357             if (pkt->dts != AV_NOPTS_VALUE)
1358                 st->cur_dts = pkt->dts + st->last_IP_duration;
1359             if (pkt->dts != AV_NOPTS_VALUE &&
1360                 pkt->pts == AV_NOPTS_VALUE &&
1361                 st->last_IP_duration > 0 &&
1362                 ((uint64_t)st->cur_dts - (uint64_t)next_dts + 1) <= 2 &&
1363                 next_dts != next_pts &&
1364                 next_pts != AV_NOPTS_VALUE)
1365                 pkt->pts = next_dts;
1366
1367             if ((uint64_t)pkt->duration <= INT32_MAX)
1368                 st->last_IP_duration = pkt->duration;
1369             st->last_IP_pts      = pkt->pts;
1370             /* Cannot compute PTS if not present (we can compute it only
1371              * by knowing the future. */
1372         } else if (pkt->pts != AV_NOPTS_VALUE ||
1373                    pkt->dts != AV_NOPTS_VALUE ||
1374                    pkt->duration                ) {
1375
1376             /* presentation is not delayed : PTS and DTS are the same */
1377             if (pkt->pts == AV_NOPTS_VALUE)
1378                 pkt->pts = pkt->dts;
1379             update_initial_timestamps(s, pkt->stream_index, pkt->pts,
1380                                       pkt->pts, pkt);
1381             if (pkt->pts == AV_NOPTS_VALUE)
1382                 pkt->pts = st->cur_dts;
1383             pkt->dts = pkt->pts;
1384             if (pkt->pts != AV_NOPTS_VALUE)
1385                 st->cur_dts = av_add_stable(st->time_base, pkt->pts, duration, 1);
1386         }
1387     }
1388
1389     if (pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
1390         st->pts_buffer[0] = pkt->pts;
1391         for (i = 0; i<delay && st->pts_buffer[i] > st->pts_buffer[i + 1]; i++)
1392             FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i + 1]);
1393
1394         if(has_decode_delay_been_guessed(st))
1395             pkt->dts = select_from_pts_buffer(st, st->pts_buffer, pkt->dts);
1396     }
1397     // We skipped it above so we try here.
1398     if (!onein_oneout)
1399         // This should happen on the first packet
1400         update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1401     if (pkt->dts > st->cur_dts)
1402         st->cur_dts = pkt->dts;
1403
1404     if (s->debug & FF_FDEBUG_TS)
1405         av_log(s, AV_LOG_DEBUG, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s st:%d (%d)\n",
1406             presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts), st->index, st->id);
1407
1408     /* update flags */
1409     if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA || is_intra_only(st->codecpar->codec_id))
1410         pkt->flags |= AV_PKT_FLAG_KEY;
1411 #if FF_API_CONVERGENCE_DURATION
1412 FF_DISABLE_DEPRECATION_WARNINGS
1413     if (pc)
1414         pkt->convergence_duration = pc->convergence_duration;
1415 FF_ENABLE_DEPRECATION_WARNINGS
1416 #endif
1417 }
1418
1419 void ff_packet_list_free(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end)
1420 {
1421     AVPacketList *tmp = *pkt_buf;
1422
1423     while (tmp) {
1424         AVPacketList *pktl = tmp;
1425         tmp = pktl->next;
1426         av_packet_unref(&pktl->pkt);
1427         av_freep(&pktl);
1428     }
1429     *pkt_buf     = NULL;
1430     *pkt_buf_end = NULL;
1431 }
1432
1433 /**
1434  * Parse a packet, add all split parts to parse_queue.
1435  *
1436  * @param pkt Packet to parse, NULL when flushing the parser at end of stream.
1437  */
1438 static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index)
1439 {
1440     AVPacket out_pkt = { 0 }, flush_pkt = { 0 };
1441     AVStream *st = s->streams[stream_index];
1442     uint8_t *data = pkt ? pkt->data : NULL;
1443     int size      = pkt ? pkt->size : 0;
1444     int ret = 0, got_output = 0;
1445
1446     if (!pkt) {
1447         av_init_packet(&flush_pkt);
1448         pkt        = &flush_pkt;
1449         got_output = 1;
1450     } else if (!size && st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) {
1451         // preserve 0-size sync packets
1452         compute_pkt_fields(s, st, st->parser, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
1453     }
1454
1455     while (size > 0 || (pkt == &flush_pkt && got_output)) {
1456         int len;
1457         int64_t next_pts = pkt->pts;
1458         int64_t next_dts = pkt->dts;
1459
1460         av_init_packet(&out_pkt);
1461         len = av_parser_parse2(st->parser, st->internal->avctx,
1462                                &out_pkt.data, &out_pkt.size, data, size,
1463                                pkt->pts, pkt->dts, pkt->pos);
1464
1465         pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1466         pkt->pos = -1;
1467         /* increment read pointer */
1468         data += len;
1469         size -= len;
1470
1471         got_output = !!out_pkt.size;
1472
1473         if (!out_pkt.size)
1474             continue;
1475
1476         if (pkt->buf && out_pkt.data == pkt->data) {
1477             /* reference pkt->buf only when out_pkt.data is guaranteed to point
1478              * to data in it and not in the parser's internal buffer. */
1479             /* XXX: Ensure this is the case with all parsers when st->parser->flags
1480              * is PARSER_FLAG_COMPLETE_FRAMES and check for that instead? */
1481             out_pkt.buf = av_buffer_ref(pkt->buf);
1482             if (!out_pkt.buf) {
1483                 ret = AVERROR(ENOMEM);
1484                 goto fail;
1485             }
1486         } else {
1487             ret = av_packet_make_refcounted(&out_pkt);
1488             if (ret < 0)
1489                 goto fail;
1490         }
1491
1492         if (pkt->side_data) {
1493             out_pkt.side_data       = pkt->side_data;
1494             out_pkt.side_data_elems = pkt->side_data_elems;
1495             pkt->side_data          = NULL;
1496             pkt->side_data_elems    = 0;
1497         }
1498
1499         /* set the duration */
1500         out_pkt.duration = (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->duration : 0;
1501         if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
1502             if (st->internal->avctx->sample_rate > 0) {
1503                 out_pkt.duration =
1504                     av_rescale_q_rnd(st->parser->duration,
1505                                      (AVRational) { 1, st->internal->avctx->sample_rate },
1506                                      st->time_base,
1507                                      AV_ROUND_DOWN);
1508             }
1509         }
1510
1511         out_pkt.stream_index = st->index;
1512         out_pkt.pts          = st->parser->pts;
1513         out_pkt.dts          = st->parser->dts;
1514         out_pkt.pos          = st->parser->pos;
1515         out_pkt.flags       |= pkt->flags & AV_PKT_FLAG_DISCARD;
1516
1517         if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1518             out_pkt.pos = st->parser->frame_offset;
1519
1520         if (st->parser->key_frame == 1 ||
1521             (st->parser->key_frame == -1 &&
1522              st->parser->pict_type == AV_PICTURE_TYPE_I))
1523             out_pkt.flags |= AV_PKT_FLAG_KEY;
1524
1525         if (st->parser->key_frame == -1 && st->parser->pict_type ==AV_PICTURE_TYPE_NONE && (pkt->flags&AV_PKT_FLAG_KEY))
1526             out_pkt.flags |= AV_PKT_FLAG_KEY;
1527
1528         compute_pkt_fields(s, st, st->parser, &out_pkt, next_dts, next_pts);
1529
1530         ret = ff_packet_list_put(&s->internal->parse_queue,
1531                                  &s->internal->parse_queue_end,
1532                                  &out_pkt, 0);
1533         if (ret < 0) {
1534             av_packet_unref(&out_pkt);
1535             goto fail;
1536         }
1537     }
1538
1539     /* end of the stream => close and free the parser */
1540     if (pkt == &flush_pkt) {
1541         av_parser_close(st->parser);
1542         st->parser = NULL;
1543     }
1544
1545 fail:
1546     av_packet_unref(pkt);
1547     return ret;
1548 }
1549
1550 int ff_packet_list_get(AVPacketList **pkt_buffer,
1551                        AVPacketList **pkt_buffer_end,
1552                        AVPacket      *pkt)
1553 {
1554     AVPacketList *pktl;
1555     av_assert0(*pkt_buffer);
1556     pktl        = *pkt_buffer;
1557     *pkt        = pktl->pkt;
1558     *pkt_buffer = pktl->next;
1559     if (!pktl->next)
1560         *pkt_buffer_end = NULL;
1561     av_freep(&pktl);
1562     return 0;
1563 }
1564
1565 static int64_t ts_to_samples(AVStream *st, int64_t ts)
1566 {
1567     return av_rescale(ts, st->time_base.num * st->codecpar->sample_rate, st->time_base.den);
1568 }
1569
1570 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1571 {
1572     int ret = 0, i, got_packet = 0;
1573     AVDictionary *metadata = NULL;
1574
1575     av_init_packet(pkt);
1576
1577     while (!got_packet && !s->internal->parse_queue) {
1578         AVStream *st;
1579         AVPacket cur_pkt;
1580
1581         /* read next packet */
1582         ret = ff_read_packet(s, &cur_pkt);
1583         if (ret < 0) {
1584             if (ret == AVERROR(EAGAIN))
1585                 return ret;
1586             /* flush the parsers */
1587             for (i = 0; i < s->nb_streams; i++) {
1588                 st = s->streams[i];
1589                 if (st->parser && st->need_parsing)
1590                     parse_packet(s, NULL, st->index);
1591             }
1592             /* all remaining packets are now in parse_queue =>
1593              * really terminate parsing */
1594             break;
1595         }
1596         ret = 0;
1597         st  = s->streams[cur_pkt.stream_index];
1598
1599         /* update context if required */
1600         if (st->internal->need_context_update) {
1601             if (avcodec_is_open(st->internal->avctx)) {
1602                 av_log(s, AV_LOG_DEBUG, "Demuxer context update while decoder is open, closing and trying to re-open\n");
1603                 avcodec_close(st->internal->avctx);
1604                 st->info->found_decoder = 0;
1605             }
1606
1607             /* close parser, because it depends on the codec */
1608             if (st->parser && st->internal->avctx->codec_id != st->codecpar->codec_id) {
1609                 av_parser_close(st->parser);
1610                 st->parser = NULL;
1611             }
1612
1613             ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
1614             if (ret < 0)
1615                 return ret;
1616
1617 #if FF_API_LAVF_AVCTX
1618 FF_DISABLE_DEPRECATION_WARNINGS
1619             /* update deprecated public codec context */
1620             ret = avcodec_parameters_to_context(st->codec, st->codecpar);
1621             if (ret < 0)
1622                 return ret;
1623 FF_ENABLE_DEPRECATION_WARNINGS
1624 #endif
1625
1626             st->internal->need_context_update = 0;
1627         }
1628
1629         if (cur_pkt.pts != AV_NOPTS_VALUE &&
1630             cur_pkt.dts != AV_NOPTS_VALUE &&
1631             cur_pkt.pts < cur_pkt.dts) {
1632             av_log(s, AV_LOG_WARNING,
1633                    "Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
1634                    cur_pkt.stream_index,
1635                    av_ts2str(cur_pkt.pts),
1636                    av_ts2str(cur_pkt.dts),
1637                    cur_pkt.size);
1638         }
1639         if (s->debug & FF_FDEBUG_TS)
1640             av_log(s, AV_LOG_DEBUG,
1641                    "ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%"PRId64", flags=%d\n",
1642                    cur_pkt.stream_index,
1643                    av_ts2str(cur_pkt.pts),
1644                    av_ts2str(cur_pkt.dts),
1645                    cur_pkt.size, cur_pkt.duration, cur_pkt.flags);
1646
1647         if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1648             st->parser = av_parser_init(st->codecpar->codec_id);
1649             if (!st->parser) {
1650                 av_log(s, AV_LOG_VERBOSE, "parser not found for codec "
1651                        "%s, packets or times may be invalid.\n",
1652                        avcodec_get_name(st->codecpar->codec_id));
1653                 /* no parser available: just output the raw packets */
1654                 st->need_parsing = AVSTREAM_PARSE_NONE;
1655             } else if (st->need_parsing == AVSTREAM_PARSE_HEADERS)
1656                 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1657             else if (st->need_parsing == AVSTREAM_PARSE_FULL_ONCE)
1658                 st->parser->flags |= PARSER_FLAG_ONCE;
1659             else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
1660                 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
1661         }
1662
1663         if (!st->need_parsing || !st->parser) {
1664             /* no parsing needed: we just output the packet as is */
1665             *pkt = cur_pkt;
1666             compute_pkt_fields(s, st, NULL, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
1667             if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1668                 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1669                 ff_reduce_index(s, st->index);
1670                 av_add_index_entry(st, pkt->pos, pkt->dts,
1671                                    0, 0, AVINDEX_KEYFRAME);
1672             }
1673             got_packet = 1;
1674         } else if (st->discard < AVDISCARD_ALL) {
1675             if ((ret = parse_packet(s, &cur_pkt, cur_pkt.stream_index)) < 0)
1676                 return ret;
1677             st->codecpar->sample_rate = st->internal->avctx->sample_rate;
1678             st->codecpar->bit_rate = st->internal->avctx->bit_rate;
1679             st->codecpar->channels = st->internal->avctx->channels;
1680             st->codecpar->channel_layout = st->internal->avctx->channel_layout;
1681             st->codecpar->codec_id = st->internal->avctx->codec_id;
1682         } else {
1683             /* free packet */
1684             av_packet_unref(&cur_pkt);
1685         }
1686         if (pkt->flags & AV_PKT_FLAG_KEY)
1687             st->skip_to_keyframe = 0;
1688         if (st->skip_to_keyframe) {
1689             av_packet_unref(&cur_pkt);
1690             if (got_packet) {
1691                 *pkt = cur_pkt;
1692             }
1693             got_packet = 0;
1694         }
1695     }
1696
1697     if (!got_packet && s->internal->parse_queue)
1698         ret = ff_packet_list_get(&s->internal->parse_queue, &s->internal->parse_queue_end, pkt);
1699
1700     if (ret >= 0) {
1701         AVStream *st = s->streams[pkt->stream_index];
1702         int discard_padding = 0;
1703         if (st->first_discard_sample && pkt->pts != AV_NOPTS_VALUE) {
1704             int64_t pts = pkt->pts - (is_relative(pkt->pts) ? RELATIVE_TS_BASE : 0);
1705             int64_t sample = ts_to_samples(st, pts);
1706             int duration = ts_to_samples(st, pkt->duration);
1707             int64_t end_sample = sample + duration;
1708             if (duration > 0 && end_sample >= st->first_discard_sample &&
1709                 sample < st->last_discard_sample)
1710                 discard_padding = FFMIN(end_sample - st->first_discard_sample, duration);
1711         }
1712         if (st->start_skip_samples && (pkt->pts == 0 || pkt->pts == RELATIVE_TS_BASE))
1713             st->skip_samples = st->start_skip_samples;
1714         if (st->skip_samples || discard_padding) {
1715             uint8_t *p = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
1716             if (p) {
1717                 AV_WL32(p, st->skip_samples);
1718                 AV_WL32(p + 4, discard_padding);
1719                 av_log(s, AV_LOG_DEBUG, "demuxer injecting skip %d / discard %d\n", st->skip_samples, discard_padding);
1720             }
1721             st->skip_samples = 0;
1722         }
1723
1724         if (st->inject_global_side_data) {
1725             for (i = 0; i < st->nb_side_data; i++) {
1726                 AVPacketSideData *src_sd = &st->side_data[i];
1727                 uint8_t *dst_data;
1728
1729                 if (av_packet_get_side_data(pkt, src_sd->type, NULL))
1730                     continue;
1731
1732                 dst_data = av_packet_new_side_data(pkt, src_sd->type, src_sd->size);
1733                 if (!dst_data) {
1734                     av_log(s, AV_LOG_WARNING, "Could not inject global side data\n");
1735                     continue;
1736                 }
1737
1738                 memcpy(dst_data, src_sd->data, src_sd->size);
1739             }
1740             st->inject_global_side_data = 0;
1741         }
1742     }
1743
1744     av_opt_get_dict_val(s, "metadata", AV_OPT_SEARCH_CHILDREN, &metadata);
1745     if (metadata) {
1746         s->event_flags |= AVFMT_EVENT_FLAG_METADATA_UPDATED;
1747         av_dict_copy(&s->metadata, metadata, 0);
1748         av_dict_free(&metadata);
1749         av_opt_set_dict_val(s, "metadata", NULL, AV_OPT_SEARCH_CHILDREN);
1750     }
1751
1752 #if FF_API_LAVF_AVCTX
1753     update_stream_avctx(s);
1754 #endif
1755
1756     if (s->debug & FF_FDEBUG_TS)
1757         av_log(s, AV_LOG_DEBUG,
1758                "read_frame_internal stream=%d, pts=%s, dts=%s, "
1759                "size=%d, duration=%"PRId64", flags=%d\n",
1760                pkt->stream_index,
1761                av_ts2str(pkt->pts),
1762                av_ts2str(pkt->dts),
1763                pkt->size, pkt->duration, pkt->flags);
1764
1765     return ret;
1766 }
1767
1768 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1769 {
1770     const int genpts = s->flags & AVFMT_FLAG_GENPTS;
1771     int eof = 0;
1772     int ret;
1773     AVStream *st;
1774
1775     if (!genpts) {
1776         ret = s->internal->packet_buffer
1777               ? ff_packet_list_get(&s->internal->packet_buffer,
1778                                         &s->internal->packet_buffer_end, pkt)
1779               : read_frame_internal(s, pkt);
1780         if (ret < 0)
1781             return ret;
1782         goto return_packet;
1783     }
1784
1785     for (;;) {
1786         AVPacketList *pktl = s->internal->packet_buffer;
1787
1788         if (pktl) {
1789             AVPacket *next_pkt = &pktl->pkt;
1790
1791             if (next_pkt->dts != AV_NOPTS_VALUE) {
1792                 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1793                 // last dts seen for this stream. if any of packets following
1794                 // current one had no dts, we will set this to AV_NOPTS_VALUE.
1795                 int64_t last_dts = next_pkt->dts;
1796                 av_assert2(wrap_bits <= 64);
1797                 while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
1798                     if (pktl->pkt.stream_index == next_pkt->stream_index &&
1799                         av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2ULL << (wrap_bits - 1)) < 0) {
1800                         if (av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2ULL << (wrap_bits - 1))) {
1801                             // not B-frame
1802                             next_pkt->pts = pktl->pkt.dts;
1803                         }
1804                         if (last_dts != AV_NOPTS_VALUE) {
1805                             // Once last dts was set to AV_NOPTS_VALUE, we don't change it.
1806                             last_dts = pktl->pkt.dts;
1807                         }
1808                     }
1809                     pktl = pktl->next;
1810                 }
1811                 if (eof && next_pkt->pts == AV_NOPTS_VALUE && last_dts != AV_NOPTS_VALUE) {
1812                     // Fixing the last reference frame had none pts issue (For MXF etc).
1813                     // We only do this when
1814                     // 1. eof.
1815                     // 2. we are not able to resolve a pts value for current packet.
1816                     // 3. the packets for this stream at the end of the files had valid dts.
1817                     next_pkt->pts = last_dts + next_pkt->duration;
1818                 }
1819                 pktl = s->internal->packet_buffer;
1820             }
1821
1822             /* read packet from packet buffer, if there is data */
1823             st = s->streams[next_pkt->stream_index];
1824             if (!(next_pkt->pts == AV_NOPTS_VALUE && st->discard < AVDISCARD_ALL &&
1825                   next_pkt->dts != AV_NOPTS_VALUE && !eof)) {
1826                 ret = ff_packet_list_get(&s->internal->packet_buffer,
1827                                                &s->internal->packet_buffer_end, pkt);
1828                 goto return_packet;
1829             }
1830         }
1831
1832         ret = read_frame_internal(s, pkt);
1833         if (ret < 0) {
1834             if (pktl && ret != AVERROR(EAGAIN)) {
1835                 eof = 1;
1836                 continue;
1837             } else
1838                 return ret;
1839         }
1840
1841         ret = ff_packet_list_put(&s->internal->packet_buffer,
1842                                  &s->internal->packet_buffer_end,
1843                                  pkt, FF_PACKETLIST_FLAG_REF_PACKET);
1844         av_packet_unref(pkt);
1845         if (ret < 0)
1846             return ret;
1847     }
1848
1849 return_packet:
1850
1851     st = s->streams[pkt->stream_index];
1852     if ((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY) {
1853         ff_reduce_index(s, st->index);
1854         av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1855     }
1856
1857     if (is_relative(pkt->dts))
1858         pkt->dts -= RELATIVE_TS_BASE;
1859     if (is_relative(pkt->pts))
1860         pkt->pts -= RELATIVE_TS_BASE;
1861
1862     return ret;
1863 }
1864
1865 /* XXX: suppress the packet queue */
1866 static void flush_packet_queue(AVFormatContext *s)
1867 {
1868     if (!s->internal)
1869         return;
1870     ff_packet_list_free(&s->internal->parse_queue,       &s->internal->parse_queue_end);
1871     ff_packet_list_free(&s->internal->packet_buffer,     &s->internal->packet_buffer_end);
1872     ff_packet_list_free(&s->internal->raw_packet_buffer, &s->internal->raw_packet_buffer_end);
1873
1874     s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1875 }
1876
1877 /*******************************************************/
1878 /* seek support */
1879
1880 int av_find_default_stream_index(AVFormatContext *s)
1881 {
1882     int i;
1883     AVStream *st;
1884     int best_stream = 0;
1885     int best_score = INT_MIN;
1886
1887     if (s->nb_streams <= 0)
1888         return -1;
1889     for (i = 0; i < s->nb_streams; i++) {
1890         int score = 0;
1891         st = s->streams[i];
1892         if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
1893             if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
1894                 score -= 400;
1895             if (st->codecpar->width && st->codecpar->height)
1896                 score += 50;
1897             score+= 25;
1898         }
1899         if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
1900             if (st->codecpar->sample_rate)
1901                 score += 50;
1902         }
1903         if (st->codec_info_nb_frames)
1904             score += 12;
1905
1906         if (st->discard != AVDISCARD_ALL)
1907             score += 200;
1908
1909         if (score > best_score) {
1910             best_score = score;
1911             best_stream = i;
1912         }
1913     }
1914     return best_stream;
1915 }
1916
1917 /** Flush the frame reader. */
1918 void ff_read_frame_flush(AVFormatContext *s)
1919 {
1920     AVStream *st;
1921     int i, j;
1922
1923     flush_packet_queue(s);
1924
1925     /* Reset read state for each stream. */
1926     for (i = 0; i < s->nb_streams; i++) {
1927         st = s->streams[i];
1928
1929         if (st->parser) {
1930             av_parser_close(st->parser);
1931             st->parser = NULL;
1932         }
1933         st->last_IP_pts = AV_NOPTS_VALUE;
1934         st->last_dts_for_order_check = AV_NOPTS_VALUE;
1935         if (st->first_dts == AV_NOPTS_VALUE)
1936             st->cur_dts = RELATIVE_TS_BASE;
1937         else
1938             /* We set the current DTS to an unspecified origin. */
1939             st->cur_dts = AV_NOPTS_VALUE;
1940
1941         st->probe_packets = MAX_PROBE_PACKETS;
1942
1943         for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
1944             st->pts_buffer[j] = AV_NOPTS_VALUE;
1945
1946         if (s->internal->inject_global_side_data)
1947             st->inject_global_side_data = 1;
1948
1949         st->skip_samples = 0;
1950     }
1951 }
1952
1953 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1954 {
1955     int i;
1956
1957     for (i = 0; i < s->nb_streams; i++) {
1958         AVStream *st = s->streams[i];
1959
1960         st->cur_dts =
1961             av_rescale(timestamp,
1962                        st->time_base.den * (int64_t) ref_st->time_base.num,
1963                        st->time_base.num * (int64_t) ref_st->time_base.den);
1964     }
1965 }
1966
1967 void ff_reduce_index(AVFormatContext *s, int stream_index)
1968 {
1969     AVStream *st             = s->streams[stream_index];
1970     unsigned int max_entries = s->max_index_size / sizeof(AVIndexEntry);
1971
1972     if ((unsigned) st->nb_index_entries >= max_entries) {
1973         int i;
1974         for (i = 0; 2 * i < st->nb_index_entries; i++)
1975             st->index_entries[i] = st->index_entries[2 * i];
1976         st->nb_index_entries = i;
1977     }
1978 }
1979
1980 int ff_add_index_entry(AVIndexEntry **index_entries,
1981                        int *nb_index_entries,
1982                        unsigned int *index_entries_allocated_size,
1983                        int64_t pos, int64_t timestamp,
1984                        int size, int distance, int flags)
1985 {
1986     AVIndexEntry *entries, *ie;
1987     int index;
1988
1989     if ((unsigned) *nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1990         return -1;
1991
1992     if (timestamp == AV_NOPTS_VALUE)
1993         return AVERROR(EINVAL);
1994
1995     if (size < 0 || size > 0x3FFFFFFF)
1996         return AVERROR(EINVAL);
1997
1998     if (is_relative(timestamp)) //FIXME this maintains previous behavior but we should shift by the correct offset once known
1999         timestamp -= RELATIVE_TS_BASE;
2000
2001     entries = av_fast_realloc(*index_entries,
2002                               index_entries_allocated_size,
2003                               (*nb_index_entries + 1) *
2004                               sizeof(AVIndexEntry));
2005     if (!entries)
2006         return -1;
2007
2008     *index_entries = entries;
2009
2010     index = ff_index_search_timestamp(*index_entries, *nb_index_entries,
2011                                       timestamp, AVSEEK_FLAG_ANY);
2012
2013     if (index < 0) {
2014         index = (*nb_index_entries)++;
2015         ie    = &entries[index];
2016         av_assert0(index == 0 || ie[-1].timestamp < timestamp);
2017     } else {
2018         ie = &entries[index];
2019         if (ie->timestamp != timestamp) {
2020             if (ie->timestamp <= timestamp)
2021                 return -1;
2022             memmove(entries + index + 1, entries + index,
2023                     sizeof(AVIndexEntry) * (*nb_index_entries - index));
2024             (*nb_index_entries)++;
2025         } else if (ie->pos == pos && distance < ie->min_distance)
2026             // do not reduce the distance
2027             distance = ie->min_distance;
2028     }
2029
2030     ie->pos          = pos;
2031     ie->timestamp    = timestamp;
2032     ie->min_distance = distance;
2033     ie->size         = size;
2034     ie->flags        = flags;
2035
2036     return index;
2037 }
2038
2039 int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp,
2040                        int size, int distance, int flags)
2041 {
2042     timestamp = wrap_timestamp(st, timestamp);
2043     return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
2044                               &st->index_entries_allocated_size, pos,
2045                               timestamp, size, distance, flags);
2046 }
2047
2048 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
2049                               int64_t wanted_timestamp, int flags)
2050 {
2051     int a, b, m;
2052     int64_t timestamp;
2053
2054     a = -1;
2055     b = nb_entries;
2056
2057     // Optimize appending index entries at the end.
2058     if (b && entries[b - 1].timestamp < wanted_timestamp)
2059         a = b - 1;
2060
2061     while (b - a > 1) {
2062         m         = (a + b) >> 1;
2063
2064         // Search for the next non-discarded packet.
2065         while ((entries[m].flags & AVINDEX_DISCARD_FRAME) && m < b && m < nb_entries - 1) {
2066             m++;
2067             if (m == b && entries[m].timestamp >= wanted_timestamp) {
2068                 m = b - 1;
2069                 break;
2070             }
2071         }
2072
2073         timestamp = entries[m].timestamp;
2074         if (timestamp >= wanted_timestamp)
2075             b = m;
2076         if (timestamp <= wanted_timestamp)
2077             a = m;
2078     }
2079     m = (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
2080
2081     if (!(flags & AVSEEK_FLAG_ANY))
2082         while (m >= 0 && m < nb_entries &&
2083                !(entries[m].flags & AVINDEX_KEYFRAME))
2084             m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
2085
2086     if (m == nb_entries)
2087         return -1;
2088     return m;
2089 }
2090
2091 void ff_configure_buffers_for_index(AVFormatContext *s, int64_t time_tolerance)
2092 {
2093     int ist1, ist2;
2094     int64_t pos_delta = 0;
2095     int64_t skip = 0;
2096     //We could use URLProtocol flags here but as many user applications do not use URLProtocols this would be unreliable
2097     const char *proto = avio_find_protocol_name(s->url);
2098
2099     if (!proto) {
2100         av_log(s, AV_LOG_INFO,
2101                "Protocol name not provided, cannot determine if input is local or "
2102                "a network protocol, buffers and access patterns cannot be configured "
2103                "optimally without knowing the protocol\n");
2104     }
2105
2106     if (proto && !(strcmp(proto, "file") && strcmp(proto, "pipe") && strcmp(proto, "cache")))
2107         return;
2108
2109     for (ist1 = 0; ist1 < s->nb_streams; ist1++) {
2110         AVStream *st1 = s->streams[ist1];
2111         for (ist2 = 0; ist2 < s->nb_streams; ist2++) {
2112             AVStream *st2 = s->streams[ist2];
2113             int i1, i2;
2114
2115             if (ist1 == ist2)
2116                 continue;
2117
2118             for (i1 = i2 = 0; i1 < st1->nb_index_entries; i1++) {
2119                 AVIndexEntry *e1 = &st1->index_entries[i1];
2120                 int64_t e1_pts = av_rescale_q(e1->timestamp, st1->time_base, AV_TIME_BASE_Q);
2121
2122                 skip = FFMAX(skip, e1->size);
2123                 for (; i2 < st2->nb_index_entries; i2++) {
2124                     AVIndexEntry *e2 = &st2->index_entries[i2];
2125                     int64_t e2_pts = av_rescale_q(e2->timestamp, st2->time_base, AV_TIME_BASE_Q);
2126                     if (e2_pts - e1_pts < time_tolerance)
2127                         continue;
2128                     pos_delta = FFMAX(pos_delta, e1->pos - e2->pos);
2129                     break;
2130                 }
2131             }
2132         }
2133     }
2134
2135     pos_delta *= 2;
2136     /* XXX This could be adjusted depending on protocol*/
2137     if (s->pb->buffer_size < pos_delta && pos_delta < (1<<24)) {
2138         av_log(s, AV_LOG_VERBOSE, "Reconfiguring buffers to size %"PRId64"\n", pos_delta);
2139         ffio_set_buf_size(s->pb, pos_delta);
2140         s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, pos_delta/2);
2141     }
2142
2143     if (skip < (1<<23)) {
2144         s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, skip);
2145     }
2146 }
2147
2148 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, int flags)
2149 {
2150     return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
2151                                      wanted_timestamp, flags);
2152 }
2153
2154 static int64_t ff_read_timestamp(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit,
2155                                  int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
2156 {
2157     int64_t ts = read_timestamp(s, stream_index, ppos, pos_limit);
2158     if (stream_index >= 0)
2159         ts = wrap_timestamp(s->streams[stream_index], ts);
2160     return ts;
2161 }
2162
2163 int ff_seek_frame_binary(AVFormatContext *s, int stream_index,
2164                          int64_t target_ts, int flags)
2165 {
2166     const AVInputFormat *avif = s->iformat;
2167     int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
2168     int64_t ts_min, ts_max, ts;
2169     int index;
2170     int64_t ret;
2171     AVStream *st;
2172
2173     if (stream_index < 0)
2174         return -1;
2175
2176     av_log(s, AV_LOG_TRACE, "read_seek: %d %s\n", stream_index, av_ts2str(target_ts));
2177
2178     ts_max =
2179     ts_min = AV_NOPTS_VALUE;
2180     pos_limit = -1; // GCC falsely says it may be uninitialized.
2181
2182     st = s->streams[stream_index];
2183     if (st->index_entries) {
2184         AVIndexEntry *e;
2185
2186         /* FIXME: Whole function must be checked for non-keyframe entries in
2187          * index case, especially read_timestamp(). */
2188         index = av_index_search_timestamp(st, target_ts,
2189                                           flags | AVSEEK_FLAG_BACKWARD);
2190         index = FFMAX(index, 0);
2191         e     = &st->index_entries[index];
2192
2193         if (e->timestamp <= target_ts || e->pos == e->min_distance) {
2194             pos_min = e->pos;
2195             ts_min  = e->timestamp;
2196             av_log(s, AV_LOG_TRACE, "using cached pos_min=0x%"PRIx64" dts_min=%s\n",
2197                     pos_min, av_ts2str(ts_min));
2198         } else {
2199             av_assert1(index == 0);
2200         }
2201
2202         index = av_index_search_timestamp(st, target_ts,
2203                                           flags & ~AVSEEK_FLAG_BACKWARD);
2204         av_assert0(index < st->nb_index_entries);
2205         if (index >= 0) {
2206             e = &st->index_entries[index];
2207             av_assert1(e->timestamp >= target_ts);
2208             pos_max   = e->pos;
2209             ts_max    = e->timestamp;
2210             pos_limit = pos_max - e->min_distance;
2211             av_log(s, AV_LOG_TRACE, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64
2212                     " dts_max=%s\n", pos_max, pos_limit, av_ts2str(ts_max));
2213         }
2214     }
2215
2216     pos = ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit,
2217                         ts_min, ts_max, flags, &ts, avif->read_timestamp);
2218     if (pos < 0)
2219         return -1;
2220
2221     /* do the seek */
2222     if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
2223         return ret;
2224
2225     ff_read_frame_flush(s);
2226     ff_update_cur_dts(s, st, ts);
2227
2228     return 0;
2229 }
2230
2231 int ff_find_last_ts(AVFormatContext *s, int stream_index, int64_t *ts, int64_t *pos,
2232                     int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
2233 {
2234     int64_t step = 1024;
2235     int64_t limit, ts_max;
2236     int64_t filesize = avio_size(s->pb);
2237     int64_t pos_max  = filesize - 1;
2238     do {
2239         limit = pos_max;
2240         pos_max = FFMAX(0, (pos_max) - step);
2241         ts_max  = ff_read_timestamp(s, stream_index,
2242                                     &pos_max, limit, read_timestamp);
2243         step   += step;
2244     } while (ts_max == AV_NOPTS_VALUE && 2*limit > step);
2245     if (ts_max == AV_NOPTS_VALUE)
2246         return -1;
2247
2248     for (;;) {
2249         int64_t tmp_pos = pos_max + 1;
2250         int64_t tmp_ts  = ff_read_timestamp(s, stream_index,
2251                                             &tmp_pos, INT64_MAX, read_timestamp);
2252         if (tmp_ts == AV_NOPTS_VALUE)
2253             break;
2254         av_assert0(tmp_pos > pos_max);
2255         ts_max  = tmp_ts;
2256         pos_max = tmp_pos;
2257         if (tmp_pos >= filesize)
2258             break;
2259     }
2260
2261     if (ts)
2262         *ts = ts_max;
2263     if (pos)
2264         *pos = pos_max;
2265
2266     return 0;
2267 }
2268
2269 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
2270                       int64_t pos_min, int64_t pos_max, int64_t pos_limit,
2271                       int64_t ts_min, int64_t ts_max,
2272                       int flags, int64_t *ts_ret,
2273                       int64_t (*read_timestamp)(struct AVFormatContext *, int,
2274                                                 int64_t *, int64_t))
2275 {
2276     int64_t pos, ts;
2277     int64_t start_pos;
2278     int no_change;
2279     int ret;
2280
2281     av_log(s, AV_LOG_TRACE, "gen_seek: %d %s\n", stream_index, av_ts2str(target_ts));
2282
2283     if (ts_min == AV_NOPTS_VALUE) {
2284         pos_min = s->internal->data_offset;
2285         ts_min  = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2286         if (ts_min == AV_NOPTS_VALUE)
2287             return -1;
2288     }
2289
2290     if (ts_min >= target_ts) {
2291         *ts_ret = ts_min;
2292         return pos_min;
2293     }
2294
2295     if (ts_max == AV_NOPTS_VALUE) {
2296         if ((ret = ff_find_last_ts(s, stream_index, &ts_max, &pos_max, read_timestamp)) < 0)
2297             return ret;
2298         pos_limit = pos_max;
2299     }
2300
2301     if (ts_max <= target_ts) {
2302         *ts_ret = ts_max;
2303         return pos_max;
2304     }
2305
2306     av_assert0(ts_min < ts_max);
2307
2308     no_change = 0;
2309     while (pos_min < pos_limit) {
2310         av_log(s, AV_LOG_TRACE,
2311                 "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%s dts_max=%s\n",
2312                 pos_min, pos_max, av_ts2str(ts_min), av_ts2str(ts_max));
2313         av_assert0(pos_limit <= pos_max);
2314
2315         if (no_change == 0) {
2316             int64_t approximate_keyframe_distance = pos_max - pos_limit;
2317             // interpolate position (better than dichotomy)
2318             pos = av_rescale(target_ts - ts_min, pos_max - pos_min,
2319                              ts_max - ts_min) +
2320                   pos_min - approximate_keyframe_distance;
2321         } else if (no_change == 1) {
2322             // bisection if interpolation did not change min / max pos last time
2323             pos = (pos_min + pos_limit) >> 1;
2324         } else {
2325             /* linear search if bisection failed, can only happen if there
2326              * are very few or no keyframes between min/max */
2327             pos = pos_min;
2328         }
2329         if (pos <= pos_min)
2330             pos = pos_min + 1;
2331         else if (pos > pos_limit)
2332             pos = pos_limit;
2333         start_pos = pos;
2334
2335         // May pass pos_limit instead of -1.
2336         ts = ff_read_timestamp(s, stream_index, &pos, INT64_MAX, read_timestamp);
2337         if (pos == pos_max)
2338             no_change++;
2339         else
2340             no_change = 0;
2341         av_log(s, AV_LOG_TRACE, "%"PRId64" %"PRId64" %"PRId64" / %s %s %s"
2342                 " target:%s limit:%"PRId64" start:%"PRId64" noc:%d\n",
2343                 pos_min, pos, pos_max,
2344                 av_ts2str(ts_min), av_ts2str(ts), av_ts2str(ts_max), av_ts2str(target_ts),
2345                 pos_limit, start_pos, no_change);
2346         if (ts == AV_NOPTS_VALUE) {
2347             av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
2348             return -1;
2349         }
2350         if (target_ts <= ts) {
2351             pos_limit = start_pos - 1;
2352             pos_max   = pos;
2353             ts_max    = ts;
2354         }
2355         if (target_ts >= ts) {
2356             pos_min = pos;
2357             ts_min  = ts;
2358         }
2359     }
2360
2361     pos     = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
2362     ts      = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min  : ts_max;
2363 #if 0
2364     pos_min = pos;
2365     ts_min  = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2366     pos_min++;
2367     ts_max = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2368     av_log(s, AV_LOG_TRACE, "pos=0x%"PRIx64" %s<=%s<=%s\n",
2369             pos, av_ts2str(ts_min), av_ts2str(target_ts), av_ts2str(ts_max));
2370 #endif
2371     *ts_ret = ts;
2372     return pos;
2373 }
2374
2375 static int seek_frame_byte(AVFormatContext *s, int stream_index,
2376                            int64_t pos, int flags)
2377 {
2378     int64_t pos_min, pos_max;
2379
2380     pos_min = s->internal->data_offset;
2381     pos_max = avio_size(s->pb) - 1;
2382
2383     if (pos < pos_min)
2384         pos = pos_min;
2385     else if (pos > pos_max)
2386         pos = pos_max;
2387
2388     avio_seek(s->pb, pos, SEEK_SET);
2389
2390     s->io_repositioned = 1;
2391
2392     return 0;
2393 }
2394
2395 static int seek_frame_generic(AVFormatContext *s, int stream_index,
2396                               int64_t timestamp, int flags)
2397 {
2398     int index;
2399     int64_t ret;
2400     AVStream *st;
2401     AVIndexEntry *ie;
2402
2403     st = s->streams[stream_index];
2404
2405     index = av_index_search_timestamp(st, timestamp, flags);
2406
2407     if (index < 0 && st->nb_index_entries &&
2408         timestamp < st->index_entries[0].timestamp)
2409         return -1;
2410
2411     if (index < 0 || index == st->nb_index_entries - 1) {
2412         AVPacket pkt;
2413         int nonkey = 0;
2414
2415         if (st->nb_index_entries) {
2416             av_assert0(st->index_entries);
2417             ie = &st->index_entries[st->nb_index_entries - 1];
2418             if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2419                 return ret;
2420             ff_update_cur_dts(s, st, ie->timestamp);
2421         } else {
2422             if ((ret = avio_seek(s->pb, s->internal->data_offset, SEEK_SET)) < 0)
2423                 return ret;
2424         }
2425         for (;;) {
2426             int read_status;
2427             do {
2428                 read_status = av_read_frame(s, &pkt);
2429             } while (read_status == AVERROR(EAGAIN));
2430             if (read_status < 0)
2431                 break;
2432             if (stream_index == pkt.stream_index && pkt.dts > timestamp) {
2433                 if (pkt.flags & AV_PKT_FLAG_KEY) {
2434                     av_packet_unref(&pkt);
2435                     break;
2436                 }
2437                 if (nonkey++ > 1000 && st->codecpar->codec_id != AV_CODEC_ID_CDGRAPHICS) {
2438                     av_log(s, AV_LOG_ERROR,"seek_frame_generic failed as this stream seems to contain no keyframes after the target timestamp, %d non keyframes found\n", nonkey);
2439                     av_packet_unref(&pkt);
2440                     break;
2441                 }
2442             }
2443             av_packet_unref(&pkt);
2444         }
2445         index = av_index_search_timestamp(st, timestamp, flags);
2446     }
2447     if (index < 0)
2448         return -1;
2449
2450     ff_read_frame_flush(s);
2451     if (s->iformat->read_seek)
2452         if (s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
2453             return 0;
2454     ie = &st->index_entries[index];
2455     if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2456         return ret;
2457     ff_update_cur_dts(s, st, ie->timestamp);
2458
2459     return 0;
2460 }
2461
2462 static int seek_frame_internal(AVFormatContext *s, int stream_index,
2463                                int64_t timestamp, int flags)
2464 {
2465     int ret;
2466     AVStream *st;
2467
2468     if (flags & AVSEEK_FLAG_BYTE) {
2469         if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
2470             return -1;
2471         ff_read_frame_flush(s);
2472         return seek_frame_byte(s, stream_index, timestamp, flags);
2473     }
2474
2475     if (stream_index < 0) {
2476         stream_index = av_find_default_stream_index(s);
2477         if (stream_index < 0)
2478             return -1;
2479
2480         st = s->streams[stream_index];
2481         /* timestamp for default must be expressed in AV_TIME_BASE units */
2482         timestamp = av_rescale(timestamp, st->time_base.den,
2483                                AV_TIME_BASE * (int64_t) st->time_base.num);
2484     }
2485
2486     /* first, we try the format specific seek */
2487     if (s->iformat->read_seek) {
2488         ff_read_frame_flush(s);
2489         ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
2490     } else
2491         ret = -1;
2492     if (ret >= 0)
2493         return 0;
2494
2495     if (s->iformat->read_timestamp &&
2496         !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
2497         ff_read_frame_flush(s);
2498         return ff_seek_frame_binary(s, stream_index, timestamp, flags);
2499     } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
2500         ff_read_frame_flush(s);
2501         return seek_frame_generic(s, stream_index, timestamp, flags);
2502     } else
2503         return -1;
2504 }
2505
2506 int av_seek_frame(AVFormatContext *s, int stream_index,
2507                   int64_t timestamp, int flags)
2508 {
2509     int ret;
2510
2511     if (s->iformat->read_seek2 && !s->iformat->read_seek) {
2512         int64_t min_ts = INT64_MIN, max_ts = INT64_MAX;
2513         if ((flags & AVSEEK_FLAG_BACKWARD))
2514             max_ts = timestamp;
2515         else
2516             min_ts = timestamp;
2517         return avformat_seek_file(s, stream_index, min_ts, timestamp, max_ts,
2518                                   flags & ~AVSEEK_FLAG_BACKWARD);
2519     }
2520
2521     ret = seek_frame_internal(s, stream_index, timestamp, flags);
2522
2523     if (ret >= 0)
2524         ret = avformat_queue_attached_pictures(s);
2525
2526     return ret;
2527 }
2528
2529 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts,
2530                        int64_t ts, int64_t max_ts, int flags)
2531 {
2532     if (min_ts > ts || max_ts < ts)
2533         return -1;
2534     if (stream_index < -1 || stream_index >= (int)s->nb_streams)
2535         return AVERROR(EINVAL);
2536
2537     if (s->seek2any>0)
2538         flags |= AVSEEK_FLAG_ANY;
2539     flags &= ~AVSEEK_FLAG_BACKWARD;
2540
2541     if (s->iformat->read_seek2) {
2542         int ret;
2543         ff_read_frame_flush(s);
2544
2545         if (stream_index == -1 && s->nb_streams == 1) {
2546             AVRational time_base = s->streams[0]->time_base;
2547             ts = av_rescale_q(ts, AV_TIME_BASE_Q, time_base);
2548             min_ts = av_rescale_rnd(min_ts, time_base.den,
2549                                     time_base.num * (int64_t)AV_TIME_BASE,
2550                                     AV_ROUND_UP   | AV_ROUND_PASS_MINMAX);
2551             max_ts = av_rescale_rnd(max_ts, time_base.den,
2552                                     time_base.num * (int64_t)AV_TIME_BASE,
2553                                     AV_ROUND_DOWN | AV_ROUND_PASS_MINMAX);
2554             stream_index = 0;
2555         }
2556
2557         ret = s->iformat->read_seek2(s, stream_index, min_ts,
2558                                      ts, max_ts, flags);
2559
2560         if (ret >= 0)
2561             ret = avformat_queue_attached_pictures(s);
2562         return ret;
2563     }
2564
2565     if (s->iformat->read_timestamp) {
2566         // try to seek via read_timestamp()
2567     }
2568
2569     // Fall back on old API if new is not implemented but old is.
2570     // Note the old API has somewhat different semantics.
2571     if (s->iformat->read_seek || 1) {
2572         int dir = (ts - (uint64_t)min_ts > (uint64_t)max_ts - ts ? AVSEEK_FLAG_BACKWARD : 0);
2573         int ret = av_seek_frame(s, stream_index, ts, flags | dir);
2574         if (ret<0 && ts != min_ts && max_ts != ts) {
2575             ret = av_seek_frame(s, stream_index, dir ? max_ts : min_ts, flags | dir);
2576             if (ret >= 0)
2577                 ret = av_seek_frame(s, stream_index, ts, flags | (dir^AVSEEK_FLAG_BACKWARD));
2578         }
2579         return ret;
2580     }
2581
2582     // try some generic seek like seek_frame_generic() but with new ts semantics
2583     return -1; //unreachable
2584 }
2585
2586 int avformat_flush(AVFormatContext *s)
2587 {
2588     ff_read_frame_flush(s);
2589     return 0;
2590 }
2591
2592 /*******************************************************/
2593
2594 /**
2595  * Return TRUE if the stream has accurate duration in any stream.
2596  *
2597  * @return TRUE if the stream has accurate duration for at least one component.
2598  */
2599 static int has_duration(AVFormatContext *ic)
2600 {
2601     int i;
2602     AVStream *st;
2603
2604     for (i = 0; i < ic->nb_streams; i++) {
2605         st = ic->streams[i];
2606         if (st->duration != AV_NOPTS_VALUE)
2607             return 1;
2608     }
2609     if (ic->duration != AV_NOPTS_VALUE)
2610         return 1;
2611     return 0;
2612 }
2613
2614 /**
2615  * Estimate the stream timings from the one of each components.
2616  *
2617  * Also computes the global bitrate if possible.
2618  */
2619 static void update_stream_timings(AVFormatContext *ic)
2620 {
2621     int64_t start_time, start_time1, start_time_text, end_time, end_time1, end_time_text;
2622     int64_t duration, duration1, duration_text, filesize;
2623     int i;
2624     AVProgram *p;
2625
2626     start_time = INT64_MAX;
2627     start_time_text = INT64_MAX;
2628     end_time   = INT64_MIN;
2629     end_time_text   = INT64_MIN;
2630     duration   = INT64_MIN;
2631     duration_text = INT64_MIN;
2632
2633     for (i = 0; i < ic->nb_streams; i++) {
2634         AVStream *st = ic->streams[i];
2635         int is_text = st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE ||
2636                       st->codecpar->codec_type == AVMEDIA_TYPE_DATA;
2637         if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
2638             start_time1 = av_rescale_q(st->start_time, st->time_base,
2639                                        AV_TIME_BASE_Q);
2640             if (is_text)
2641                 start_time_text = FFMIN(start_time_text, start_time1);
2642             else
2643                 start_time = FFMIN(start_time, start_time1);
2644             end_time1 = av_rescale_q_rnd(st->duration, st->time_base,
2645                                          AV_TIME_BASE_Q,
2646                                          AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
2647             if (end_time1 != AV_NOPTS_VALUE && (end_time1 > 0 ? start_time1 <= INT64_MAX - end_time1 : start_time1 >= INT64_MIN - end_time1)) {
2648                 end_time1 += start_time1;
2649                 if (is_text)
2650                     end_time_text = FFMAX(end_time_text, end_time1);
2651                 else
2652                     end_time = FFMAX(end_time, end_time1);
2653             }
2654             for (p = NULL; (p = av_find_program_from_stream(ic, p, i)); ) {
2655                 if (p->start_time == AV_NOPTS_VALUE || p->start_time > start_time1)
2656                     p->start_time = start_time1;
2657                 if (p->end_time < end_time1)
2658                     p->end_time = end_time1;
2659             }
2660         }
2661         if (st->duration != AV_NOPTS_VALUE) {
2662             duration1 = av_rescale_q(st->duration, st->time_base,
2663                                      AV_TIME_BASE_Q);
2664             if (is_text)
2665                 duration_text = FFMAX(duration_text, duration1);
2666             else
2667                 duration = FFMAX(duration, duration1);
2668         }
2669     }
2670     if (start_time == INT64_MAX || (start_time > start_time_text && start_time - (uint64_t)start_time_text < AV_TIME_BASE))
2671         start_time = start_time_text;
2672     else if (start_time > start_time_text)
2673         av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream starttime %f\n", start_time_text / (float)AV_TIME_BASE);
2674
2675     if (end_time == INT64_MIN || (end_time < end_time_text && end_time_text - (uint64_t)end_time < AV_TIME_BASE))
2676         end_time = end_time_text;
2677     else if (end_time < end_time_text)
2678         av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream endtime %f\n", end_time_text / (float)AV_TIME_BASE);
2679
2680      if (duration == INT64_MIN || (duration < duration_text && duration_text - duration < AV_TIME_BASE))
2681          duration = duration_text;
2682      else if (duration < duration_text)
2683          av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream duration %f\n", duration_text / (float)AV_TIME_BASE);
2684
2685     if (start_time != INT64_MAX) {
2686         ic->start_time = start_time;
2687         if (end_time != INT64_MIN) {
2688             if (ic->nb_programs > 1) {
2689                 for (i = 0; i < ic->nb_programs; i++) {
2690                     p = ic->programs[i];
2691                     if (p->start_time != AV_NOPTS_VALUE &&
2692                         p->end_time > p->start_time &&
2693                         p->end_time - (uint64_t)p->start_time <= INT64_MAX)
2694                         duration = FFMAX(duration, p->end_time - p->start_time);
2695                 }
2696             } else if (end_time >= start_time && end_time - (uint64_t)start_time <= INT64_MAX) {
2697                 duration = FFMAX(duration, end_time - start_time);
2698             }
2699         }
2700     }
2701     if (duration != INT64_MIN && duration > 0 && ic->duration == AV_NOPTS_VALUE) {
2702         ic->duration = duration;
2703     }
2704     if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration > 0) {
2705         /* compute the bitrate */
2706         double bitrate = (double) filesize * 8.0 * AV_TIME_BASE /
2707                          (double) ic->duration;
2708         if (bitrate >= 0 && bitrate <= INT64_MAX)
2709             ic->bit_rate = bitrate;
2710     }
2711 }
2712
2713 static void fill_all_stream_timings(AVFormatContext *ic)
2714 {
2715     int i;
2716     AVStream *st;
2717
2718     update_stream_timings(ic);
2719     for (i = 0; i < ic->nb_streams; i++) {
2720         st = ic->streams[i];
2721         if (st->start_time == AV_NOPTS_VALUE) {
2722             if (ic->start_time != AV_NOPTS_VALUE)
2723                 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q,
2724                                               st->time_base);
2725             if (ic->duration != AV_NOPTS_VALUE)
2726                 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q,
2727                                             st->time_base);
2728         }
2729     }
2730 }
2731
2732 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
2733 {
2734     int64_t filesize, duration;
2735     int i, show_warning = 0;
2736     AVStream *st;
2737
2738     /* if bit_rate is already set, we believe it */
2739     if (ic->bit_rate <= 0) {
2740         int64_t bit_rate = 0;
2741         for (i = 0; i < ic->nb_streams; i++) {
2742             st = ic->streams[i];
2743             if (st->codecpar->bit_rate <= 0 && st->internal->avctx->bit_rate > 0)
2744                 st->codecpar->bit_rate = st->internal->avctx->bit_rate;
2745             if (st->codecpar->bit_rate > 0) {
2746                 if (INT64_MAX - st->codecpar->bit_rate < bit_rate) {
2747                     bit_rate = 0;
2748                     break;
2749                 }
2750                 bit_rate += st->codecpar->bit_rate;
2751             } else if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && st->codec_info_nb_frames > 1) {
2752                 // If we have a videostream with packets but without a bitrate
2753                 // then consider the sum not known
2754                 bit_rate = 0;
2755                 break;
2756             }
2757         }
2758         ic->bit_rate = bit_rate;
2759     }
2760
2761     /* if duration is already set, we believe it */
2762     if (ic->duration == AV_NOPTS_VALUE &&
2763         ic->bit_rate != 0) {
2764         filesize = ic->pb ? avio_size(ic->pb) : 0;
2765         if (filesize > ic->internal->data_offset) {
2766             filesize -= ic->internal->data_offset;
2767             for (i = 0; i < ic->nb_streams; i++) {
2768                 st      = ic->streams[i];
2769                 if (   st->time_base.num <= INT64_MAX / ic->bit_rate
2770                     && st->duration == AV_NOPTS_VALUE) {
2771                     duration = av_rescale(8 * filesize, st->time_base.den,
2772                                           ic->bit_rate *
2773                                           (int64_t) st->time_base.num);
2774                     st->duration = duration;
2775                     show_warning = 1;
2776                 }
2777             }
2778         }
2779     }
2780     if (show_warning)
2781         av_log(ic, AV_LOG_WARNING,
2782                "Estimating duration from bitrate, this may be inaccurate\n");
2783 }
2784
2785 #define DURATION_MAX_READ_SIZE 250000LL
2786 #define DURATION_MAX_RETRY 6
2787
2788 /* only usable for MPEG-PS streams */
2789 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2790 {
2791     AVPacket pkt1, *pkt = &pkt1;
2792     AVStream *st;
2793     int num, den, read_size, i, ret;
2794     int found_duration = 0;
2795     int is_end;
2796     int64_t filesize, offset, duration;
2797     int retry = 0;
2798
2799     /* flush packet queue */
2800     flush_packet_queue(ic);
2801
2802     for (i = 0; i < ic->nb_streams; i++) {
2803         st = ic->streams[i];
2804         if (st->start_time == AV_NOPTS_VALUE &&
2805             st->first_dts == AV_NOPTS_VALUE &&
2806             st->codecpar->codec_type != AVMEDIA_TYPE_UNKNOWN)
2807             av_log(ic, AV_LOG_WARNING,
2808                    "start time for stream %d is not set in estimate_timings_from_pts\n", i);
2809
2810         if (st->parser) {
2811             av_parser_close(st->parser);
2812             st->parser = NULL;
2813         }
2814     }
2815
2816     if (ic->skip_estimate_duration_from_pts) {
2817         av_log(ic, AV_LOG_INFO, "Skipping duration calculation in estimate_timings_from_pts\n");
2818         goto skip_duration_calc;
2819     }
2820
2821     av_opt_set(ic, "skip_changes", "1", AV_OPT_SEARCH_CHILDREN);
2822     /* estimate the end time (duration) */
2823     /* XXX: may need to support wrapping */
2824     filesize = ic->pb ? avio_size(ic->pb) : 0;
2825     do {
2826         is_end = found_duration;
2827         offset = filesize - (DURATION_MAX_READ_SIZE << retry);
2828         if (offset < 0)
2829             offset = 0;
2830
2831         avio_seek(ic->pb, offset, SEEK_SET);
2832         read_size = 0;
2833         for (;;) {
2834             if (read_size >= DURATION_MAX_READ_SIZE << (FFMAX(retry - 1, 0)))
2835                 break;
2836
2837             do {
2838                 ret = ff_read_packet(ic, pkt);
2839             } while (ret == AVERROR(EAGAIN));
2840             if (ret != 0)
2841                 break;
2842             read_size += pkt->size;
2843             st         = ic->streams[pkt->stream_index];
2844             if (pkt->pts != AV_NOPTS_VALUE &&
2845                 (st->start_time != AV_NOPTS_VALUE ||
2846                  st->first_dts  != AV_NOPTS_VALUE)) {
2847                 if (pkt->duration == 0) {
2848                     ff_compute_frame_duration(ic, &num, &den, st, st->parser, pkt);
2849                     if (den && num) {
2850                         pkt->duration = av_rescale_rnd(1,
2851                                            num * (int64_t) st->time_base.den,
2852                                            den * (int64_t) st->time_base.num,
2853                                            AV_ROUND_DOWN);
2854                     }
2855                 }
2856                 duration = pkt->pts + pkt->duration;
2857                 found_duration = 1;
2858                 if (st->start_time != AV_NOPTS_VALUE)
2859                     duration -= st->start_time;
2860                 else
2861                     duration -= st->first_dts;
2862                 if (duration > 0) {
2863                     if (st->duration == AV_NOPTS_VALUE || st->info->last_duration<= 0 ||
2864                         (st->duration < duration && FFABS(duration - st->info->last_duration) < 60LL*st->time_base.den / st->time_base.num))
2865                         st->duration = duration;
2866                     st->info->last_duration = duration;
2867                 }
2868             }
2869             av_packet_unref(pkt);
2870         }
2871
2872         /* check if all audio/video streams have valid duration */
2873         if (!is_end) {
2874             is_end = 1;
2875             for (i = 0; i < ic->nb_streams; i++) {
2876                 st = ic->streams[i];
2877                 switch (st->codecpar->codec_type) {
2878                     case AVMEDIA_TYPE_VIDEO:
2879                     case AVMEDIA_TYPE_AUDIO:
2880                         if (st->duration == AV_NOPTS_VALUE)
2881                             is_end = 0;
2882                 }
2883             }
2884         }
2885     } while (!is_end &&
2886              offset &&
2887              ++retry <= DURATION_MAX_RETRY);
2888
2889     av_opt_set(ic, "skip_changes", "0", AV_OPT_SEARCH_CHILDREN);
2890
2891     /* warn about audio/video streams which duration could not be estimated */
2892     for (i = 0; i < ic->nb_streams; i++) {
2893         st = ic->streams[i];
2894         if (st->duration == AV_NOPTS_VALUE) {
2895             switch (st->codecpar->codec_type) {
2896             case AVMEDIA_TYPE_VIDEO:
2897             case AVMEDIA_TYPE_AUDIO:
2898                 if (st->start_time != AV_NOPTS_VALUE || st->first_dts  != AV_NOPTS_VALUE) {
2899                     av_log(ic, AV_LOG_DEBUG, "stream %d : no PTS found at end of file, duration not set\n", i);
2900                 } else
2901                     av_log(ic, AV_LOG_DEBUG, "stream %d : no TS found at start of file, duration not set\n", i);
2902             }
2903         }
2904     }
2905 skip_duration_calc:
2906     fill_all_stream_timings(ic);
2907
2908     avio_seek(ic->pb, old_offset, SEEK_SET);
2909     for (i = 0; i < ic->nb_streams; i++) {
2910         int j;
2911
2912         st              = ic->streams[i];
2913         st->cur_dts     = st->first_dts;
2914         st->last_IP_pts = AV_NOPTS_VALUE;
2915         st->last_dts_for_order_check = AV_NOPTS_VALUE;
2916         for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
2917             st->pts_buffer[j] = AV_NOPTS_VALUE;
2918     }
2919 }
2920
2921 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2922 {
2923     int64_t file_size;
2924
2925     /* get the file size, if possible */
2926     if (ic->iformat->flags & AVFMT_NOFILE) {
2927         file_size = 0;
2928     } else {
2929         file_size = avio_size(ic->pb);
2930         file_size = FFMAX(0, file_size);
2931     }
2932
2933     if ((!strcmp(ic->iformat->name, "mpeg") ||
2934          !strcmp(ic->iformat->name, "mpegts")) &&
2935         file_size && (ic->pb->seekable & AVIO_SEEKABLE_NORMAL)) {
2936         /* get accurate estimate from the PTSes */
2937         estimate_timings_from_pts(ic, old_offset);
2938         ic->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
2939     } else if (has_duration(ic)) {
2940         /* at least one component has timings - we use them for all
2941          * the components */
2942         fill_all_stream_timings(ic);
2943         ic->duration_estimation_method = AVFMT_DURATION_FROM_STREAM;
2944     } else {
2945         /* less precise: use bitrate info */
2946         estimate_timings_from_bit_rate(ic);
2947         ic->duration_estimation_method = AVFMT_DURATION_FROM_BITRATE;
2948     }
2949     update_stream_timings(ic);
2950
2951     {
2952         int i;
2953         AVStream av_unused *st;
2954         for (i = 0; i < ic->nb_streams; i++) {
2955             st = ic->streams[i];
2956             if (st->time_base.den)
2957             av_log(ic, AV_LOG_TRACE, "stream %d: start_time: %0.3f duration: %0.3f\n", i,
2958                    (double) st->start_time * av_q2d(st->time_base),
2959                    (double) st->duration   * av_q2d(st->time_base));
2960         }
2961         av_log(ic, AV_LOG_TRACE,
2962                 "format: start_time: %0.3f duration: %0.3f bitrate=%"PRId64" kb/s\n",
2963                 (double) ic->start_time / AV_TIME_BASE,
2964                 (double) ic->duration   / AV_TIME_BASE,
2965                 (int64_t)ic->bit_rate / 1000);
2966     }
2967 }
2968
2969 static int has_codec_parameters(AVStream *st, const char **errmsg_ptr)
2970 {
2971     AVCodecContext *avctx = st->internal->avctx;
2972
2973 #define FAIL(errmsg) do {                                         \
2974         if (errmsg_ptr)                                           \
2975             *errmsg_ptr = errmsg;                                 \
2976         return 0;                                                 \
2977     } while (0)
2978
2979     if (   avctx->codec_id == AV_CODEC_ID_NONE
2980         && avctx->codec_type != AVMEDIA_TYPE_DATA)
2981         FAIL("unknown codec");
2982     switch (avctx->codec_type) {
2983     case AVMEDIA_TYPE_AUDIO:
2984         if (!avctx->frame_size && determinable_frame_size(avctx))
2985             FAIL("unspecified frame size");
2986         if (st->info->found_decoder >= 0 &&
2987             avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
2988             FAIL("unspecified sample format");
2989         if (!avctx->sample_rate)
2990             FAIL("unspecified sample rate");
2991         if (!avctx->channels)
2992             FAIL("unspecified number of channels");
2993         if (st->info->found_decoder >= 0 && !st->nb_decoded_frames && avctx->codec_id == AV_CODEC_ID_DTS)
2994             FAIL("no decodable DTS frames");
2995         break;
2996     case AVMEDIA_TYPE_VIDEO:
2997         if (!avctx->width)
2998             FAIL("unspecified size");
2999         if (st->info->found_decoder >= 0 && avctx->pix_fmt == AV_PIX_FMT_NONE)
3000             FAIL("unspecified pixel format");
3001         if (st->codecpar->codec_id == AV_CODEC_ID_RV30 || st->codecpar->codec_id == AV_CODEC_ID_RV40)
3002             if (!st->sample_aspect_ratio.num && !st->codecpar->sample_aspect_ratio.num && !st->codec_info_nb_frames)
3003                 FAIL("no frame in rv30/40 and no sar");
3004         break;
3005     case AVMEDIA_TYPE_SUBTITLE:
3006         if (avctx->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE && !avctx->width)
3007             FAIL("unspecified size");
3008         break;
3009     case AVMEDIA_TYPE_DATA:
3010         if (avctx->codec_id == AV_CODEC_ID_NONE) return 1;
3011     }
3012
3013     return 1;
3014 }
3015
3016 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
3017 static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
3018                             AVDictionary **options)
3019 {
3020     AVCodecContext *avctx = st->internal->avctx;
3021     const AVCodec *codec;
3022     int got_picture = 1, ret = 0;
3023     AVFrame *frame = av_frame_alloc();
3024     AVSubtitle subtitle;
3025     AVPacket pkt = *avpkt;
3026     int do_skip_frame = 0;
3027     enum AVDiscard skip_frame;
3028
3029     if (!frame)
3030         return AVERROR(ENOMEM);
3031
3032     if (!avcodec_is_open(avctx) &&
3033         st->info->found_decoder <= 0 &&
3034         (st->codecpar->codec_id != -st->info->found_decoder || !st->codecpar->codec_id)) {
3035         AVDictionary *thread_opt = NULL;
3036
3037         codec = find_probe_decoder(s, st, st->codecpar->codec_id);
3038
3039         if (!codec) {
3040             st->info->found_decoder = -st->codecpar->codec_id;
3041             ret                     = -1;
3042             goto fail;
3043         }
3044
3045         /* Force thread count to 1 since the H.264 decoder will not extract
3046          * SPS and PPS to extradata during multi-threaded decoding. */
3047         av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
3048         if (s->codec_whitelist)
3049             av_dict_set(options ? options : &thread_opt, "codec_whitelist", s->codec_whitelist, 0);
3050         ret = avcodec_open2(avctx, codec, options ? options : &thread_opt);
3051         if (!options)
3052             av_dict_free(&thread_opt);
3053         if (ret < 0) {
3054             st->info->found_decoder = -avctx->codec_id;
3055             goto fail;
3056         }
3057         st->info->found_decoder = 1;
3058     } else if (!st->info->found_decoder)
3059         st->info->found_decoder = 1;
3060
3061     if (st->info->found_decoder < 0) {
3062         ret = -1;
3063         goto fail;
3064     }
3065
3066     if (avpriv_codec_get_cap_skip_frame_fill_param(avctx->codec)) {
3067         do_skip_frame = 1;
3068         skip_frame = avctx->skip_frame;
3069         avctx->skip_frame = AVDISCARD_ALL;
3070     }
3071
3072     while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
3073            ret >= 0 &&
3074            (!has_codec_parameters(st, NULL) || !has_decode_delay_been_guessed(st) ||
3075             (!st->codec_info_nb_frames &&
3076              (avctx->codec->capabilities & AV_CODEC_CAP_CHANNEL_CONF)))) {
3077         got_picture = 0;
3078         if (avctx->codec_type == AVMEDIA_TYPE_VIDEO ||
3079             avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
3080             ret = avcodec_send_packet(avctx, &pkt);
3081             if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
3082                 break;
3083             if (ret >= 0)
3084                 pkt.size = 0;
3085             ret = avcodec_receive_frame(avctx, frame);
3086             if (ret >= 0)
3087                 got_picture = 1;
3088             if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
3089                 ret = 0;
3090         } else if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3091             ret = avcodec_decode_subtitle2(avctx, &subtitle,
3092                                            &got_picture, &pkt);
3093             if (ret >= 0)
3094                 pkt.size = 0;
3095         }
3096         if (ret >= 0) {
3097             if (got_picture)
3098                 st->nb_decoded_frames++;
3099             ret       = got_picture;
3100         }
3101     }
3102
3103     if (!pkt.data && !got_picture)
3104         ret = -1;
3105
3106 fail:
3107     if (do_skip_frame) {
3108         avctx->skip_frame = skip_frame;
3109     }
3110
3111     av_frame_free(&frame);
3112     return ret;
3113 }
3114
3115 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id)
3116 {
3117     while (tags->id != AV_CODEC_ID_NONE) {
3118         if (tags->id == id)
3119             return tags->tag;
3120         tags++;
3121     }
3122     return 0;
3123 }
3124
3125 enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
3126 {
3127     int i;
3128     for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
3129         if (tag == tags[i].tag)
3130             return tags[i].id;
3131     for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
3132         if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
3133             return tags[i].id;
3134     return AV_CODEC_ID_NONE;
3135 }
3136
3137 enum AVCodecID ff_get_pcm_codec_id(int bps, int flt, int be, int sflags)
3138 {
3139     if (bps <= 0 || bps > 64)
3140         return AV_CODEC_ID_NONE;
3141
3142     if (flt) {
3143         switch (bps) {
3144         case 32:
3145             return be ? AV_CODEC_ID_PCM_F32BE : AV_CODEC_ID_PCM_F32LE;
3146         case 64:
3147             return be ? AV_CODEC_ID_PCM_F64BE : AV_CODEC_ID_PCM_F64LE;
3148         default:
3149             return AV_CODEC_ID_NONE;
3150         }
3151     } else {
3152         bps  += 7;
3153         bps >>= 3;
3154         if (sflags & (1 << (bps - 1))) {
3155             switch (bps) {
3156             case 1:
3157                 return AV_CODEC_ID_PCM_S8;
3158             case 2:
3159                 return be ? AV_CODEC_ID_PCM_S16BE : AV_CODEC_ID_PCM_S16LE;
3160             case 3:
3161                 return be ? AV_CODEC_ID_PCM_S24BE : AV_CODEC_ID_PCM_S24LE;
3162             case 4:
3163                 return be ? AV_CODEC_ID_PCM_S32BE : AV_CODEC_ID_PCM_S32LE;
3164             case 8:
3165                 return be ? AV_CODEC_ID_PCM_S64BE : AV_CODEC_ID_PCM_S64LE;
3166             default:
3167                 return AV_CODEC_ID_NONE;
3168             }
3169         } else {
3170             switch (bps) {
3171             case 1:
3172                 return AV_CODEC_ID_PCM_U8;
3173             case 2:
3174                 return be ? AV_CODEC_ID_PCM_U16BE : AV_CODEC_ID_PCM_U16LE;
3175             case 3:
3176                 return be ? AV_CODEC_ID_PCM_U24BE : AV_CODEC_ID_PCM_U24LE;
3177             case 4:
3178                 return be ? AV_CODEC_ID_PCM_U32BE : AV_CODEC_ID_PCM_U32LE;
3179             default:
3180                 return AV_CODEC_ID_NONE;
3181             }
3182         }
3183     }
3184 }
3185
3186 unsigned int av_codec_get_tag(const AVCodecTag *const *tags, enum AVCodecID id)
3187 {
3188     unsigned int tag;
3189     if (!av_codec_get_tag2(tags, id, &tag))
3190         return 0;
3191     return tag;
3192 }
3193
3194 int av_codec_get_tag2(const AVCodecTag * const *tags, enum AVCodecID id,
3195                       unsigned int *tag)
3196 {
3197     int i;
3198     for (i = 0; tags && tags[i]; i++) {
3199         const AVCodecTag *codec_tags = tags[i];
3200         while (codec_tags->id != AV_CODEC_ID_NONE) {
3201             if (codec_tags->id == id) {
3202                 *tag = codec_tags->tag;
3203                 return 1;
3204             }
3205             codec_tags++;
3206         }
3207     }
3208     return 0;
3209 }
3210
3211 enum AVCodecID av_codec_get_id(const AVCodecTag *const *tags, unsigned int tag)
3212 {
3213     int i;
3214     for (i = 0; tags && tags[i]; i++) {
3215         enum AVCodecID id = ff_codec_get_id(tags[i], tag);
3216         if (id != AV_CODEC_ID_NONE)
3217             return id;
3218     }
3219     return AV_CODEC_ID_NONE;
3220 }
3221
3222 static void compute_chapters_end(AVFormatContext *s)
3223 {
3224     unsigned int i, j;
3225     int64_t max_time = 0;
3226
3227     if (s->duration > 0 && s->start_time < INT64_MAX - s->duration)
3228         max_time = s->duration +
3229                        ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
3230
3231     for (i = 0; i < s->nb_chapters; i++)
3232         if (s->chapters[i]->end == AV_NOPTS_VALUE) {
3233             AVChapter *ch = s->chapters[i];
3234             int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q,
3235                                                   ch->time_base)
3236                                    : INT64_MAX;
3237
3238             for (j = 0; j < s->nb_chapters; j++) {
3239                 AVChapter *ch1     = s->chapters[j];
3240                 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base,
3241                                                   ch->time_base);
3242                 if (j != i && next_start > ch->start && next_start < end)
3243                     end = next_start;
3244             }
3245             ch->end = (end == INT64_MAX || end < ch->start) ? ch->start : end;
3246         }
3247 }
3248
3249 static int get_std_framerate(int i)
3250 {
3251     if (i < 30*12)
3252         return (i + 1) * 1001;
3253     i -= 30*12;
3254
3255     if (i < 30)
3256         return (i + 31) * 1001 * 12;
3257     i -= 30;
3258
3259     if (i < 3)
3260         return ((const int[]) { 80, 120, 240})[i] * 1001 * 12;
3261
3262     i -= 3;
3263
3264     return ((const int[]) { 24, 30, 60, 12, 15, 48 })[i] * 1000 * 12;
3265 }
3266
3267 /* Is the time base unreliable?
3268  * This is a heuristic to balance between quick acceptance of the values in
3269  * the headers vs. some extra checks.
3270  * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
3271  * MPEG-2 commonly misuses field repeat flags to store different framerates.
3272  * And there are "variable" fps files this needs to detect as well. */
3273 static int tb_unreliable(AVCodecContext *c)
3274 {
3275     if (c->time_base.den >= 101LL * c->time_base.num ||
3276         c->time_base.den <    5LL * c->time_base.num ||
3277         // c->codec_tag == AV_RL32("DIVX") ||
3278         // c->codec_tag == AV_RL32("XVID") ||
3279         c->codec_tag == AV_RL32("mp4v") ||
3280         c->codec_id == AV_CODEC_ID_MPEG2VIDEO ||
3281         c->codec_id == AV_CODEC_ID_GIF ||
3282         c->codec_id == AV_CODEC_ID_HEVC ||
3283         c->codec_id == AV_CODEC_ID_H264)
3284         return 1;
3285     return 0;
3286 }
3287
3288 int ff_alloc_extradata(AVCodecParameters *par, int size)
3289 {
3290     av_freep(&par->extradata);
3291     par->extradata_size = 0;
3292
3293     if (size < 0 || size >= INT32_MAX - AV_INPUT_BUFFER_PADDING_SIZE)
3294         return AVERROR(EINVAL);
3295
3296     par->extradata = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
3297     if (!par->extradata)
3298         return AVERROR(ENOMEM);
3299
3300     memset(par->extradata + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
3301     par->extradata_size = size;
3302
3303     return 0;
3304 }
3305
3306 int ff_get_extradata(AVFormatContext *s, AVCodecParameters *par, AVIOContext *pb, int size)
3307 {
3308     int ret = ff_alloc_extradata(par, size);
3309     if (ret < 0)
3310         return ret;
3311     ret = avio_read(pb, par->extradata, size);
3312     if (ret != size) {
3313         av_freep(&par->extradata);
3314         par->extradata_size = 0;
3315         av_log(s, AV_LOG_ERROR, "Failed to read extradata of size %d\n", size);
3316         return ret < 0 ? ret : AVERROR_INVALIDDATA;
3317     }
3318
3319     return ret;
3320 }
3321
3322 int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
3323 {
3324     int i, j;
3325     int64_t last = st->info->last_dts;
3326
3327     if (   ts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && ts > last
3328        && ts - (uint64_t)last < INT64_MAX) {
3329         double dts = (is_relative(ts) ?  ts - RELATIVE_TS_BASE : ts) * av_q2d(st->time_base);
3330         int64_t duration = ts - last;
3331
3332         if (!st->info->duration_error)
3333             st->info->duration_error = av_mallocz(sizeof(st->info->duration_error[0])*2);
3334         if (!st->info->duration_error)
3335             return AVERROR(ENOMEM);
3336
3337 //         if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
3338 //             av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
3339         for (i = 0; i<MAX_STD_TIMEBASES; i++) {
3340             if (st->info->duration_error[0][1][i] < 1e10) {
3341                 int framerate = get_std_framerate(i);
3342                 double sdts = dts*framerate/(1001*12);
3343                 for (j= 0; j<2; j++) {
3344                     int64_t ticks = llrint(sdts+j*0.5);
3345                     double error= sdts - ticks + j*0.5;
3346                     st->info->duration_error[j][0][i] += error;
3347                     st->info->duration_error[j][1][i] += error*error;
3348                 }
3349             }
3350         }
3351         st->info->duration_count++;
3352         st->info->rfps_duration_sum += duration;
3353
3354         if (st->info->duration_count % 10 == 0) {
3355             int n = st->info->duration_count;
3356             for (i = 0; i<MAX_STD_TIMEBASES; i++) {
3357                 if (st->info->duration_error[0][1][i] < 1e10) {
3358                     double a0     = st->info->duration_error[0][0][i] / n;
3359                     double error0 = st->info->duration_error[0][1][i] / n - a0*a0;
3360                     double a1     = st->info->duration_error[1][0][i] / n;
3361                     double error1 = st->info->duration_error[1][1][i] / n - a1*a1;
3362                     if (error0 > 0.04 && error1 > 0.04) {
3363                         st->info->duration_error[0][1][i] = 2e10;
3364                         st->info->duration_error[1][1][i] = 2e10;
3365                     }
3366                 }
3367             }
3368         }
3369
3370         // ignore the first 4 values, they might have some random jitter
3371         if (st->info->duration_count > 3 && is_relative(ts) == is_relative(last))
3372             st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
3373     }
3374     if (ts != AV_NOPTS_VALUE)
3375         st->info->last_dts = ts;
3376
3377     return 0;
3378 }
3379
3380 void ff_rfps_calculate(AVFormatContext *ic)
3381 {
3382     int i, j;
3383
3384     for (i = 0; i < ic->nb_streams; i++) {
3385         AVStream *st = ic->streams[i];
3386
3387         if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
3388             continue;
3389         // the check for tb_unreliable() is not completely correct, since this is not about handling
3390         // an unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
3391         // ipmovie.c produces.
3392         if (tb_unreliable(st->internal->avctx) && st->info->duration_count > 15 && st->info->duration_gcd > FFMAX(1, st->time_base.den/(500LL*st->time_base.num)) && !st->r_frame_rate.num)
3393             av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, st->time_base.den, st->time_base.num * st->info->duration_gcd, INT_MAX);
3394         if (st->info->duration_count>1 && !st->r_frame_rate.num
3395             && tb_unreliable(st->internal->avctx)) {
3396             int num = 0;
3397             double best_error= 0.01;
3398             AVRational ref_rate = st->r_frame_rate.num ? st->r_frame_rate : av_inv_q(st->time_base);
3399
3400             for (j= 0; j<MAX_STD_TIMEBASES; j++) {
3401                 int k;
3402
3403                 if (st->info->codec_info_duration &&
3404                     st->info->codec_info_duration*av_q2d(st->time_base) < (1001*11.5)/get_std_framerate(j))
3405                     continue;
3406                 if (!st->info->codec_info_duration && get_std_framerate(j) < 1001*12)
3407                     continue;
3408
3409                 if (av_q2d(st->time_base) * st->info->rfps_duration_sum / st->info->duration_count < (1001*12.0 * 0.8)/get_std_framerate(j))
3410                     continue;
3411
3412                 for (k= 0; k<2; k++) {
3413                     int n = st->info->duration_count;
3414                     double a= st->info->duration_error[k][0][j] / n;
3415                     double error= st->info->duration_error[k][1][j]/n - a*a;
3416
3417                     if (error < best_error && best_error> 0.000000001) {
3418                         best_error= error;
3419                         num = get_std_framerate(j);
3420                     }
3421                     if (error < 0.02)
3422                         av_log(ic, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
3423                 }
3424             }
3425             // do not increase frame rate by more than 1 % in order to match a standard rate.
3426             if (num && (!ref_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(ref_rate)))
3427                 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
3428         }
3429         if (   !st->avg_frame_rate.num
3430             && st->r_frame_rate.num && st->info->rfps_duration_sum
3431             && st->info->codec_info_duration <= 0
3432             && st->info->duration_count > 2
3433             && fabs(1.0 / (av_q2d(st->r_frame_rate) * av_q2d(st->time_base)) - st->info->rfps_duration_sum / (double)st->info->duration_count) <= 1.0
3434             ) {
3435             av_log(ic, AV_LOG_DEBUG, "Setting avg frame rate based on r frame rate\n");
3436             st->avg_frame_rate = st->r_frame_rate;
3437         }
3438
3439         av_freep(&st->info->duration_error);
3440         st->info->last_dts = AV_NOPTS_VALUE;
3441         st->info->duration_count = 0;
3442         st->info->rfps_duration_sum = 0;
3443     }
3444 }
3445
3446 static int extract_extradata_check(AVStream *st)
3447 {
3448     const AVBitStreamFilter *f;
3449
3450     f = av_bsf_get_by_name("extract_extradata");
3451     if (!f)
3452         return 0;
3453
3454     if (f->codec_ids) {
3455         const enum AVCodecID *ids;
3456         for (ids = f->codec_ids; *ids != AV_CODEC_ID_NONE; ids++)
3457             if (*ids == st->codecpar->codec_id)
3458                 return 1;
3459     }
3460
3461     return 0;
3462 }
3463
3464 static int extract_extradata_init(AVStream *st)
3465 {
3466     AVStreamInternal *sti = st->internal;
3467     const AVBitStreamFilter *f;
3468     int ret;
3469
3470     f = av_bsf_get_by_name("extract_extradata");
3471     if (!f)
3472         goto finish;
3473
3474     /* check that the codec id is supported */
3475     ret = extract_extradata_check(st);
3476     if (!ret)
3477         goto finish;
3478
3479     sti->extract_extradata.pkt = av_packet_alloc();
3480     if (!sti->extract_extradata.pkt)
3481         return AVERROR(ENOMEM);
3482
3483     ret = av_bsf_alloc(f, &sti->extract_extradata.bsf);
3484     if (ret < 0)
3485         goto fail;
3486
3487     ret = avcodec_parameters_copy(sti->extract_extradata.bsf->par_in,
3488                                   st->codecpar);
3489     if (ret < 0)
3490         goto fail;
3491
3492     sti->extract_extradata.bsf->time_base_in = st->time_base;
3493
3494     ret = av_bsf_init(sti->extract_extradata.bsf);
3495     if (ret < 0)
3496         goto fail;
3497
3498 finish:
3499     sti->extract_extradata.inited = 1;
3500
3501     return 0;
3502 fail:
3503     av_bsf_free(&sti->extract_extradata.bsf);
3504     av_packet_free(&sti->extract_extradata.pkt);
3505     return ret;
3506 }
3507
3508 static int extract_extradata(AVStream *st, AVPacket *pkt)
3509 {
3510     AVStreamInternal *sti = st->internal;
3511     AVPacket *pkt_ref;
3512     int ret;
3513
3514     if (!sti->extract_extradata.inited) {
3515         ret = extract_extradata_init(st);
3516         if (ret < 0)
3517             return ret;
3518     }
3519
3520     if (sti->extract_extradata.inited && !sti->extract_extradata.bsf)
3521         return 0;
3522
3523     pkt_ref = sti->extract_extradata.pkt;
3524     ret = av_packet_ref(pkt_ref, pkt);
3525     if (ret < 0)
3526         return ret;
3527
3528     ret = av_bsf_send_packet(sti->extract_extradata.bsf, pkt_ref);
3529     if (ret < 0) {
3530         av_packet_unref(pkt_ref);
3531         return ret;
3532     }
3533
3534     while (ret >= 0 && !sti->avctx->extradata) {
3535         int extradata_size;
3536         uint8_t *extradata;
3537
3538         ret = av_bsf_receive_packet(sti->extract_extradata.bsf, pkt_ref);
3539         if (ret < 0) {
3540             if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
3541                 return ret;
3542             continue;
3543         }
3544
3545         extradata = av_packet_get_side_data(pkt_ref, AV_PKT_DATA_NEW_EXTRADATA,
3546                                             &extradata_size);
3547
3548         if (extradata) {
3549             av_assert0(!sti->avctx->extradata);
3550             if ((unsigned)extradata_size < FF_MAX_EXTRADATA_SIZE)
3551                 sti->avctx->extradata = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
3552             if (!sti->avctx->extradata) {
3553                 av_packet_unref(pkt_ref);
3554                 return AVERROR(ENOMEM);
3555             }
3556             memcpy(sti->avctx->extradata, extradata, extradata_size);
3557             sti->avctx->extradata_size = extradata_size;
3558         }
3559         av_packet_unref(pkt_ref);
3560     }
3561
3562     return 0;
3563 }
3564
3565 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
3566 {
3567     int i, count = 0, ret = 0, j;
3568     int64_t read_size;
3569     AVStream *st;
3570     AVCodecContext *avctx;
3571     AVPacket pkt1, *pkt;
3572     int64_t old_offset  = avio_tell(ic->pb);
3573     // new streams might appear, no options for those
3574     int orig_nb_streams = ic->nb_streams;
3575     int flush_codecs;
3576     int64_t max_analyze_duration = ic->max_analyze_duration;
3577     int64_t max_stream_analyze_duration;
3578     int64_t max_subtitle_analyze_duration;
3579     int64_t probesize = ic->probesize;
3580     int eof_reached = 0;
3581     int *missing_streams = av_opt_ptr(ic->iformat->priv_class, ic->priv_data, "missing_streams");
3582
3583     flush_codecs = probesize > 0;
3584
3585     av_opt_set(ic, "skip_clear", "1", AV_OPT_SEARCH_CHILDREN);
3586
3587     max_stream_analyze_duration = max_analyze_duration;
3588     max_subtitle_analyze_duration = max_analyze_duration;
3589     if (!max_analyze_duration) {
3590         max_stream_analyze_duration =
3591         max_analyze_duration        = 5*AV_TIME_BASE;
3592         max_subtitle_analyze_duration = 30*AV_TIME_BASE;
3593         if (!strcmp(ic->iformat->name, "flv"))
3594             max_stream_analyze_duration = 90*AV_TIME_BASE;
3595         if (!strcmp(ic->iformat->name, "mpeg") || !strcmp(ic->iformat->name, "mpegts"))
3596             max_stream_analyze_duration = 7*AV_TIME_BASE;
3597     }
3598
3599     if (ic->pb)
3600         av_log(ic, AV_LOG_DEBUG, "Before avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d nb_streams:%d\n",
3601                avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, ic->nb_streams);
3602
3603     for (i = 0; i < ic->nb_streams; i++) {
3604         const AVCodec *codec;
3605         AVDictionary *thread_opt = NULL;
3606         st = ic->streams[i];
3607         avctx = st->internal->avctx;
3608
3609         if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
3610             st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3611 /*            if (!st->time_base.num)
3612                 st->time_base = */
3613             if (!avctx->time_base.num)
3614                 avctx->time_base = st->time_base;
3615         }
3616
3617         /* check if the caller has overridden the codec id */
3618 #if FF_API_LAVF_AVCTX
3619 FF_DISABLE_DEPRECATION_WARNINGS
3620         if (st->codec->codec_id != st->internal->orig_codec_id) {
3621             st->codecpar->codec_id   = st->codec->codec_id;
3622             st->codecpar->codec_type = st->codec->codec_type;
3623             st->internal->orig_codec_id = st->codec->codec_id;
3624         }
3625 FF_ENABLE_DEPRECATION_WARNINGS
3626 #endif
3627         // only for the split stuff
3628         if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE) && st->request_probe <= 0) {
3629             st->parser = av_parser_init(st->codecpar->codec_id);
3630             if (st->parser) {
3631                 if (st->need_parsing == AVSTREAM_PARSE_HEADERS) {
3632                     st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
3633                 } else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
3634                     st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
3635                 }
3636             } else if (st->need_parsing) {
3637                 av_log(ic, AV_LOG_VERBOSE, "parser not found for codec "
3638                        "%s, packets or times may be invalid.\n",
3639                        avcodec_get_name(st->codecpar->codec_id));
3640             }
3641         }
3642
3643         if (st->codecpar->codec_id != st->internal->orig_codec_id)
3644             st->internal->orig_codec_id = st->codecpar->codec_id;
3645
3646         ret = avcodec_parameters_to_context(avctx, st->codecpar);
3647         if (ret < 0)
3648             goto find_stream_info_err;
3649         if (st->request_probe <= 0)
3650             st->internal->avctx_inited = 1;
3651
3652         codec = find_probe_decoder(ic, st, st->codecpar->codec_id);
3653
3654         /* Force thread count to 1 since the H.264 decoder will not extract
3655          * SPS and PPS to extradata during multi-threaded decoding. */
3656         av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
3657
3658         if (ic->codec_whitelist)
3659             av_dict_set(options ? &options[i] : &thread_opt, "codec_whitelist", ic->codec_whitelist, 0);
3660
3661         /* Ensure that subtitle_header is properly set. */
3662         if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE
3663             && codec && !avctx->codec) {
3664             if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0)
3665                 av_log(ic, AV_LOG_WARNING,
3666                        "Failed to open codec in %s\n",__FUNCTION__);
3667         }
3668
3669         // Try to just open decoders, in case this is enough to get parameters.
3670         if (!has_codec_parameters(st, NULL) && st->request_probe <= 0) {
3671             if (codec && !avctx->codec)
3672                 if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0)
3673                     av_log(ic, AV_LOG_WARNING,
3674                            "Failed to open codec in %s\n",__FUNCTION__);
3675         }
3676         if (!options)
3677             av_dict_free(&thread_opt);
3678     }
3679
3680     for (i = 0; i < ic->nb_streams; i++) {
3681 #if FF_API_R_FRAME_RATE
3682         ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
3683 #endif
3684         ic->streams[i]->info->fps_first_dts = AV_NOPTS_VALUE;
3685         ic->streams[i]->info->fps_last_dts  = AV_NOPTS_VALUE;
3686     }
3687
3688     read_size = 0;
3689     for (;;) {
3690         int analyzed_all_streams;
3691         if (ff_check_interrupt(&ic->interrupt_callback)) {
3692             ret = AVERROR_EXIT;
3693             av_log(ic, AV_LOG_DEBUG, "interrupted\n");
3694             break;
3695         }
3696
3697         /* check if one codec still needs to be handled */
3698         for (i = 0; i < ic->nb_streams; i++) {
3699             int fps_analyze_framecount = 20;
3700             int count;
3701
3702             st = ic->streams[i];
3703             if (!has_codec_parameters(st, NULL))
3704                 break;
3705             /* If the timebase is coarse (like the usual millisecond precision
3706              * of mkv), we need to analyze more frames to reliably arrive at
3707              * the correct fps. */
3708             if (av_q2d(st->time_base) > 0.0005)
3709                 fps_analyze_framecount *= 2;
3710             if (!tb_unreliable(st->internal->avctx))
3711                 fps_analyze_framecount = 0;
3712             if (ic->fps_probe_size >= 0)
3713                 fps_analyze_framecount = ic->fps_probe_size;
3714             if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
3715                 fps_analyze_framecount = 0;
3716             /* variable fps and no guess at the real fps */
3717             count = (ic->iformat->flags & AVFMT_NOTIMESTAMPS) ?
3718                        st->info->codec_info_duration_fields/2 :
3719                        st->info->duration_count;
3720             if (!(st->r_frame_rate.num && st->avg_frame_rate.num) &&
3721                 st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
3722                 if (count < fps_analyze_framecount)
3723                     break;
3724             }
3725             // Look at the first 3 frames if there is evidence of frame delay
3726             // but the decoder delay is not set.
3727             if (st->info->frame_delay_evidence && count < 2 && st->internal->avctx->has_b_frames == 0)
3728                 break;
3729             if (!st->internal->avctx->extradata &&
3730                 (!st->internal->extract_extradata.inited ||
3731                  st->internal->extract_extradata.bsf) &&
3732                 extract_extradata_check(st))
3733                 break;
3734             if (st->first_dts == AV_NOPTS_VALUE &&
3735                 !(ic->iformat->flags & AVFMT_NOTIMESTAMPS) &&
3736                 st->codec_info_nb_frames < ((st->disposition & AV_DISPOSITION_ATTACHED_PIC) ? 1 : ic->max_ts_probe) &&
3737                 (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
3738                  st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))
3739                 break;
3740         }
3741         analyzed_all_streams = 0;
3742         if (!missing_streams || !*missing_streams)
3743         if (i == ic->nb_streams) {
3744             analyzed_all_streams = 1;
3745             /* NOTE: If the format has no header, then we need to read some
3746              * packets to get most of the streams, so we cannot stop here. */
3747             if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
3748                 /* If we found the info for all the codecs, we can stop. */
3749                 ret = count;
3750                 av_log(ic, AV_LOG_DEBUG, "All info found\n");
3751                 flush_codecs = 0;
3752                 break;
3753             }
3754         }
3755         /* We did not get all the codec info, but we read too much data. */
3756         if (read_size >= probesize) {
3757             ret = count;
3758             av_log(ic, AV_LOG_DEBUG,
3759                    "Probe buffer size limit of %"PRId64" bytes reached\n", probesize);
3760             for (i = 0; i < ic->nb_streams; i++)
3761                 if (!ic->streams[i]->r_frame_rate.num &&
3762                     ic->streams[i]->info->duration_count <= 1 &&
3763                     ic->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
3764                     strcmp(ic->iformat->name, "image2"))
3765                     av_log(ic, AV_LOG_WARNING,
3766                            "Stream #%d: not enough frames to estimate rate; "
3767                            "consider increasing probesize\n", i);
3768             break;
3769         }
3770
3771         /* NOTE: A new stream can be added there if no header in file
3772          * (AVFMTCTX_NOHEADER). */
3773         ret = read_frame_internal(ic, &pkt1);
3774         if (ret == AVERROR(EAGAIN))
3775             continue;
3776
3777         if (ret < 0) {
3778             /* EOF or error*/
3779             eof_reached = 1;
3780             break;
3781         }
3782
3783         pkt = &pkt1;
3784
3785         if (!(ic->flags & AVFMT_FLAG_NOBUFFER)) {
3786             ret = ff_packet_list_put(&ic->internal->packet_buffer,
3787                                      &ic->internal->packet_buffer_end,
3788                                      pkt, 0);
3789             if (ret < 0)
3790                 goto find_stream_info_err;
3791         }
3792
3793         st = ic->streams[pkt->stream_index];
3794         if (!(st->disposition & AV_DISPOSITION_ATTACHED_PIC))
3795             read_size += pkt->size;
3796
3797         avctx = st->internal->avctx;
3798         if (!st->internal->avctx_inited) {
3799             ret = avcodec_parameters_to_context(avctx, st->codecpar);
3800             if (ret < 0)
3801                 goto find_stream_info_err;
3802             st->internal->avctx_inited = 1;
3803         }
3804
3805         if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
3806             /* check for non-increasing dts */
3807             if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3808                 st->info->fps_last_dts >= pkt->dts) {
3809                 av_log(ic, AV_LOG_DEBUG,
3810                        "Non-increasing DTS in stream %d: packet %d with DTS "
3811                        "%"PRId64", packet %d with DTS %"PRId64"\n",
3812                        st->index, st->info->fps_last_dts_idx,
3813                        st->info->fps_last_dts, st->codec_info_nb_frames,
3814                        pkt->dts);
3815                 st->info->fps_first_dts =
3816                 st->info->fps_last_dts  = AV_NOPTS_VALUE;
3817             }
3818             /* Check for a discontinuity in dts. If the difference in dts
3819              * is more than 1000 times the average packet duration in the
3820              * sequence, we treat it as a discontinuity. */
3821             if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3822                 st->info->fps_last_dts_idx > st->info->fps_first_dts_idx &&
3823                 (pkt->dts - (uint64_t)st->info->fps_last_dts) / 1000 >
3824                 (st->info->fps_last_dts     - (uint64_t)st->info->fps_first_dts) /
3825                 (st->info->fps_last_dts_idx - st->info->fps_first_dts_idx)) {
3826                 av_log(ic, AV_LOG_WARNING,
3827                        "DTS discontinuity in stream %d: packet %d with DTS "
3828                        "%"PRId64", packet %d with DTS %"PRId64"\n",
3829                        st->index, st->info->fps_last_dts_idx,
3830                        st->info->fps_last_dts, st->codec_info_nb_frames,
3831                        pkt->dts);
3832                 st->info->fps_first_dts =
3833                 st->info->fps_last_dts  = AV_NOPTS_VALUE;
3834             }
3835
3836             /* update stored dts values */
3837             if (st->info->fps_first_dts == AV_NOPTS_VALUE) {
3838                 st->info->fps_first_dts     = pkt->dts;
3839                 st->info->fps_first_dts_idx = st->codec_info_nb_frames;
3840             }
3841             st->info->fps_last_dts     = pkt->dts;
3842             st->info->fps_last_dts_idx = st->codec_info_nb_frames;
3843         }
3844         if (st->codec_info_nb_frames>1) {
3845             int64_t t = 0;
3846             int64_t limit;
3847
3848             if (st->time_base.den > 0)
3849                 t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
3850             if (st->avg_frame_rate.num > 0)
3851                 t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, av_inv_q(st->avg_frame_rate), AV_TIME_BASE_Q));
3852
3853             if (   t == 0
3854                 && st->codec_info_nb_frames>30
3855                 && st->info->fps_first_dts != AV_NOPTS_VALUE
3856                 && st->info->fps_last_dts  != AV_NOPTS_VALUE)
3857                 t = FFMAX(t, av_rescale_q(st->info->fps_last_dts - st->info->fps_first_dts, st->time_base, AV_TIME_BASE_Q));
3858
3859             if (analyzed_all_streams)                                limit = max_analyze_duration;
3860             else if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) limit = max_subtitle_analyze_duration;
3861             else                                                     limit = max_stream_analyze_duration;
3862
3863             if (t >= limit) {
3864                 av_log(ic, AV_LOG_VERBOSE, "max_analyze_duration %"PRId64" reached at %"PRId64" microseconds st:%d\n",
3865                        limit,
3866                        t, pkt->stream_index);
3867                 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3868                     av_packet_unref(pkt);
3869                 break;
3870             }
3871             if (pkt->duration) {
3872                 if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE && pkt->pts != AV_NOPTS_VALUE && st->start_time != AV_NOPTS_VALUE && pkt->pts >= st->start_time) {
3873                     st->info->codec_info_duration = FFMIN(pkt->pts - st->start_time, st->info->codec_info_duration + pkt->duration);
3874                 } else
3875                     st->info->codec_info_duration += pkt->duration;
3876                 st->info->codec_info_duration_fields += st->parser && st->need_parsing && avctx->ticks_per_frame ==2 ? st->parser->repeat_pict + 1 : 2;
3877             }
3878         }
3879         if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
3880 #if FF_API_R_FRAME_RATE
3881             ff_rfps_add_frame(ic, st, pkt->dts);
3882 #endif
3883             if (pkt->dts != pkt->pts && pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE)
3884                 st->info->frame_delay_evidence = 1;
3885         }
3886         if (!st->internal->avctx->extradata) {
3887             ret = extract_extradata(st, pkt);
3888             if (ret < 0)
3889                 goto find_stream_info_err;
3890         }
3891
3892         /* If still no information, we try to open the codec and to
3893          * decompress the frame. We try to avoid that in most cases as
3894          * it takes longer and uses more memory. For MPEG-4, we need to
3895          * decompress for QuickTime.
3896          *
3897          * If AV_CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
3898          * least one frame of codec data, this makes sure the codec initializes
3899          * the channel configuration and does not only trust the values from
3900          * the container. */
3901         try_decode_frame(ic, st, pkt,
3902                          (options && i < orig_nb_streams) ? &options[i] : NULL);
3903
3904         if (ic->flags & AVFMT_FLAG_NOBUFFER)
3905             av_packet_unref(pkt);
3906
3907         st->codec_info_nb_frames++;
3908         count++;
3909     }
3910
3911     if (eof_reached) {
3912         int stream_index;
3913         for (stream_index = 0; stream_index < ic->nb_streams; stream_index++) {
3914             st = ic->streams[stream_index];
3915             avctx = st->internal->avctx;
3916             if (!has_codec_parameters(st, NULL)) {
3917                 const AVCodec *codec = find_probe_decoder(ic, st, st->codecpar->codec_id);
3918                 if (codec && !avctx->codec) {
3919                     AVDictionary *opts = NULL;
3920                     if (ic->codec_whitelist)
3921                         av_dict_set(&opts, "codec_whitelist", ic->codec_whitelist, 0);
3922                     if (avcodec_open2(avctx, codec, (options && stream_index < orig_nb_streams) ? &options[stream_index] : &opts) < 0)
3923                         av_log(ic, AV_LOG_WARNING,
3924                                "Failed to open codec in %s\n",__FUNCTION__);
3925                     av_dict_free(&opts);
3926                 }
3927             }
3928
3929             // EOF already reached while reading the stream above.
3930             // So continue with reoordering DTS with whatever delay we have.
3931             if (ic->internal->packet_buffer && !has_decode_delay_been_guessed(st)) {
3932                 update_dts_from_pts(ic, stream_index, ic->internal->packet_buffer);
3933             }
3934         }
3935     }
3936
3937     if (flush_codecs) {
3938         AVPacket empty_pkt = { 0 };
3939         int err = 0;
3940         av_init_packet(&empty_pkt);
3941
3942         for (i = 0; i < ic->nb_streams; i++) {
3943
3944             st = ic->streams[i];
3945
3946             /* flush the decoders */
3947             if (st->info->found_decoder == 1) {
3948                 do {
3949                     err = try_decode_frame(ic, st, &empty_pkt,
3950                                             (options && i < orig_nb_streams)
3951                                             ? &options[i] : NULL);
3952                 } while (err > 0 && !has_codec_parameters(st, NULL));
3953
3954                 if (err < 0) {
3955                     av_log(ic, AV_LOG_INFO,
3956                         "decoding for stream %d failed\n", st->index);
3957                 }
3958             }
3959         }
3960     }
3961
3962     ff_rfps_calculate(ic);
3963
3964     for (i = 0; i < ic->nb_streams; i++) {
3965         st = ic->streams[i];
3966         avctx = st->internal->avctx;
3967         if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
3968             if (avctx->codec_id == AV_CODEC_ID_RAWVIDEO && !avctx->codec_tag && !avctx->bits_per_coded_sample) {
3969                 uint32_t tag= avcodec_pix_fmt_to_codec_tag(avctx->pix_fmt);
3970                 if (avpriv_find_pix_fmt(avpriv_get_raw_pix_fmt_tags(), tag) == avctx->pix_fmt)
3971                     avctx->codec_tag= tag;
3972             }
3973
3974             /* estimate average framerate if not set by demuxer */
3975             if (st->info->codec_info_duration_fields &&
3976                 !st->avg_frame_rate.num &&
3977                 st->info->codec_info_duration) {
3978                 int best_fps      = 0;
3979                 double best_error = 0.01;
3980                 AVRational codec_frame_rate = avctx->framerate;
3981
3982                 if (st->info->codec_info_duration        >= INT64_MAX / st->time_base.num / 2||
3983                     st->info->codec_info_duration_fields >= INT64_MAX / st->time_base.den ||
3984                     st->info->codec_info_duration        < 0)
3985                     continue;
3986                 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
3987                           st->info->codec_info_duration_fields * (int64_t) st->time_base.den,
3988                           st->info->codec_info_duration * 2 * (int64_t) st->time_base.num, 60000);
3989
3990                 /* Round guessed framerate to a "standard" framerate if it's
3991                  * within 1% of the original estimate. */
3992                 for (j = 0; j < MAX_STD_TIMEBASES; j++) {
3993                     AVRational std_fps = { get_std_framerate(j), 12 * 1001 };
3994                     double error       = fabs(av_q2d(st->avg_frame_rate) /
3995                                               av_q2d(std_fps) - 1);
3996
3997                     if (error < best_error) {
3998                         best_error = error;
3999                         best_fps   = std_fps.num;
4000                     }
4001
4002                     if (ic->internal->prefer_codec_framerate && codec_frame_rate.num > 0 && codec_frame_rate.den > 0) {
4003                         error       = fabs(av_q2d(codec_frame_rate) /
4004                                            av_q2d(std_fps) - 1);
4005                         if (error < best_error) {
4006                             best_error = error;
4007                             best_fps   = std_fps.num;
4008                         }
4009                     }
4010                 }
4011                 if (best_fps)
4012                     av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
4013                               best_fps, 12 * 1001, INT_MAX);
4014             }
4015
4016             if (!st->r_frame_rate.num) {
4017                 if (    avctx->time_base.den * (int64_t) st->time_base.num
4018                     <= avctx->time_base.num * avctx->ticks_per_frame * (int64_t) st->time_base.den) {
4019                     av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den,
4020                               avctx->time_base.den, (int64_t)avctx->time_base.num * avctx->ticks_per_frame, INT_MAX);
4021                 } else {
4022                     st->r_frame_rate.num = st->time_base.den;
4023                     st->r_frame_rate.den = st->time_base.num;
4024                 }
4025             }
4026             if (st->display_aspect_ratio.num && st->display_aspect_ratio.den) {
4027                 AVRational hw_ratio = { avctx->height, avctx->width };
4028                 st->sample_aspect_ratio = av_mul_q(st->display_aspect_ratio,
4029                                                    hw_ratio);
4030             }
4031         } else if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
4032             if (!avctx->bits_per_coded_sample)
4033                 avctx->bits_per_coded_sample =
4034                     av_get_bits_per_sample(avctx->codec_id);
4035             // set stream disposition based on audio service type
4036             switch (avctx->audio_service_type) {
4037             case AV_AUDIO_SERVICE_TYPE_EFFECTS:
4038                 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS;
4039                 break;
4040             case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
4041                 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED;
4042                 break;
4043             case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
4044                 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED;
4045                 break;
4046             case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
4047                 st->disposition = AV_DISPOSITION_COMMENT;
4048                 break;
4049             case AV_AUDIO_SERVICE_TYPE_KARAOKE:
4050                 st->disposition = AV_DISPOSITION_KARAOKE;
4051                 break;
4052             }
4053         }
4054     }
4055
4056     if (probesize)
4057         estimate_timings(ic, old_offset);
4058
4059     av_opt_set(ic, "skip_clear", "0", AV_OPT_SEARCH_CHILDREN);
4060
4061     if (ret >= 0 && ic->nb_streams)
4062         /* We could not have all the codec parameters before EOF. */
4063         ret = -1;
4064     for (i = 0; i < ic->nb_streams; i++) {
4065         const char *errmsg;
4066         st = ic->streams[i];
4067
4068         /* if no packet was ever seen, update context now for has_codec_parameters */
4069         if (!st->internal->avctx_inited) {
4070             if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
4071                 st->codecpar->format == AV_SAMPLE_FMT_NONE)
4072                 st->codecpar->format = st->internal->avctx->sample_fmt;
4073             ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
4074             if (ret < 0)
4075                 goto find_stream_info_err;
4076         }
4077         if (!has_codec_parameters(st, &errmsg)) {
4078             char buf[256];
4079             avcodec_string(buf, sizeof(buf), st->internal->avctx, 0);
4080             av_log(ic, AV_LOG_WARNING,
4081                    "Could not find codec parameters for stream %d (%s): %s\n"
4082                    "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
4083                    i, buf, errmsg);
4084         } else {
4085             ret = 0;
4086         }
4087     }
4088
4089     compute_chapters_end(ic);
4090
4091     /* update the stream parameters from the internal codec contexts */
4092     for (i = 0; i < ic->nb_streams; i++) {
4093         st = ic->streams[i];
4094
4095         if (st->internal->avctx_inited) {
4096             int orig_w = st->codecpar->width;
4097             int orig_h = st->codecpar->height;
4098             ret = avcodec_parameters_from_context(st->codecpar, st->internal->avctx);
4099             if (ret < 0)
4100                 goto find_stream_info_err;
4101 #if FF_API_LOWRES
4102             // The decoder might reduce the video size by the lowres factor.
4103             if (st->internal->avctx->lowres && orig_w) {
4104                 st->codecpar->width = orig_w;
4105                 st->codecpar->height = orig_h;
4106             }
4107 #endif
4108         }
4109
4110 #if FF_API_LAVF_AVCTX
4111 FF_DISABLE_DEPRECATION_WARNINGS
4112         ret = avcodec_parameters_to_context(st->codec, st->codecpar);
4113         if (ret < 0)
4114             goto find_stream_info_err;
4115
4116 #if FF_API_LOWRES
4117         // The old API (AVStream.codec) "requires" the resolution to be adjusted
4118         // by the lowres factor.
4119         if (st->internal->avctx->lowres && st->internal->avctx->width) {
4120             st->codec->lowres = st->internal->avctx->lowres;
4121             st->codec->width = st->internal->avctx->width;
4122             st->codec->height = st->internal->avctx->height;
4123         }
4124 #endif
4125
4126         if (st->codec->codec_tag != MKTAG('t','m','c','d')) {
4127             st->codec->time_base = st->internal->avctx->time_base;
4128             st->codec->ticks_per_frame = st->internal->avctx->ticks_per_frame;
4129         }
4130         st->codec->framerate = st->avg_frame_rate;
4131
4132         if (st->internal->avctx->subtitle_header) {
4133             st->codec->subtitle_header = av_malloc(st->internal->avctx->subtitle_header_size);
4134             if (!st->codec->subtitle_header)
4135                 goto find_stream_info_err;
4136             st->codec->subtitle_header_size = st->internal->avctx->subtitle_header_size;
4137             memcpy(st->codec->subtitle_header, st->internal->avctx->subtitle_header,
4138                    st->codec->subtitle_header_size);
4139         }
4140
4141         // Fields unavailable in AVCodecParameters
4142         st->codec->coded_width = st->internal->avctx->coded_width;
4143         st->codec->coded_height = st->internal->avctx->coded_height;
4144         st->codec->properties = st->internal->avctx->properties;
4145 FF_ENABLE_DEPRECATION_WARNINGS
4146 #endif
4147
4148         st->internal->avctx_inited = 0;
4149     }
4150
4151 find_stream_info_err:
4152     for (i = 0; i < ic->nb_streams; i++) {
4153         st = ic->streams[i];
4154         if (st->info)
4155             av_freep(&st->info->duration_error);
4156         avcodec_close(ic->streams[i]->internal->avctx);
4157         av_freep(&ic->streams[i]->info);
4158         av_bsf_free(&ic->streams[i]->internal->extract_extradata.bsf);
4159         av_packet_free(&ic->streams[i]->internal->extract_extradata.pkt);
4160     }
4161     if (ic->pb)
4162         av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d frames:%d\n",
4163                avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, count);
4164     return ret;
4165 }
4166
4167 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
4168 {
4169     int i, j;
4170
4171     for (i = 0; i < ic->nb_programs; i++) {
4172         if (ic->programs[i] == last) {
4173             last = NULL;
4174         } else {
4175             if (!last)
4176                 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
4177                     if (ic->programs[i]->stream_index[j] == s)
4178                         return ic->programs[i];
4179         }
4180     }
4181     return NULL;
4182 }
4183
4184 int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type,
4185                         int wanted_stream_nb, int related_stream,
4186                         AVCodec **decoder_ret, int flags)
4187 {
4188     int i, nb_streams = ic->nb_streams;
4189     int ret = AVERROR_STREAM_NOT_FOUND;
4190     int best_count = -1, best_multiframe = -1, best_disposition = -1;
4191     int count, multiframe, disposition;
4192     int64_t best_bitrate = -1;
4193     int64_t bitrate;
4194     unsigned *program = NULL;
4195     const AVCodec *decoder = NULL, *best_decoder = NULL;
4196
4197     if (related_stream >= 0 && wanted_stream_nb < 0) {
4198         AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
4199         if (p) {
4200             program    = p->stream_index;
4201             nb_streams = p->nb_stream_indexes;
4202         }
4203     }
4204     for (i = 0; i < nb_streams; i++) {
4205         int real_stream_index = program ? program[i] : i;
4206         AVStream *st          = ic->streams[real_stream_index];
4207         AVCodecParameters *par = st->codecpar;
4208         if (par->codec_type != type)
4209             continue;
4210         if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
4211             continue;
4212         if (type == AVMEDIA_TYPE_AUDIO && !(par->channels && par->sample_rate))
4213             continue;
4214         if (decoder_ret) {
4215             decoder = find_decoder(ic, st, par->codec_id);
4216             if (!decoder) {
4217                 if (ret < 0)
4218                     ret = AVERROR_DECODER_NOT_FOUND;
4219                 continue;
4220             }
4221         }
4222         disposition = !(st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED | AV_DISPOSITION_VISUAL_IMPAIRED))
4223                       + !! (st->disposition & AV_DISPOSITION_DEFAULT);
4224         count = st->codec_info_nb_frames;
4225         bitrate = par->bit_rate;
4226         multiframe = FFMIN(5, count);
4227         if ((best_disposition >  disposition) ||
4228             (best_disposition == disposition && best_multiframe >  multiframe) ||
4229             (best_disposition == disposition && best_multiframe == multiframe && best_bitrate >  bitrate) ||
4230             (best_disposition == disposition && best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
4231             continue;
4232         best_disposition = disposition;
4233         best_count   = count;
4234         best_bitrate = bitrate;
4235         best_multiframe = multiframe;
4236         ret          = real_stream_index;
4237         best_decoder = decoder;
4238         if (program && i == nb_streams - 1 && ret < 0) {
4239             program    = NULL;
4240             nb_streams = ic->nb_streams;
4241             /* no related stream found, try again with everything */
4242             i = 0;
4243         }
4244     }
4245     if (decoder_ret)
4246         *decoder_ret = (AVCodec*)best_decoder;
4247     return ret;
4248 }
4249
4250 /*******************************************************/
4251
4252 int av_read_play(AVFormatContext *s)
4253 {
4254     if (s->iformat->read_play)
4255         return s->iformat->read_play(s);
4256     if (s->pb)
4257         return avio_pause(s->pb, 0);
4258     return AVERROR(ENOSYS);
4259 }
4260
4261 int av_read_pause(AVFormatContext *s)
4262 {
4263     if (s->iformat->read_pause)
4264         return s->iformat->read_pause(s);
4265     if (s->pb)
4266         return avio_pause(s->pb, 1);
4267     return AVERROR(ENOSYS);
4268 }
4269
4270 int ff_stream_encode_params_copy(AVStream *dst, const AVStream *src)
4271 {
4272     int ret, i;
4273
4274     dst->id                  = src->id;
4275     dst->time_base           = src->time_base;
4276     dst->nb_frames           = src->nb_frames;
4277     dst->disposition         = src->disposition;
4278     dst->sample_aspect_ratio = src->sample_aspect_ratio;
4279     dst->avg_frame_rate      = src->avg_frame_rate;
4280     dst->r_frame_rate        = src->r_frame_rate;
4281
4282     av_dict_free(&dst->metadata);
4283     ret = av_dict_copy(&dst->metadata, src->metadata, 0);
4284     if (ret < 0)
4285         return ret;
4286
4287     ret = avcodec_parameters_copy(dst->codecpar, src->codecpar);
4288     if (ret < 0)
4289         return ret;
4290
4291     /* Free existing side data*/
4292     for (i = 0; i < dst->nb_side_data; i++)
4293         av_free(dst->side_data[i].data);
4294     av_freep(&dst->side_data);
4295     dst->nb_side_data = 0;
4296
4297     /* Copy side data if present */
4298     if (src->nb_side_data) {
4299         dst->side_data = av_mallocz_array(src->nb_side_data,
4300                                           sizeof(AVPacketSideData));
4301         if (!dst->side_data)
4302             return AVERROR(ENOMEM);
4303         dst->nb_side_data = src->nb_side_data;
4304
4305         for (i = 0; i < src->nb_side_data; i++) {
4306             uint8_t *data = av_memdup(src->side_data[i].data,
4307                                       src->side_data[i].size);
4308             if (!data)
4309                 return AVERROR(ENOMEM);
4310             dst->side_data[i].type = src->side_data[i].type;
4311             dst->side_data[i].size = src->side_data[i].size;
4312             dst->side_data[i].data = data;
4313         }
4314     }
4315
4316 #if FF_API_LAVF_FFSERVER
4317 FF_DISABLE_DEPRECATION_WARNINGS
4318     av_freep(&dst->recommended_encoder_configuration);
4319     if (src->recommended_encoder_configuration) {
4320         const char *conf_str = src->recommended_encoder_configuration;
4321         dst->recommended_encoder_configuration = av_strdup(conf_str);
4322         if (!dst->recommended_encoder_configuration)
4323             return AVERROR(ENOMEM);
4324     }
4325 FF_ENABLE_DEPRECATION_WARNINGS
4326 #endif
4327
4328     return 0;
4329 }
4330
4331 static void free_stream(AVStream **pst)
4332 {
4333     AVStream *st = *pst;
4334     int i;
4335
4336     if (!st)
4337         return;
4338
4339     for (i = 0; i < st->nb_side_data; i++)
4340         av_freep(&st->side_data[i].data);
4341     av_freep(&st->side_data);
4342
4343     if (st->parser)
4344         av_parser_close(st->parser);
4345
4346     if (st->attached_pic.data)
4347         av_packet_unref(&st->attached_pic);
4348
4349     if (st->internal) {
4350         avcodec_free_context(&st->internal->avctx);
4351         for (i = 0; i < st->internal->nb_bsfcs; i++) {
4352             av_bsf_free(&st->internal->bsfcs[i]);
4353             av_freep(&st->internal->bsfcs);
4354         }
4355         av_freep(&st->internal->priv_pts);
4356         av_bsf_free(&st->internal->extract_extradata.bsf);
4357         av_packet_free(&st->internal->extract_extradata.pkt);
4358     }
4359     av_freep(&st->internal);
4360
4361     av_dict_free(&st->metadata);
4362     avcodec_parameters_free(&st->codecpar);
4363     av_freep(&st->probe_data.buf);
4364     av_freep(&st->index_entries);
4365 #if FF_API_LAVF_AVCTX
4366 FF_DISABLE_DEPRECATION_WARNINGS
4367     avcodec_free_context(&st->codec);
4368 FF_ENABLE_DEPRECATION_WARNINGS
4369 #endif
4370     av_freep(&st->priv_data);
4371     if (st->info)
4372         av_freep(&st->info->duration_error);
4373     av_freep(&st->info);
4374 #if FF_API_LAVF_FFSERVER
4375 FF_DISABLE_DEPRECATION_WARNINGS
4376     av_freep(&st->recommended_encoder_configuration);
4377 FF_ENABLE_DEPRECATION_WARNINGS
4378 #endif
4379
4380     av_freep(pst);
4381 }
4382
4383 void ff_free_stream(AVFormatContext *s, AVStream *st)
4384 {
4385     av_assert0(s->nb_streams>0);
4386     av_assert0(s->streams[ s->nb_streams - 1 ] == st);
4387
4388     free_stream(&s->streams[ --s->nb_streams ]);
4389 }
4390
4391 void avformat_free_context(AVFormatContext *s)
4392 {
4393     int i;
4394
4395     if (!s)
4396         return;
4397
4398     av_opt_free(s);
4399     if (s->iformat && s->iformat->priv_class && s->priv_data)
4400         av_opt_free(s->priv_data);
4401     if (s->oformat && s->oformat->priv_class && s->priv_data)
4402         av_opt_free(s->priv_data);
4403
4404     for (i = s->nb_streams - 1; i >= 0; i--)
4405         ff_free_stream(s, s->streams[i]);
4406
4407
4408     for (i = s->nb_programs - 1; i >= 0; i--) {
4409         av_dict_free(&s->programs[i]->metadata);
4410         av_freep(&s->programs[i]->stream_index);
4411         av_freep(&s->programs[i]);
4412     }
4413     av_freep(&s->programs);
4414     av_freep(&s->priv_data);
4415     while (s->nb_chapters--) {
4416         av_dict_free(&s->chapters[s->nb_chapters]->metadata);
4417         av_freep(&s->chapters[s->nb_chapters]);
4418     }
4419     av_freep(&s->chapters);
4420     av_dict_free(&s->metadata);
4421     av_dict_free(&s->internal->id3v2_meta);
4422     av_freep(&s->streams);
4423     flush_packet_queue(s);
4424     av_freep(&s->internal);
4425     av_freep(&s->url);
4426     av_free(s);
4427 }
4428
4429 void avformat_close_input(AVFormatContext **ps)
4430 {
4431     AVFormatContext *s;
4432     AVIOContext *pb;
4433
4434     if (!ps || !*ps)
4435         return;
4436
4437     s  = *ps;
4438     pb = s->pb;
4439
4440     if ((s->iformat && strcmp(s->iformat->name, "image2") && s->iformat->flags & AVFMT_NOFILE) ||
4441         (s->flags & AVFMT_FLAG_CUSTOM_IO))
4442         pb = NULL;
4443
4444     flush_packet_queue(s);
4445
4446     if (s->iformat)
4447         if (s->iformat->read_close)
4448             s->iformat->read_close(s);
4449
4450     avformat_free_context(s);
4451
4452     *ps = NULL;
4453
4454     avio_close(pb);
4455 }
4456
4457 AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c)
4458 {
4459     AVStream *st;
4460     int i;
4461     AVStream **streams;
4462
4463     if (s->nb_streams >= FFMIN(s->max_streams, INT_MAX/sizeof(*streams))) {
4464         if (s->max_streams < INT_MAX/sizeof(*streams))
4465             av_log(s, AV_LOG_ERROR, "Number of streams exceeds max_streams parameter (%d), see the documentation if you wish to increase it\n", s->max_streams);
4466         return NULL;
4467     }
4468     streams = av_realloc_array(s->streams, s->nb_streams + 1, sizeof(*streams));
4469     if (!streams)
4470         return NULL;
4471     s->streams = streams;
4472
4473     st = av_mallocz(sizeof(AVStream));
4474     if (!st)
4475         return NULL;
4476     if (!(st->info = av_mallocz(sizeof(*st->info)))) {
4477         av_free(st);
4478         return NULL;
4479     }
4480     st->info->last_dts = AV_NOPTS_VALUE;
4481
4482 #if FF_API_LAVF_AVCTX
4483 FF_DISABLE_DEPRECATION_WARNINGS
4484     st->codec = avcodec_alloc_context3(c);
4485     if (!st->codec) {
4486         av_free(st->info);
4487         av_free(st);
4488         return NULL;
4489     }
4490 FF_ENABLE_DEPRECATION_WARNINGS
4491 #endif
4492
4493     st->internal = av_mallocz(sizeof(*st->internal));
4494     if (!st->internal)
4495         goto fail;
4496
4497     st->codecpar = avcodec_parameters_alloc();
4498     if (!st->codecpar)
4499         goto fail;
4500
4501     st->internal->avctx = avcodec_alloc_context3(NULL);
4502     if (!st->internal->avctx)
4503         goto fail;
4504
4505     if (s->iformat) {
4506 #if FF_API_LAVF_AVCTX
4507 FF_DISABLE_DEPRECATION_WARNINGS
4508         /* no default bitrate if decoding */
4509         st->codec->bit_rate = 0;
4510 FF_ENABLE_DEPRECATION_WARNINGS
4511 #endif
4512
4513         /* default pts setting is MPEG-like */
4514         avpriv_set_pts_info(st, 33, 1, 90000);
4515         /* we set the current DTS to 0 so that formats without any timestamps
4516          * but durations get some timestamps, formats with some unknown
4517          * timestamps have their first few packets buffered and the
4518          * timestamps corrected before they are returned to the user */
4519         st->cur_dts = RELATIVE_TS_BASE;
4520     } else {
4521         st->cur_dts = AV_NOPTS_VALUE;
4522     }
4523
4524     st->index      = s->nb_streams;
4525     st->start_time = AV_NOPTS_VALUE;
4526     st->duration   = AV_NOPTS_VALUE;
4527     st->first_dts     = AV_NOPTS_VALUE;
4528     st->probe_packets = MAX_PROBE_PACKETS;
4529     st->pts_wrap_reference = AV_NOPTS_VALUE;
4530     st->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
4531
4532     st->last_IP_pts = AV_NOPTS_VALUE;
4533     st->last_dts_for_order_check = AV_NOPTS_VALUE;
4534     for (i = 0; i < MAX_REORDER_DELAY + 1; i++)
4535         st->pts_buffer[i] = AV_NOPTS_VALUE;
4536
4537     st->sample_aspect_ratio = (AVRational) { 0, 1 };
4538
4539 #if FF_API_R_FRAME_RATE
4540     st->info->last_dts      = AV_NOPTS_VALUE;
4541 #endif
4542     st->info->fps_first_dts = AV_NOPTS_VALUE;
4543     st->info->fps_last_dts  = AV_NOPTS_VALUE;
4544
4545     st->inject_global_side_data = s->internal->inject_global_side_data;
4546
4547     st->internal->need_context_update = 1;
4548
4549     s->streams[s->nb_streams++] = st;
4550     return st;
4551 fail:
4552     free_stream(&st);
4553     return NULL;
4554 }
4555
4556 AVProgram *av_new_program(AVFormatContext *ac, int id)
4557 {
4558     AVProgram *program = NULL;
4559     int i;
4560
4561     av_log(ac, AV_LOG_TRACE, "new_program: id=0x%04x\n", id);
4562
4563     for (i = 0; i < ac->nb_programs; i++)
4564         if (ac->programs[i]->id == id)
4565             program = ac->programs[i];
4566
4567     if (!program) {
4568         program = av_mallocz(sizeof(AVProgram));
4569         if (!program)
4570             return NULL;
4571         dynarray_add(&ac->programs, &ac->nb_programs, program);
4572         program->discard = AVDISCARD_NONE;
4573         program->pmt_version = -1;
4574     }
4575     program->id = id;
4576     program->pts_wrap_reference = AV_NOPTS_VALUE;
4577     program->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
4578
4579     program->start_time =
4580     program->end_time   = AV_NOPTS_VALUE;
4581
4582     return program;
4583 }
4584
4585 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base,
4586                               int64_t start, int64_t end, const char *title)
4587 {
4588     AVChapter *chapter = NULL;
4589     int i;
4590
4591     if (end != AV_NOPTS_VALUE && start > end) {
4592         av_log(s, AV_LOG_ERROR, "Chapter end time %"PRId64" before start %"PRId64"\n", end, start);
4593         return NULL;
4594     }
4595
4596     for (i = 0; i < s->nb_chapters; i++)
4597         if (s->chapters[i]->id == id)
4598             chapter = s->chapters[i];
4599
4600     if (!chapter) {
4601         chapter = av_mallocz(sizeof(AVChapter));
4602         if (!chapter)
4603             return NULL;
4604         dynarray_add(&s->chapters, &s->nb_chapters, chapter);
4605     }
4606     av_dict_set(&chapter->metadata, "title", title, 0);
4607     chapter->id        = id;
4608     chapter->time_base = time_base;
4609     chapter->start     = start;
4610     chapter->end       = end;
4611
4612     return chapter;
4613 }
4614
4615 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
4616 {
4617     int i, j;
4618     AVProgram *program = NULL;
4619     void *tmp;
4620
4621     if (idx >= ac->nb_streams) {
4622         av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
4623         return;
4624     }
4625
4626     for (i = 0; i < ac->nb_programs; i++) {
4627         if (ac->programs[i]->id != progid)
4628             continue;
4629         program = ac->programs[i];
4630         for (j = 0; j < program->nb_stream_indexes; j++)
4631             if (program->stream_index[j] == idx)
4632                 return;
4633
4634         tmp = av_realloc_array(program->stream_index, program->nb_stream_indexes+1, sizeof(unsigned int));
4635         if (!tmp)
4636             return;
4637         program->stream_index = tmp;
4638         program->stream_index[program->nb_stream_indexes++] = idx;
4639         return;
4640     }
4641 }
4642
4643 uint64_t ff_ntp_time(void)
4644 {
4645     return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
4646 }
4647
4648 uint64_t ff_get_formatted_ntp_time(uint64_t ntp_time_us)
4649 {
4650     uint64_t ntp_ts, frac_part, sec;
4651     uint32_t usec;
4652
4653     //current ntp time in seconds and micro seconds
4654     sec = ntp_time_us / 1000000;
4655     usec = ntp_time_us % 1000000;
4656
4657     //encoding in ntp timestamp format
4658     frac_part = usec * 0xFFFFFFFFULL;
4659     frac_part /= 1000000;
4660
4661     if (sec > 0xFFFFFFFFULL)
4662         av_log(NULL, AV_LOG_WARNING, "NTP time format roll over detected\n");
4663
4664     ntp_ts = sec << 32;
4665     ntp_ts |= frac_part;
4666
4667     return ntp_ts;
4668 }
4669
4670 int av_get_frame_filename2(char *buf, int buf_size, const char *path, int number, int flags)
4671 {
4672     const char *p;
4673     char *q, buf1[20], c;
4674     int nd, len, percentd_found;
4675
4676     q = buf;
4677     p = path;
4678     percentd_found = 0;
4679     for (;;) {
4680         c = *p++;
4681         if (c == '\0')
4682             break;
4683         if (c == '%') {
4684             do {
4685                 nd = 0;
4686                 while (av_isdigit(*p))
4687                     nd = nd * 10 + *p++ - '0';
4688                 c = *p++;
4689             } while (av_isdigit(c));
4690
4691             switch (c) {
4692             case '%':
4693                 goto addchar;
4694             case 'd':
4695                 if (!(flags & AV_FRAME_FILENAME_FLAGS_MULTIPLE) && percentd_found)
4696                     goto fail;
4697                 percentd_found = 1;
4698                 if (number < 0)
4699                     nd += 1;
4700                 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
4701                 len = strlen(buf1);
4702                 if ((q - buf + len) > buf_size - 1)
4703                     goto fail;
4704                 memcpy(q, buf1, len);
4705                 q += len;
4706                 break;
4707             default:
4708                 goto fail;
4709             }
4710         } else {
4711 addchar:
4712             if ((q - buf) < buf_size - 1)
4713                 *q++ = c;
4714         }
4715     }
4716     if (!percentd_found)
4717         goto fail;
4718     *q = '\0';
4719     return 0;
4720 fail:
4721     *q = '\0';
4722     return -1;
4723 }
4724
4725 int av_get_frame_filename(char *buf, int buf_size, const char *path, int number)
4726 {
4727     return av_get_frame_filename2(buf, buf_size, path, number, 0);
4728 }
4729
4730 void av_url_split(char *proto, int proto_size,
4731                   char *authorization, int authorization_size,
4732                   char *hostname, int hostname_size,
4733                   int *port_ptr, char *path, int path_size, const char *url)
4734 {
4735     const char *p, *ls, *ls2, *at, *at2, *col, *brk;
4736
4737     if (port_ptr)
4738         *port_ptr = -1;
4739     if (proto_size > 0)
4740         proto[0] = 0;
4741     if (authorization_size > 0)
4742         authorization[0] = 0;
4743     if (hostname_size > 0)
4744         hostname[0] = 0;
4745     if (path_size > 0)
4746         path[0] = 0;
4747
4748     /* parse protocol */
4749     if ((p = strchr(url, ':'))) {
4750         av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
4751         p++; /* skip ':' */
4752         if (*p == '/')
4753             p++;
4754         if (*p == '/')
4755             p++;
4756     } else {
4757         /* no protocol means plain filename */
4758         av_strlcpy(path, url, path_size);
4759         return;
4760     }
4761
4762     /* separate path from hostname */
4763     ls = strchr(p, '/');
4764     ls2 = strchr(p, '?');
4765     if (!ls)
4766         ls = ls2;
4767     else if (ls && ls2)
4768         ls = FFMIN(ls, ls2);
4769     if (ls)
4770         av_strlcpy(path, ls, path_size);
4771     else
4772         ls = &p[strlen(p)];  // XXX
4773
4774     /* the rest is hostname, use that to parse auth/port */
4775     if (ls != p) {
4776         /* authorization (user[:pass]@hostname) */
4777         at2 = p;
4778         while ((at = strchr(p, '@')) && at < ls) {
4779             av_strlcpy(authorization, at2,
4780                        FFMIN(authorization_size, at + 1 - at2));
4781             p = at + 1; /* skip '@' */
4782         }
4783
4784         if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
4785             /* [host]:port */
4786             av_strlcpy(hostname, p + 1,
4787                        FFMIN(hostname_size, brk - p));
4788             if (brk[1] == ':' && port_ptr)
4789                 *port_ptr = atoi(brk + 2);
4790         } else if ((col = strchr(p, ':')) && col < ls) {
4791             av_strlcpy(hostname, p,
4792                        FFMIN(col + 1 - p, hostname_size));
4793             if (port_ptr)
4794                 *port_ptr = atoi(col + 1);
4795         } else
4796             av_strlcpy(hostname, p,
4797                        FFMIN(ls + 1 - p, hostname_size));
4798     }
4799 }
4800
4801 int ff_mkdir_p(const char *path)
4802 {
4803     int ret = 0;
4804     char *temp = av_strdup(path);
4805     char *pos = temp;
4806     char tmp_ch = '\0';
4807
4808     if (!path || !temp) {
4809         return -1;
4810     }
4811
4812     if (!av_strncasecmp(temp, "/", 1) || !av_strncasecmp(temp, "\\", 1)) {
4813         pos++;
4814     } else if (!av_strncasecmp(temp, "./", 2) || !av_strncasecmp(temp, ".\\", 2)) {
4815         pos += 2;
4816     }
4817
4818     for ( ; *pos != '\0'; ++pos) {
4819         if (*pos == '/' || *pos == '\\') {
4820             tmp_ch = *pos;
4821             *pos = '\0';
4822             ret = mkdir(temp, 0755);
4823             *pos = tmp_ch;
4824         }
4825     }
4826
4827     if ((*(pos - 1) != '/') || (*(pos - 1) != '\\')) {
4828         ret = mkdir(temp, 0755);
4829     }
4830
4831     av_free(temp);
4832     return ret;
4833 }
4834
4835 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
4836 {
4837     int i;
4838     static const char hex_table_uc[16] = { '0', '1', '2', '3',
4839                                            '4', '5', '6', '7',
4840                                            '8', '9', 'A', 'B',
4841                                            'C', 'D', 'E', 'F' };
4842     static const char hex_table_lc[16] = { '0', '1', '2', '3',
4843                                            '4', '5', '6', '7',
4844                                            '8', '9', 'a', 'b',
4845                                            'c', 'd', 'e', 'f' };
4846     const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
4847
4848     for (i = 0; i < s; i++) {
4849         buff[i * 2]     = hex_table[src[i] >> 4];
4850         buff[i * 2 + 1] = hex_table[src[i] & 0xF];
4851     }
4852
4853     return buff;
4854 }
4855
4856 int ff_hex_to_data(uint8_t *data, const char *p)
4857 {
4858     int c, len, v;
4859
4860     len = 0;
4861     v   = 1;
4862     for (;;) {
4863         p += strspn(p, SPACE_CHARS);
4864         if (*p == '\0')
4865             break;
4866         c = av_toupper((unsigned char) *p++);
4867         if (c >= '0' && c <= '9')
4868             c = c - '0';
4869         else if (c >= 'A' && c <= 'F')
4870             c = c - 'A' + 10;
4871         else
4872             break;
4873         v = (v << 4) | c;
4874         if (v & 0x100) {
4875             if (data)
4876                 data[len] = v;
4877             len++;
4878             v = 1;
4879         }
4880     }
4881     return len;
4882 }
4883
4884 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
4885                          unsigned int pts_num, unsigned int pts_den)
4886 {
4887     AVRational new_tb;
4888     if (av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)) {
4889         if (new_tb.num != pts_num)
4890             av_log(NULL, AV_LOG_DEBUG,
4891                    "st:%d removing common factor %d from timebase\n",
4892                    s->index, pts_num / new_tb.num);
4893     } else
4894         av_log(NULL, AV_LOG_WARNING,
4895                "st:%d has too large timebase, reducing\n", s->index);
4896
4897     if (new_tb.num <= 0 || new_tb.den <= 0) {
4898         av_log(NULL, AV_LOG_ERROR,
4899                "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
4900                new_tb.num, new_tb.den,
4901                s->index);
4902         return;
4903     }
4904     s->time_base     = new_tb;
4905 #if FF_API_LAVF_AVCTX
4906 FF_DISABLE_DEPRECATION_WARNINGS
4907     s->codec->pkt_timebase = new_tb;
4908 FF_ENABLE_DEPRECATION_WARNINGS
4909 #endif
4910     s->internal->avctx->pkt_timebase = new_tb;
4911     s->pts_wrap_bits = pts_wrap_bits;
4912 }
4913
4914 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
4915                         void *context)
4916 {
4917     const char *ptr = str;
4918
4919     /* Parse key=value pairs. */
4920     for (;;) {
4921         const char *key;
4922         char *dest = NULL, *dest_end;
4923         int key_len, dest_len = 0;
4924
4925         /* Skip whitespace and potential commas. */
4926         while (*ptr && (av_isspace(*ptr) || *ptr == ','))
4927             ptr++;
4928         if (!*ptr)
4929             break;
4930
4931         key = ptr;
4932
4933         if (!(ptr = strchr(key, '=')))
4934             break;
4935         ptr++;
4936         key_len = ptr - key;
4937
4938         callback_get_buf(context, key, key_len, &dest, &dest_len);
4939         dest_end = dest + dest_len - 1;
4940
4941         if (*ptr == '\"') {
4942             ptr++;
4943             while (*ptr && *ptr != '\"') {
4944                 if (*ptr == '\\') {
4945                     if (!ptr[1])
4946                         break;
4947                     if (dest && dest < dest_end)
4948                         *dest++ = ptr[1];
4949                     ptr += 2;
4950                 } else {
4951                     if (dest && dest < dest_end)
4952                         *dest++ = *ptr;
4953                     ptr++;
4954                 }
4955             }
4956             if (*ptr == '\"')
4957                 ptr++;
4958         } else {
4959             for (; *ptr && !(av_isspace(*ptr) || *ptr == ','); ptr++)
4960                 if (dest && dest < dest_end)
4961                     *dest++ = *ptr;
4962         }
4963         if (dest)
4964             *dest = 0;
4965     }
4966 }
4967
4968 int ff_find_stream_index(AVFormatContext *s, int id)
4969 {
4970     int i;
4971     for (i = 0; i < s->nb_streams; i++)
4972         if (s->streams[i]->id == id)
4973             return i;
4974     return -1;
4975 }
4976
4977 int avformat_query_codec(const AVOutputFormat *ofmt, enum AVCodecID codec_id,
4978                          int std_compliance)
4979 {
4980     if (ofmt) {
4981         unsigned int codec_tag;
4982         if (ofmt->query_codec)
4983             return ofmt->query_codec(codec_id, std_compliance);
4984         else if (ofmt->codec_tag)
4985             return !!av_codec_get_tag2(ofmt->codec_tag, codec_id, &codec_tag);
4986         else if (codec_id == ofmt->video_codec ||
4987                  codec_id == ofmt->audio_codec ||
4988                  codec_id == ofmt->subtitle_codec ||
4989                  codec_id == ofmt->data_codec)
4990             return 1;
4991     }
4992     return AVERROR_PATCHWELCOME;
4993 }
4994
4995 int avformat_network_init(void)
4996 {
4997 #if CONFIG_NETWORK
4998     int ret;
4999     if ((ret = ff_network_init()) < 0)
5000         return ret;
5001     if ((ret = ff_tls_init()) < 0)
5002         return ret;
5003 #endif
5004     return 0;
5005 }
5006
5007 int avformat_network_deinit(void)
5008 {
5009 #if CONFIG_NETWORK
5010     ff_network_close();
5011     ff_tls_deinit();
5012 #endif
5013     return 0;
5014 }
5015
5016 int ff_add_param_change(AVPacket *pkt, int32_t channels,
5017                         uint64_t channel_layout, int32_t sample_rate,
5018                         int32_t width, int32_t height)
5019 {
5020     uint32_t flags = 0;
5021     int size = 4;
5022     uint8_t *data;
5023     if (!pkt)
5024         return AVERROR(EINVAL);
5025     if (channels) {
5026         size  += 4;
5027         flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
5028     }
5029     if (channel_layout) {
5030         size  += 8;
5031         flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
5032     }
5033     if (sample_rate) {
5034         size  += 4;
5035         flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
5036     }
5037     if (width || height) {
5038         size  += 8;
5039         flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
5040     }
5041     data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
5042     if (!data)
5043         return AVERROR(ENOMEM);
5044     bytestream_put_le32(&data, flags);
5045     if (channels)
5046         bytestream_put_le32(&data, channels);
5047     if (channel_layout)
5048         bytestream_put_le64(&data, channel_layout);
5049     if (sample_rate)
5050         bytestream_put_le32(&data, sample_rate);
5051     if (width || height) {
5052         bytestream_put_le32(&data, width);
5053         bytestream_put_le32(&data, height);
5054     }
5055     return 0;
5056 }
5057
5058 AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame)
5059 {
5060     AVRational undef = {0, 1};
5061     AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
5062     AVRational codec_sample_aspect_ratio  = stream && stream->codecpar ? stream->codecpar->sample_aspect_ratio : undef;
5063     AVRational frame_sample_aspect_ratio  = frame  ? frame->sample_aspect_ratio  : codec_sample_aspect_ratio;
5064
5065     av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
5066                stream_sample_aspect_ratio.num,  stream_sample_aspect_ratio.den, INT_MAX);
5067     if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
5068         stream_sample_aspect_ratio = undef;
5069
5070     av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
5071                frame_sample_aspect_ratio.num,  frame_sample_aspect_ratio.den, INT_MAX);
5072     if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
5073         frame_sample_aspect_ratio = undef;
5074
5075     if (stream_sample_aspect_ratio.num)
5076         return stream_sample_aspect_ratio;
5077     else
5078         return frame_sample_aspect_ratio;
5079 }
5080
5081 AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *frame)
5082 {
5083     AVRational fr = st->r_frame_rate;
5084     AVRational codec_fr = st->internal->avctx->framerate;
5085     AVRational   avg_fr = st->avg_frame_rate;
5086
5087     if (avg_fr.num > 0 && avg_fr.den > 0 && fr.num > 0 && fr.den > 0 &&
5088         av_q2d(avg_fr) < 70 && av_q2d(fr) > 210) {
5089         fr = avg_fr;
5090     }
5091
5092
5093     if (st->internal->avctx->ticks_per_frame > 1) {
5094         if (   codec_fr.num > 0 && codec_fr.den > 0 &&
5095             (fr.num == 0 || av_q2d(codec_fr) < av_q2d(fr)*0.7 && fabs(1.0 - av_q2d(av_div_q(avg_fr, fr))) > 0.1))
5096             fr = codec_fr;
5097     }
5098
5099     return fr;
5100 }
5101
5102 /**
5103  * Matches a stream specifier (but ignores requested index).
5104  *
5105  * @param indexptr set to point to the requested stream index if there is one
5106  *
5107  * @return <0 on error
5108  *         0  if st is NOT a matching stream
5109  *         >0 if st is a matching stream
5110  */
5111 static int match_stream_specifier(AVFormatContext *s, AVStream *st,
5112                                   const char *spec, const char **indexptr, AVProgram **p)
5113 {
5114     int match = 1;                      /* Stores if the specifier matches so far. */
5115     while (*spec) {
5116         if (*spec <= '9' && *spec >= '0') { /* opt:index */
5117             if (indexptr)
5118                 *indexptr = spec;
5119             return match;
5120         } else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
5121                    *spec == 't' || *spec == 'V') { /* opt:[vasdtV] */
5122             enum AVMediaType type;
5123             int nopic = 0;
5124
5125             switch (*spec++) {
5126             case 'v': type = AVMEDIA_TYPE_VIDEO;      break;
5127             case 'a': type = AVMEDIA_TYPE_AUDIO;      break;
5128             case 's': type = AVMEDIA_TYPE_SUBTITLE;   break;
5129             case 'd': type = AVMEDIA_TYPE_DATA;       break;
5130             case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
5131             case 'V': type = AVMEDIA_TYPE_VIDEO; nopic = 1; break;
5132             default:  av_assert0(0);
5133             }
5134             if (*spec && *spec++ != ':')         /* If we are not at the end, then another specifier must follow. */
5135                 return AVERROR(EINVAL);
5136
5137 #if FF_API_LAVF_AVCTX
5138 FF_DISABLE_DEPRECATION_WARNINGS
5139             if (type != st->codecpar->codec_type
5140                && (st->codecpar->codec_type != AVMEDIA_TYPE_UNKNOWN || st->codec->codec_type != type))
5141                 match = 0;
5142     FF_ENABLE_DEPRECATION_WARNINGS
5143 #else
5144             if (type != st->codecpar->codec_type)
5145                 match = 0;
5146 #endif
5147             if (nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC))
5148                 match = 0;
5149         } else if (*spec == 'p' && *(spec + 1) == ':') {
5150             int prog_id, i, j;
5151             int found = 0;
5152             char *endptr;
5153             spec += 2;
5154             prog_id = strtol(spec, &endptr, 0);
5155             /* Disallow empty id and make sure that if we are not at the end, then another specifier must follow. */
5156             if (spec == endptr || (*endptr && *endptr++ != ':'))
5157                 return AVERROR(EINVAL);
5158             spec = endptr;
5159             if (match) {
5160                 for (i = 0; i < s->nb_programs; i++) {
5161                     if (s->programs[i]->id != prog_id)
5162                         continue;
5163
5164                     for (j = 0; j < s->programs[i]->nb_stream_indexes; j++) {
5165                         if (st->index == s->programs[i]->stream_index[j]) {
5166                             found = 1;
5167                             if (p)
5168                                 *p = s->programs[i];
5169                             i = s->nb_programs;
5170                             break;
5171                         }
5172                     }
5173                 }
5174             }
5175             if (!found)
5176                 match = 0;
5177         } else if (*spec == '#' ||
5178                    (*spec == 'i' && *(spec + 1) == ':')) {
5179             int stream_id;
5180             char *endptr;
5181             spec += 1 + (*spec == 'i');
5182             stream_id = strtol(spec, &endptr, 0);
5183             if (spec == endptr || *endptr)                /* Disallow empty id and make sure we are at the end. */
5184                 return AVERROR(EINVAL);
5185             return match && (stream_id == st->id);
5186         } else if (*spec == 'm' && *(spec + 1) == ':') {
5187             AVDictionaryEntry *tag;
5188             char *key, *val;
5189             int ret;
5190
5191             if (match) {
5192                spec += 2;
5193                val = strchr(spec, ':');
5194
5195                key = val ? av_strndup(spec, val - spec) : av_strdup(spec);
5196                if (!key)
5197                    return AVERROR(ENOMEM);
5198
5199                tag = av_dict_get(st->metadata, key, NULL, 0);
5200                if (tag) {
5201                    if (!val || !strcmp(tag->value, val + 1))
5202                        ret = 1;
5203                    else
5204                        ret = 0;
5205                } else
5206                    ret = 0;
5207
5208                av_freep(&key);
5209             }
5210             return match && ret;
5211         } else if (*spec == 'u' && *(spec + 1) == '\0') {
5212             AVCodecParameters *par = st->codecpar;
5213 #if FF_API_LAVF_AVCTX
5214 FF_DISABLE_DEPRECATION_WARNINGS
5215             AVCodecContext *codec = st->codec;
5216 FF_ENABLE_DEPRECATION_WARNINGS
5217 #endif
5218             int val;
5219             switch (par->codec_type) {
5220             case AVMEDIA_TYPE_AUDIO:
5221                 val = par->sample_rate && par->channels;
5222 #if FF_API_LAVF_AVCTX
5223                 val = val || (codec->sample_rate && codec->channels);
5224 #endif
5225                 if (par->format == AV_SAMPLE_FMT_NONE
5226 #if FF_API_LAVF_AVCTX
5227                     && codec->sample_fmt == AV_SAMPLE_FMT_NONE
5228 #endif
5229                     )
5230                     return 0;
5231                 break;
5232             case AVMEDIA_TYPE_VIDEO:
5233                 val = par->width && par->height;
5234 #if FF_API_LAVF_AVCTX
5235                 val = val || (codec->width && codec->height);
5236 #endif
5237                 if (par->format == AV_PIX_FMT_NONE
5238 #if FF_API_LAVF_AVCTX
5239                     && codec->pix_fmt == AV_PIX_FMT_NONE
5240 #endif
5241                     )
5242                     return 0;
5243                 break;
5244             case AVMEDIA_TYPE_UNKNOWN:
5245                 val = 0;
5246                 break;
5247             default:
5248                 val = 1;
5249                 break;
5250             }
5251 #if FF_API_LAVF_AVCTX
5252             return match && ((par->codec_id != AV_CODEC_ID_NONE || codec->codec_id != AV_CODEC_ID_NONE) && val != 0);
5253 #else
5254             return match && (par->codec_id != AV_CODEC_ID_NONE && val != 0);
5255 #endif
5256         } else {
5257             return AVERROR(EINVAL);
5258         }
5259     }
5260
5261     return match;
5262 }
5263
5264
5265 int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
5266                                     const char *spec)
5267 {
5268     int ret, index;
5269     char *endptr;
5270     const char *indexptr = NULL;
5271     AVProgram *p = NULL;
5272     int nb_streams;
5273
5274     ret = match_stream_specifier(s, st, spec, &indexptr, &p);
5275     if (ret < 0)
5276         goto error;
5277
5278     if (!indexptr)
5279         return ret;
5280
5281     index = strtol(indexptr, &endptr, 0);
5282     if (*endptr) {                  /* We can't have anything after the requested index. */
5283         ret = AVERROR(EINVAL);
5284         goto error;
5285     }
5286
5287     /* This is not really needed but saves us a loop for simple stream index specifiers. */
5288     if (spec == indexptr)
5289         return (index == st->index);
5290
5291     /* If we requested a matching stream index, we have to ensure st is that. */
5292     nb_streams = p ? p->nb_stream_indexes : s->nb_streams;
5293     for (int i = 0; i < nb_streams && index >= 0; i++) {
5294         AVStream *candidate = p ? s->streams[p->stream_index[i]] : s->streams[i];
5295         ret = match_stream_specifier(s, candidate, spec, NULL, NULL);
5296         if (ret < 0)
5297             goto error;
5298         if (ret > 0 && index-- == 0 && st == candidate)
5299             return 1;
5300     }
5301     return 0;
5302
5303 error:
5304     if (ret == AVERROR(EINVAL))
5305         av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
5306     return ret;
5307 }
5308
5309 int ff_generate_avci_extradata(AVStream *st)
5310 {
5311     static const uint8_t avci100_1080p_extradata[] = {
5312         // SPS
5313         0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5314         0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
5315         0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
5316         0x18, 0x21, 0x02, 0x56, 0xb9, 0x3d, 0x7d, 0x7e,
5317         0x4f, 0xe3, 0x3f, 0x11, 0xf1, 0x9e, 0x08, 0xb8,
5318         0x8c, 0x54, 0x43, 0xc0, 0x78, 0x02, 0x27, 0xe2,
5319         0x70, 0x1e, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00,
5320         0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xca,
5321         0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5322         // PPS
5323         0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
5324         0xd0
5325     };
5326     static const uint8_t avci100_1080i_extradata[] = {
5327         // SPS
5328         0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5329         0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
5330         0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
5331         0x18, 0x21, 0x03, 0x3a, 0x46, 0x65, 0x6a, 0x65,
5332         0x24, 0xad, 0xe9, 0x12, 0x32, 0x14, 0x1a, 0x26,
5333         0x34, 0xad, 0xa4, 0x41, 0x82, 0x23, 0x01, 0x50,
5334         0x2b, 0x1a, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2e,
5335         0x11, 0x12, 0x08, 0xc6, 0x8c, 0x04, 0x41, 0x28,
5336         0x4c, 0x34, 0xf0, 0x1e, 0x01, 0x13, 0xf2, 0xe0,
5337         0x3c, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03,
5338         0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x20,
5339         // PPS
5340         0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
5341         0xd0
5342     };
5343     static const uint8_t avci50_1080p_extradata[] = {
5344         // SPS
5345         0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
5346         0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5347         0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5348         0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
5349         0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
5350         0x6e, 0x6c, 0xd3, 0x3c, 0x05, 0xa0, 0x22, 0x7e,
5351         0x5f, 0xfc, 0x00, 0x0c, 0x00, 0x13, 0x8c, 0x04,
5352         0x04, 0x05, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00,
5353         0x00, 0x03, 0x00, 0x32, 0x84, 0x00, 0x00, 0x00,
5354         // PPS
5355         0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5356         0x11
5357     };
5358     static const uint8_t avci50_1080i_extradata[] = {
5359         // SPS
5360         0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
5361         0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5362         0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5363         0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6e, 0x61,
5364         0x87, 0x3e, 0x73, 0x4d, 0x98, 0x0c, 0x03, 0x06,
5365         0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63,
5366         0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19,
5367         0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16,
5368         0x81, 0x13, 0xf7, 0xff, 0x80, 0x02, 0x00, 0x01,
5369         0xf1, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
5370         0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00,
5371         // PPS
5372         0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5373         0x11
5374     };
5375     static const uint8_t avci100_720p_extradata[] = {
5376         // SPS
5377         0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5378         0xb6, 0xd4, 0x20, 0x2a, 0x33, 0x1d, 0xc7, 0x62,
5379         0xa1, 0x08, 0x40, 0x54, 0x66, 0x3b, 0x8e, 0xc5,
5380         0x42, 0x02, 0x10, 0x25, 0x64, 0x2c, 0x89, 0xe8,
5381         0x85, 0xe4, 0x21, 0x4b, 0x90, 0x83, 0x06, 0x95,
5382         0xd1, 0x06, 0x46, 0x97, 0x20, 0xc8, 0xd7, 0x43,
5383         0x08, 0x11, 0xc2, 0x1e, 0x4c, 0x91, 0x0f, 0x01,
5384         0x40, 0x16, 0xec, 0x07, 0x8c, 0x04, 0x04, 0x05,
5385         0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03,
5386         0x00, 0x64, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
5387         // PPS
5388         0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x31, 0x12,
5389         0x11
5390     };
5391     static const uint8_t avci50_720p_extradata[] = {
5392         // SPS
5393         0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x20,
5394         0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5395         0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5396         0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
5397         0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
5398         0x6e, 0x6c, 0xd3, 0x3c, 0x0f, 0x01, 0x6e, 0xff,
5399         0xc0, 0x00, 0xc0, 0x01, 0x38, 0xc0, 0x40, 0x40,
5400         0x50, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00,
5401         0x06, 0x48, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
5402         // PPS
5403         0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5404         0x11
5405     };
5406
5407     const uint8_t *data = NULL;
5408     int size            = 0;
5409
5410     if (st->codecpar->width == 1920) {
5411         if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
5412             data = avci100_1080p_extradata;
5413             size = sizeof(avci100_1080p_extradata);
5414         } else {
5415             data = avci100_1080i_extradata;
5416             size = sizeof(avci100_1080i_extradata);
5417         }
5418     } else if (st->codecpar->width == 1440) {
5419         if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
5420             data = avci50_1080p_extradata;
5421             size = sizeof(avci50_1080p_extradata);
5422         } else {
5423             data = avci50_1080i_extradata;
5424             size = sizeof(avci50_1080i_extradata);
5425         }
5426     } else if (st->codecpar->width == 1280) {
5427         data = avci100_720p_extradata;
5428         size = sizeof(avci100_720p_extradata);
5429     } else if (st->codecpar->width == 960) {
5430         data = avci50_720p_extradata;
5431         size = sizeof(avci50_720p_extradata);
5432     }
5433
5434     if (!size)
5435         return 0;
5436
5437     av_freep(&st->codecpar->extradata);
5438     if (ff_alloc_extradata(st->codecpar, size))
5439         return AVERROR(ENOMEM);
5440     memcpy(st->codecpar->extradata, data, size);
5441
5442     return 0;
5443 }
5444
5445 uint8_t *av_stream_get_side_data(const AVStream *st,
5446                                  enum AVPacketSideDataType type, int *size)
5447 {
5448     int i;
5449
5450     for (i = 0; i < st->nb_side_data; i++) {
5451         if (st->side_data[i].type == type) {
5452             if (size)
5453                 *size = st->side_data[i].size;
5454             return st->side_data[i].data;
5455         }
5456     }
5457     return NULL;
5458 }
5459
5460 int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type,
5461                             uint8_t *data, size_t size)
5462 {
5463     AVPacketSideData *sd, *tmp;
5464     int i;
5465
5466     for (i = 0; i < st->nb_side_data; i++) {
5467         sd = &st->side_data[i];
5468
5469         if (sd->type == type) {
5470             av_freep(&sd->data);
5471             sd->data = data;
5472             sd->size = size;
5473             return 0;
5474         }
5475     }
5476
5477     if ((unsigned)st->nb_side_data + 1 >= INT_MAX / sizeof(*st->side_data))
5478         return AVERROR(ERANGE);
5479
5480     tmp = av_realloc(st->side_data, (st->nb_side_data + 1) * sizeof(*tmp));
5481     if (!tmp) {
5482         return AVERROR(ENOMEM);
5483     }
5484
5485     st->side_data = tmp;
5486     st->nb_side_data++;
5487
5488     sd = &st->side_data[st->nb_side_data - 1];
5489     sd->type = type;
5490     sd->data = data;
5491     sd->size = size;
5492
5493     return 0;
5494 }
5495
5496 uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type,
5497                                  int size)
5498 {
5499     int ret;
5500     uint8_t *data = av_malloc(size);
5501
5502     if (!data)
5503         return NULL;
5504
5505     ret = av_stream_add_side_data(st, type, data, size);
5506     if (ret < 0) {
5507         av_freep(&data);
5508         return NULL;
5509     }
5510
5511     return data;
5512 }
5513
5514 int ff_stream_add_bitstream_filter(AVStream *st, const char *name, const char *args)
5515 {
5516     int ret;
5517     const AVBitStreamFilter *bsf;
5518     AVBSFContext *bsfc;
5519     AVCodecParameters *in_par;
5520
5521     if (!(bsf = av_bsf_get_by_name(name))) {
5522         av_log(NULL, AV_LOG_ERROR, "Unknown bitstream filter '%s'\n", name);
5523         return AVERROR_BSF_NOT_FOUND;
5524     }
5525
5526     if ((ret = av_bsf_alloc(bsf, &bsfc)) < 0)
5527         return ret;
5528
5529     if (st->internal->nb_bsfcs) {
5530         in_par = st->internal->bsfcs[st->internal->nb_bsfcs - 1]->par_out;
5531         bsfc->time_base_in = st->internal->bsfcs[st->internal->nb_bsfcs - 1]->time_base_out;
5532     } else {
5533         in_par = st->codecpar;
5534         bsfc->time_base_in = st->time_base;
5535     }
5536
5537     if ((ret = avcodec_parameters_copy(bsfc->par_in, in_par)) < 0) {
5538         av_bsf_free(&bsfc);
5539         return ret;
5540     }
5541
5542     if (args && bsfc->filter->priv_class) {
5543         const AVOption *opt = av_opt_next(bsfc->priv_data, NULL);
5544         const char * shorthand[2] = {NULL};
5545
5546         if (opt)
5547             shorthand[0] = opt->name;
5548
5549         if ((ret = av_opt_set_from_string(bsfc->priv_data, args, shorthand, "=", ":")) < 0) {
5550             av_bsf_free(&bsfc);
5551             return ret;
5552         }
5553     }
5554
5555     if ((ret = av_bsf_init(bsfc)) < 0) {
5556         av_bsf_free(&bsfc);
5557         return ret;
5558     }
5559
5560     if ((ret = av_dynarray_add_nofree(&st->internal->bsfcs, &st->internal->nb_bsfcs, bsfc))) {
5561         av_bsf_free(&bsfc);
5562         return ret;
5563     }
5564
5565     av_log(NULL, AV_LOG_VERBOSE,
5566            "Automatically inserted bitstream filter '%s'; args='%s'\n",
5567            name, args ? args : "");
5568     return 1;
5569 }
5570
5571 #if FF_API_OLD_BSF
5572 FF_DISABLE_DEPRECATION_WARNINGS
5573 int av_apply_bitstream_filters(AVCodecContext *codec, AVPacket *pkt,
5574                                AVBitStreamFilterContext *bsfc)
5575 {
5576     int ret = 0;
5577     while (bsfc) {
5578         AVPacket new_pkt = *pkt;
5579         int a = av_bitstream_filter_filter(bsfc, codec, NULL,
5580                                            &new_pkt.data, &new_pkt.size,
5581                                            pkt->data, pkt->size,
5582                                            pkt->flags & AV_PKT_FLAG_KEY);
5583         if (a == 0 && new_pkt.size == 0 && new_pkt.side_data_elems == 0) {
5584             av_packet_unref(pkt);
5585             memset(pkt, 0, sizeof(*pkt));
5586             return 0;
5587         }
5588         if(a == 0 && new_pkt.data != pkt->data) {
5589             uint8_t *t = av_malloc(new_pkt.size + AV_INPUT_BUFFER_PADDING_SIZE); //the new should be a subset of the old so cannot overflow
5590             if (t) {
5591                 memcpy(t, new_pkt.data, new_pkt.size);
5592                 memset(t + new_pkt.size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
5593                 new_pkt.data = t;
5594                 new_pkt.buf = NULL;
5595                 a = 1;
5596             } else {
5597                 a = AVERROR(ENOMEM);
5598             }
5599         }
5600         if (a > 0) {
5601             new_pkt.buf = av_buffer_create(new_pkt.data, new_pkt.size,
5602                                            av_buffer_default_free, NULL, 0);
5603             if (new_pkt.buf) {
5604                 pkt->side_data = NULL;
5605                 pkt->side_data_elems = 0;
5606                 av_packet_unref(pkt);
5607             } else {
5608                 av_freep(&new_pkt.data);
5609                 a = AVERROR(ENOMEM);
5610             }
5611         }
5612         if (a < 0) {
5613             av_log(codec, AV_LOG_ERROR,
5614                    "Failed to open bitstream filter %s for stream %d with codec %s",
5615                    bsfc->filter->name, pkt->stream_index,
5616                    codec->codec ? codec->codec->name : "copy");
5617             ret = a;
5618             break;
5619         }
5620         *pkt = new_pkt;
5621
5622         bsfc = bsfc->next;
5623     }
5624     return ret;
5625 }
5626 FF_ENABLE_DEPRECATION_WARNINGS
5627 #endif
5628
5629 int ff_format_output_open(AVFormatContext *s, const char *url, AVDictionary **options)
5630 {
5631     if (!s->oformat)
5632         return AVERROR(EINVAL);
5633
5634     if (!(s->oformat->flags & AVFMT_NOFILE))
5635         return s->io_open(s, &s->pb, url, AVIO_FLAG_WRITE, options);
5636     return 0;
5637 }
5638
5639 void ff_format_io_close(AVFormatContext *s, AVIOContext **pb)
5640 {
5641     if (*pb)
5642         s->io_close(s, *pb);
5643     *pb = NULL;
5644 }
5645
5646 int ff_is_http_proto(char *filename) {
5647     const char *proto = avio_find_protocol_name(filename);
5648     return proto ? (!av_strcasecmp(proto, "http") || !av_strcasecmp(proto, "https")) : 0;
5649 }
5650
5651 int ff_parse_creation_time_metadata(AVFormatContext *s, int64_t *timestamp, int return_seconds)
5652 {
5653     AVDictionaryEntry *entry;
5654     int64_t parsed_timestamp;
5655     int ret;
5656     if ((entry = av_dict_get(s->metadata, "creation_time", NULL, 0))) {
5657         if ((ret = av_parse_time(&parsed_timestamp, entry->value, 0)) >= 0) {
5658             *timestamp = return_seconds ? parsed_timestamp / 1000000 : parsed_timestamp;
5659             return 1;
5660         } else {
5661             av_log(s, AV_LOG_WARNING, "Failed to parse creation_time %s\n", entry->value);
5662             return ret;
5663         }
5664     }
5665     return 0;
5666 }
5667
5668 int ff_standardize_creation_time(AVFormatContext *s)
5669 {
5670     int64_t timestamp;
5671     int ret = ff_parse_creation_time_metadata(s, &timestamp, 0);
5672     if (ret == 1)
5673         return avpriv_dict_set_timestamp(&s->metadata, "creation_time", timestamp);
5674     return ret;
5675 }
5676
5677 int ff_get_packet_palette(AVFormatContext *s, AVPacket *pkt, int ret, uint32_t *palette)
5678 {
5679     uint8_t *side_data;
5680     int size;
5681
5682     side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_PALETTE, &size);
5683     if (side_data) {
5684         if (size != AVPALETTE_SIZE) {
5685             av_log(s, AV_LOG_ERROR, "Invalid palette side data\n");
5686             return AVERROR_INVALIDDATA;
5687         }
5688         memcpy(palette, side_data, AVPALETTE_SIZE);
5689         return 1;
5690     }
5691
5692     if (ret == CONTAINS_PAL) {
5693         int i;
5694         for (i = 0; i < AVPALETTE_COUNT; i++)
5695             palette[i] = AV_RL32(pkt->data + pkt->size - AVPALETTE_SIZE + i*4);
5696         return 1;
5697     }
5698
5699     return 0;
5700 }
5701
5702 int ff_bprint_to_codecpar_extradata(AVCodecParameters *par, struct AVBPrint *buf)
5703 {
5704     int ret;
5705     char *str;
5706
5707     ret = av_bprint_finalize(buf, &str);
5708     if (ret < 0)
5709         return ret;
5710     if (!av_bprint_is_complete(buf)) {
5711         av_free(str);
5712         return AVERROR(ENOMEM);
5713     }
5714
5715     par->extradata = str;
5716     /* Note: the string is NUL terminated (so extradata can be read as a
5717      * string), but the ending character is not accounted in the size (in
5718      * binary formats you are likely not supposed to mux that character). When
5719      * extradata is copied, it is also padded with AV_INPUT_BUFFER_PADDING_SIZE
5720      * zeros. */
5721     par->extradata_size = buf->len;
5722     return 0;
5723 }
5724
5725 int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt,
5726                                                   AVStream *ost, const AVStream *ist,
5727                                                   enum AVTimebaseSource copy_tb)
5728 {
5729     //TODO: use [io]st->internal->avctx
5730     const AVCodecContext *dec_ctx = ist->codec;
5731     AVCodecContext       *enc_ctx = ost->codec;
5732
5733     enc_ctx->time_base = ist->time_base;
5734     /*
5735      * Avi is a special case here because it supports variable fps but
5736      * having the fps and timebase differe significantly adds quite some
5737      * overhead
5738      */
5739     if (!strcmp(ofmt->name, "avi")) {
5740 #if FF_API_R_FRAME_RATE
5741         if (copy_tb == AVFMT_TBCF_AUTO && ist->r_frame_rate.num
5742             && av_q2d(ist->r_frame_rate) >= av_q2d(ist->avg_frame_rate)
5743             && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(ist->time_base)
5744             && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(dec_ctx->time_base)
5745             && av_q2d(ist->time_base) < 1.0/500 && av_q2d(dec_ctx->time_base) < 1.0/500
5746             || copy_tb == AVFMT_TBCF_R_FRAMERATE) {
5747             enc_ctx->time_base.num = ist->r_frame_rate.den;
5748             enc_ctx->time_base.den = 2*ist->r_frame_rate.num;
5749             enc_ctx->ticks_per_frame = 2;
5750         } else
5751 #endif
5752             if (copy_tb == AVFMT_TBCF_AUTO && av_q2d(dec_ctx->time_base)*dec_ctx->ticks_per_frame > 2*av_q2d(ist->time_base)
5753                    && av_q2d(ist->time_base) < 1.0/500
5754                    || copy_tb == AVFMT_TBCF_DECODER) {
5755             enc_ctx->time_base = dec_ctx->time_base;
5756             enc_ctx->time_base.num *= dec_ctx->ticks_per_frame;
5757             enc_ctx->time_base.den *= 2;
5758             enc_ctx->ticks_per_frame = 2;
5759         }
5760     } else if (!(ofmt->flags & AVFMT_VARIABLE_FPS)
5761                && !av_match_name(ofmt->name, "mov,mp4,3gp,3g2,psp,ipod,ismv,f4v")) {
5762         if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx->time_base.den
5763             && av_q2d(dec_ctx->time_base)*dec_ctx->ticks_per_frame > av_q2d(ist->time_base)
5764             && av_q2d(ist->time_base) < 1.0/500
5765             || copy_tb == AVFMT_TBCF_DECODER) {
5766             enc_ctx->time_base = dec_ctx->time_base;
5767             enc_ctx->time_base.num *= dec_ctx->ticks_per_frame;
5768         }
5769     }
5770
5771     if ((enc_ctx->codec_tag == AV_RL32("tmcd") || ost->codecpar->codec_tag == AV_RL32("tmcd"))
5772         && dec_ctx->time_base.num < dec_ctx->time_base.den
5773         && dec_ctx->time_base.num > 0
5774         && 121LL*dec_ctx->time_base.num > dec_ctx->time_base.den) {
5775         enc_ctx->time_base = dec_ctx->time_base;
5776     }
5777
5778     if (ost->avg_frame_rate.num)
5779         enc_ctx->time_base = av_inv_q(ost->avg_frame_rate);
5780
5781     av_reduce(&enc_ctx->time_base.num, &enc_ctx->time_base.den,
5782               enc_ctx->time_base.num, enc_ctx->time_base.den, INT_MAX);
5783
5784     return 0;
5785 }
5786
5787 AVRational av_stream_get_codec_timebase(const AVStream *st)
5788 {
5789     // See avformat_transfer_internal_stream_timing_info() TODO.
5790 #if FF_API_LAVF_AVCTX
5791 FF_DISABLE_DEPRECATION_WARNINGS
5792     return st->codec->time_base;
5793 FF_ENABLE_DEPRECATION_WARNINGS
5794 #else
5795     return st->internal->avctx->time_base;
5796 #endif
5797 }
5798
5799 void ff_format_set_url(AVFormatContext *s, char *url)
5800 {
5801     av_assert0(url);
5802     av_freep(&s->url);
5803     s->url = url;
5804 #if FF_API_FORMAT_FILENAME
5805 FF_DISABLE_DEPRECATION_WARNINGS
5806     av_strlcpy(s->filename, url, sizeof(s->filename));
5807 FF_ENABLE_DEPRECATION_WARNINGS
5808 #endif
5809 }