]> git.sesse.net Git - ffmpeg/blob - libavformat/utils.c
lavf/utils: Respect default disposition when select the AVStream
[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             av_log(ic, AV_LOG_TRACE, "stream %d: start_time: %0.3f duration: %0.3f\n", i,
2957                    (double) st->start_time * av_q2d(st->time_base),
2958                    (double) st->duration   * av_q2d(st->time_base));
2959         }
2960         av_log(ic, AV_LOG_TRACE,
2961                 "format: start_time: %0.3f duration: %0.3f bitrate=%"PRId64" kb/s\n",
2962                 (double) ic->start_time / AV_TIME_BASE,
2963                 (double) ic->duration   / AV_TIME_BASE,
2964                 (int64_t)ic->bit_rate / 1000);
2965     }
2966 }
2967
2968 static int has_codec_parameters(AVStream *st, const char **errmsg_ptr)
2969 {
2970     AVCodecContext *avctx = st->internal->avctx;
2971
2972 #define FAIL(errmsg) do {                                         \
2973         if (errmsg_ptr)                                           \
2974             *errmsg_ptr = errmsg;                                 \
2975         return 0;                                                 \
2976     } while (0)
2977
2978     if (   avctx->codec_id == AV_CODEC_ID_NONE
2979         && avctx->codec_type != AVMEDIA_TYPE_DATA)
2980         FAIL("unknown codec");
2981     switch (avctx->codec_type) {
2982     case AVMEDIA_TYPE_AUDIO:
2983         if (!avctx->frame_size && determinable_frame_size(avctx))
2984             FAIL("unspecified frame size");
2985         if (st->info->found_decoder >= 0 &&
2986             avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
2987             FAIL("unspecified sample format");
2988         if (!avctx->sample_rate)
2989             FAIL("unspecified sample rate");
2990         if (!avctx->channels)
2991             FAIL("unspecified number of channels");
2992         if (st->info->found_decoder >= 0 && !st->nb_decoded_frames && avctx->codec_id == AV_CODEC_ID_DTS)
2993             FAIL("no decodable DTS frames");
2994         break;
2995     case AVMEDIA_TYPE_VIDEO:
2996         if (!avctx->width)
2997             FAIL("unspecified size");
2998         if (st->info->found_decoder >= 0 && avctx->pix_fmt == AV_PIX_FMT_NONE)
2999             FAIL("unspecified pixel format");
3000         if (st->codecpar->codec_id == AV_CODEC_ID_RV30 || st->codecpar->codec_id == AV_CODEC_ID_RV40)
3001             if (!st->sample_aspect_ratio.num && !st->codecpar->sample_aspect_ratio.num && !st->codec_info_nb_frames)
3002                 FAIL("no frame in rv30/40 and no sar");
3003         break;
3004     case AVMEDIA_TYPE_SUBTITLE:
3005         if (avctx->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE && !avctx->width)
3006             FAIL("unspecified size");
3007         break;
3008     case AVMEDIA_TYPE_DATA:
3009         if (avctx->codec_id == AV_CODEC_ID_NONE) return 1;
3010     }
3011
3012     return 1;
3013 }
3014
3015 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
3016 static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
3017                             AVDictionary **options)
3018 {
3019     AVCodecContext *avctx = st->internal->avctx;
3020     const AVCodec *codec;
3021     int got_picture = 1, ret = 0;
3022     AVFrame *frame = av_frame_alloc();
3023     AVSubtitle subtitle;
3024     AVPacket pkt = *avpkt;
3025     int do_skip_frame = 0;
3026     enum AVDiscard skip_frame;
3027
3028     if (!frame)
3029         return AVERROR(ENOMEM);
3030
3031     if (!avcodec_is_open(avctx) &&
3032         st->info->found_decoder <= 0 &&
3033         (st->codecpar->codec_id != -st->info->found_decoder || !st->codecpar->codec_id)) {
3034         AVDictionary *thread_opt = NULL;
3035
3036         codec = find_probe_decoder(s, st, st->codecpar->codec_id);
3037
3038         if (!codec) {
3039             st->info->found_decoder = -st->codecpar->codec_id;
3040             ret                     = -1;
3041             goto fail;
3042         }
3043
3044         /* Force thread count to 1 since the H.264 decoder will not extract
3045          * SPS and PPS to extradata during multi-threaded decoding. */
3046         av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
3047         if (s->codec_whitelist)
3048             av_dict_set(options ? options : &thread_opt, "codec_whitelist", s->codec_whitelist, 0);
3049         ret = avcodec_open2(avctx, codec, options ? options : &thread_opt);
3050         if (!options)
3051             av_dict_free(&thread_opt);
3052         if (ret < 0) {
3053             st->info->found_decoder = -avctx->codec_id;
3054             goto fail;
3055         }
3056         st->info->found_decoder = 1;
3057     } else if (!st->info->found_decoder)
3058         st->info->found_decoder = 1;
3059
3060     if (st->info->found_decoder < 0) {
3061         ret = -1;
3062         goto fail;
3063     }
3064
3065     if (avpriv_codec_get_cap_skip_frame_fill_param(avctx->codec)) {
3066         do_skip_frame = 1;
3067         skip_frame = avctx->skip_frame;
3068         avctx->skip_frame = AVDISCARD_ALL;
3069     }
3070
3071     while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
3072            ret >= 0 &&
3073            (!has_codec_parameters(st, NULL) || !has_decode_delay_been_guessed(st) ||
3074             (!st->codec_info_nb_frames &&
3075              (avctx->codec->capabilities & AV_CODEC_CAP_CHANNEL_CONF)))) {
3076         got_picture = 0;
3077         if (avctx->codec_type == AVMEDIA_TYPE_VIDEO ||
3078             avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
3079             ret = avcodec_send_packet(avctx, &pkt);
3080             if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
3081                 break;
3082             if (ret >= 0)
3083                 pkt.size = 0;
3084             ret = avcodec_receive_frame(avctx, frame);
3085             if (ret >= 0)
3086                 got_picture = 1;
3087             if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
3088                 ret = 0;
3089         } else if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3090             ret = avcodec_decode_subtitle2(avctx, &subtitle,
3091                                            &got_picture, &pkt);
3092             if (ret >= 0)
3093                 pkt.size = 0;
3094         }
3095         if (ret >= 0) {
3096             if (got_picture)
3097                 st->nb_decoded_frames++;
3098             ret       = got_picture;
3099         }
3100     }
3101
3102     if (!pkt.data && !got_picture)
3103         ret = -1;
3104
3105 fail:
3106     if (do_skip_frame) {
3107         avctx->skip_frame = skip_frame;
3108     }
3109
3110     av_frame_free(&frame);
3111     return ret;
3112 }
3113
3114 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id)
3115 {
3116     while (tags->id != AV_CODEC_ID_NONE) {
3117         if (tags->id == id)
3118             return tags->tag;
3119         tags++;
3120     }
3121     return 0;
3122 }
3123
3124 enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
3125 {
3126     int i;
3127     for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
3128         if (tag == tags[i].tag)
3129             return tags[i].id;
3130     for (i = 0; tags[i].id != AV_CODEC_ID_NONE; i++)
3131         if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
3132             return tags[i].id;
3133     return AV_CODEC_ID_NONE;
3134 }
3135
3136 enum AVCodecID ff_get_pcm_codec_id(int bps, int flt, int be, int sflags)
3137 {
3138     if (bps <= 0 || bps > 64)
3139         return AV_CODEC_ID_NONE;
3140
3141     if (flt) {
3142         switch (bps) {
3143         case 32:
3144             return be ? AV_CODEC_ID_PCM_F32BE : AV_CODEC_ID_PCM_F32LE;
3145         case 64:
3146             return be ? AV_CODEC_ID_PCM_F64BE : AV_CODEC_ID_PCM_F64LE;
3147         default:
3148             return AV_CODEC_ID_NONE;
3149         }
3150     } else {
3151         bps  += 7;
3152         bps >>= 3;
3153         if (sflags & (1 << (bps - 1))) {
3154             switch (bps) {
3155             case 1:
3156                 return AV_CODEC_ID_PCM_S8;
3157             case 2:
3158                 return be ? AV_CODEC_ID_PCM_S16BE : AV_CODEC_ID_PCM_S16LE;
3159             case 3:
3160                 return be ? AV_CODEC_ID_PCM_S24BE : AV_CODEC_ID_PCM_S24LE;
3161             case 4:
3162                 return be ? AV_CODEC_ID_PCM_S32BE : AV_CODEC_ID_PCM_S32LE;
3163             case 8:
3164                 return be ? AV_CODEC_ID_PCM_S64BE : AV_CODEC_ID_PCM_S64LE;
3165             default:
3166                 return AV_CODEC_ID_NONE;
3167             }
3168         } else {
3169             switch (bps) {
3170             case 1:
3171                 return AV_CODEC_ID_PCM_U8;
3172             case 2:
3173                 return be ? AV_CODEC_ID_PCM_U16BE : AV_CODEC_ID_PCM_U16LE;
3174             case 3:
3175                 return be ? AV_CODEC_ID_PCM_U24BE : AV_CODEC_ID_PCM_U24LE;
3176             case 4:
3177                 return be ? AV_CODEC_ID_PCM_U32BE : AV_CODEC_ID_PCM_U32LE;
3178             default:
3179                 return AV_CODEC_ID_NONE;
3180             }
3181         }
3182     }
3183 }
3184
3185 unsigned int av_codec_get_tag(const AVCodecTag *const *tags, enum AVCodecID id)
3186 {
3187     unsigned int tag;
3188     if (!av_codec_get_tag2(tags, id, &tag))
3189         return 0;
3190     return tag;
3191 }
3192
3193 int av_codec_get_tag2(const AVCodecTag * const *tags, enum AVCodecID id,
3194                       unsigned int *tag)
3195 {
3196     int i;
3197     for (i = 0; tags && tags[i]; i++) {
3198         const AVCodecTag *codec_tags = tags[i];
3199         while (codec_tags->id != AV_CODEC_ID_NONE) {
3200             if (codec_tags->id == id) {
3201                 *tag = codec_tags->tag;
3202                 return 1;
3203             }
3204             codec_tags++;
3205         }
3206     }
3207     return 0;
3208 }
3209
3210 enum AVCodecID av_codec_get_id(const AVCodecTag *const *tags, unsigned int tag)
3211 {
3212     int i;
3213     for (i = 0; tags && tags[i]; i++) {
3214         enum AVCodecID id = ff_codec_get_id(tags[i], tag);
3215         if (id != AV_CODEC_ID_NONE)
3216             return id;
3217     }
3218     return AV_CODEC_ID_NONE;
3219 }
3220
3221 static void compute_chapters_end(AVFormatContext *s)
3222 {
3223     unsigned int i, j;
3224     int64_t max_time = 0;
3225
3226     if (s->duration > 0 && s->start_time < INT64_MAX - s->duration)
3227         max_time = s->duration +
3228                        ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
3229
3230     for (i = 0; i < s->nb_chapters; i++)
3231         if (s->chapters[i]->end == AV_NOPTS_VALUE) {
3232             AVChapter *ch = s->chapters[i];
3233             int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q,
3234                                                   ch->time_base)
3235                                    : INT64_MAX;
3236
3237             for (j = 0; j < s->nb_chapters; j++) {
3238                 AVChapter *ch1     = s->chapters[j];
3239                 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base,
3240                                                   ch->time_base);
3241                 if (j != i && next_start > ch->start && next_start < end)
3242                     end = next_start;
3243             }
3244             ch->end = (end == INT64_MAX || end < ch->start) ? ch->start : end;
3245         }
3246 }
3247
3248 static int get_std_framerate(int i)
3249 {
3250     if (i < 30*12)
3251         return (i + 1) * 1001;
3252     i -= 30*12;
3253
3254     if (i < 30)
3255         return (i + 31) * 1001 * 12;
3256     i -= 30;
3257
3258     if (i < 3)
3259         return ((const int[]) { 80, 120, 240})[i] * 1001 * 12;
3260
3261     i -= 3;
3262
3263     return ((const int[]) { 24, 30, 60, 12, 15, 48 })[i] * 1000 * 12;
3264 }
3265
3266 /* Is the time base unreliable?
3267  * This is a heuristic to balance between quick acceptance of the values in
3268  * the headers vs. some extra checks.
3269  * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
3270  * MPEG-2 commonly misuses field repeat flags to store different framerates.
3271  * And there are "variable" fps files this needs to detect as well. */
3272 static int tb_unreliable(AVCodecContext *c)
3273 {
3274     if (c->time_base.den >= 101LL * c->time_base.num ||
3275         c->time_base.den <    5LL * c->time_base.num ||
3276         // c->codec_tag == AV_RL32("DIVX") ||
3277         // c->codec_tag == AV_RL32("XVID") ||
3278         c->codec_tag == AV_RL32("mp4v") ||
3279         c->codec_id == AV_CODEC_ID_MPEG2VIDEO ||
3280         c->codec_id == AV_CODEC_ID_GIF ||
3281         c->codec_id == AV_CODEC_ID_HEVC ||
3282         c->codec_id == AV_CODEC_ID_H264)
3283         return 1;
3284     return 0;
3285 }
3286
3287 int ff_alloc_extradata(AVCodecParameters *par, int size)
3288 {
3289     av_freep(&par->extradata);
3290     par->extradata_size = 0;
3291
3292     if (size < 0 || size >= INT32_MAX - AV_INPUT_BUFFER_PADDING_SIZE)
3293         return AVERROR(EINVAL);
3294
3295     par->extradata = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
3296     if (!par->extradata)
3297         return AVERROR(ENOMEM);
3298
3299     memset(par->extradata + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
3300     par->extradata_size = size;
3301
3302     return 0;
3303 }
3304
3305 int ff_get_extradata(AVFormatContext *s, AVCodecParameters *par, AVIOContext *pb, int size)
3306 {
3307     int ret = ff_alloc_extradata(par, size);
3308     if (ret < 0)
3309         return ret;
3310     ret = avio_read(pb, par->extradata, size);
3311     if (ret != size) {
3312         av_freep(&par->extradata);
3313         par->extradata_size = 0;
3314         av_log(s, AV_LOG_ERROR, "Failed to read extradata of size %d\n", size);
3315         return ret < 0 ? ret : AVERROR_INVALIDDATA;
3316     }
3317
3318     return ret;
3319 }
3320
3321 int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
3322 {
3323     int i, j;
3324     int64_t last = st->info->last_dts;
3325
3326     if (   ts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && ts > last
3327        && ts - (uint64_t)last < INT64_MAX) {
3328         double dts = (is_relative(ts) ?  ts - RELATIVE_TS_BASE : ts) * av_q2d(st->time_base);
3329         int64_t duration = ts - last;
3330
3331         if (!st->info->duration_error)
3332             st->info->duration_error = av_mallocz(sizeof(st->info->duration_error[0])*2);
3333         if (!st->info->duration_error)
3334             return AVERROR(ENOMEM);
3335
3336 //         if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
3337 //             av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
3338         for (i = 0; i<MAX_STD_TIMEBASES; i++) {
3339             if (st->info->duration_error[0][1][i] < 1e10) {
3340                 int framerate = get_std_framerate(i);
3341                 double sdts = dts*framerate/(1001*12);
3342                 for (j= 0; j<2; j++) {
3343                     int64_t ticks = llrint(sdts+j*0.5);
3344                     double error= sdts - ticks + j*0.5;
3345                     st->info->duration_error[j][0][i] += error;
3346                     st->info->duration_error[j][1][i] += error*error;
3347                 }
3348             }
3349         }
3350         st->info->duration_count++;
3351         st->info->rfps_duration_sum += duration;
3352
3353         if (st->info->duration_count % 10 == 0) {
3354             int n = st->info->duration_count;
3355             for (i = 0; i<MAX_STD_TIMEBASES; i++) {
3356                 if (st->info->duration_error[0][1][i] < 1e10) {
3357                     double a0     = st->info->duration_error[0][0][i] / n;
3358                     double error0 = st->info->duration_error[0][1][i] / n - a0*a0;
3359                     double a1     = st->info->duration_error[1][0][i] / n;
3360                     double error1 = st->info->duration_error[1][1][i] / n - a1*a1;
3361                     if (error0 > 0.04 && error1 > 0.04) {
3362                         st->info->duration_error[0][1][i] = 2e10;
3363                         st->info->duration_error[1][1][i] = 2e10;
3364                     }
3365                 }
3366             }
3367         }
3368
3369         // ignore the first 4 values, they might have some random jitter
3370         if (st->info->duration_count > 3 && is_relative(ts) == is_relative(last))
3371             st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
3372     }
3373     if (ts != AV_NOPTS_VALUE)
3374         st->info->last_dts = ts;
3375
3376     return 0;
3377 }
3378
3379 void ff_rfps_calculate(AVFormatContext *ic)
3380 {
3381     int i, j;
3382
3383     for (i = 0; i < ic->nb_streams; i++) {
3384         AVStream *st = ic->streams[i];
3385
3386         if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
3387             continue;
3388         // the check for tb_unreliable() is not completely correct, since this is not about handling
3389         // an unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
3390         // ipmovie.c produces.
3391         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)
3392             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);
3393         if (st->info->duration_count>1 && !st->r_frame_rate.num
3394             && tb_unreliable(st->internal->avctx)) {
3395             int num = 0;
3396             double best_error= 0.01;
3397             AVRational ref_rate = st->r_frame_rate.num ? st->r_frame_rate : av_inv_q(st->time_base);
3398
3399             for (j= 0; j<MAX_STD_TIMEBASES; j++) {
3400                 int k;
3401
3402                 if (st->info->codec_info_duration &&
3403                     st->info->codec_info_duration*av_q2d(st->time_base) < (1001*11.5)/get_std_framerate(j))
3404                     continue;
3405                 if (!st->info->codec_info_duration && get_std_framerate(j) < 1001*12)
3406                     continue;
3407
3408                 if (av_q2d(st->time_base) * st->info->rfps_duration_sum / st->info->duration_count < (1001*12.0 * 0.8)/get_std_framerate(j))
3409                     continue;
3410
3411                 for (k= 0; k<2; k++) {
3412                     int n = st->info->duration_count;
3413                     double a= st->info->duration_error[k][0][j] / n;
3414                     double error= st->info->duration_error[k][1][j]/n - a*a;
3415
3416                     if (error < best_error && best_error> 0.000000001) {
3417                         best_error= error;
3418                         num = get_std_framerate(j);
3419                     }
3420                     if (error < 0.02)
3421                         av_log(ic, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
3422                 }
3423             }
3424             // do not increase frame rate by more than 1 % in order to match a standard rate.
3425             if (num && (!ref_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(ref_rate)))
3426                 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
3427         }
3428         if (   !st->avg_frame_rate.num
3429             && st->r_frame_rate.num && st->info->rfps_duration_sum
3430             && st->info->codec_info_duration <= 0
3431             && st->info->duration_count > 2
3432             && 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
3433             ) {
3434             av_log(ic, AV_LOG_DEBUG, "Setting avg frame rate based on r frame rate\n");
3435             st->avg_frame_rate = st->r_frame_rate;
3436         }
3437
3438         av_freep(&st->info->duration_error);
3439         st->info->last_dts = AV_NOPTS_VALUE;
3440         st->info->duration_count = 0;
3441         st->info->rfps_duration_sum = 0;
3442     }
3443 }
3444
3445 static int extract_extradata_check(AVStream *st)
3446 {
3447     const AVBitStreamFilter *f;
3448
3449     f = av_bsf_get_by_name("extract_extradata");
3450     if (!f)
3451         return 0;
3452
3453     if (f->codec_ids) {
3454         const enum AVCodecID *ids;
3455         for (ids = f->codec_ids; *ids != AV_CODEC_ID_NONE; ids++)
3456             if (*ids == st->codecpar->codec_id)
3457                 return 1;
3458     }
3459
3460     return 0;
3461 }
3462
3463 static int extract_extradata_init(AVStream *st)
3464 {
3465     AVStreamInternal *sti = st->internal;
3466     const AVBitStreamFilter *f;
3467     int ret;
3468
3469     f = av_bsf_get_by_name("extract_extradata");
3470     if (!f)
3471         goto finish;
3472
3473     /* check that the codec id is supported */
3474     ret = extract_extradata_check(st);
3475     if (!ret)
3476         goto finish;
3477
3478     sti->extract_extradata.pkt = av_packet_alloc();
3479     if (!sti->extract_extradata.pkt)
3480         return AVERROR(ENOMEM);
3481
3482     ret = av_bsf_alloc(f, &sti->extract_extradata.bsf);
3483     if (ret < 0)
3484         goto fail;
3485
3486     ret = avcodec_parameters_copy(sti->extract_extradata.bsf->par_in,
3487                                   st->codecpar);
3488     if (ret < 0)
3489         goto fail;
3490
3491     sti->extract_extradata.bsf->time_base_in = st->time_base;
3492
3493     ret = av_bsf_init(sti->extract_extradata.bsf);
3494     if (ret < 0)
3495         goto fail;
3496
3497 finish:
3498     sti->extract_extradata.inited = 1;
3499
3500     return 0;
3501 fail:
3502     av_bsf_free(&sti->extract_extradata.bsf);
3503     av_packet_free(&sti->extract_extradata.pkt);
3504     return ret;
3505 }
3506
3507 static int extract_extradata(AVStream *st, AVPacket *pkt)
3508 {
3509     AVStreamInternal *sti = st->internal;
3510     AVPacket *pkt_ref;
3511     int ret;
3512
3513     if (!sti->extract_extradata.inited) {
3514         ret = extract_extradata_init(st);
3515         if (ret < 0)
3516             return ret;
3517     }
3518
3519     if (sti->extract_extradata.inited && !sti->extract_extradata.bsf)
3520         return 0;
3521
3522     pkt_ref = sti->extract_extradata.pkt;
3523     ret = av_packet_ref(pkt_ref, pkt);
3524     if (ret < 0)
3525         return ret;
3526
3527     ret = av_bsf_send_packet(sti->extract_extradata.bsf, pkt_ref);
3528     if (ret < 0) {
3529         av_packet_unref(pkt_ref);
3530         return ret;
3531     }
3532
3533     while (ret >= 0 && !sti->avctx->extradata) {
3534         int extradata_size;
3535         uint8_t *extradata;
3536
3537         ret = av_bsf_receive_packet(sti->extract_extradata.bsf, pkt_ref);
3538         if (ret < 0) {
3539             if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
3540                 return ret;
3541             continue;
3542         }
3543
3544         extradata = av_packet_get_side_data(pkt_ref, AV_PKT_DATA_NEW_EXTRADATA,
3545                                             &extradata_size);
3546
3547         if (extradata) {
3548             av_assert0(!sti->avctx->extradata);
3549             if ((unsigned)extradata_size < FF_MAX_EXTRADATA_SIZE)
3550                 sti->avctx->extradata = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
3551             if (!sti->avctx->extradata) {
3552                 av_packet_unref(pkt_ref);
3553                 return AVERROR(ENOMEM);
3554             }
3555             memcpy(sti->avctx->extradata, extradata, extradata_size);
3556             sti->avctx->extradata_size = extradata_size;
3557         }
3558         av_packet_unref(pkt_ref);
3559     }
3560
3561     return 0;
3562 }
3563
3564 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
3565 {
3566     int i, count = 0, ret = 0, j;
3567     int64_t read_size;
3568     AVStream *st;
3569     AVCodecContext *avctx;
3570     AVPacket pkt1, *pkt;
3571     int64_t old_offset  = avio_tell(ic->pb);
3572     // new streams might appear, no options for those
3573     int orig_nb_streams = ic->nb_streams;
3574     int flush_codecs;
3575     int64_t max_analyze_duration = ic->max_analyze_duration;
3576     int64_t max_stream_analyze_duration;
3577     int64_t max_subtitle_analyze_duration;
3578     int64_t probesize = ic->probesize;
3579     int eof_reached = 0;
3580     int *missing_streams = av_opt_ptr(ic->iformat->priv_class, ic->priv_data, "missing_streams");
3581
3582     flush_codecs = probesize > 0;
3583
3584     av_opt_set(ic, "skip_clear", "1", AV_OPT_SEARCH_CHILDREN);
3585
3586     max_stream_analyze_duration = max_analyze_duration;
3587     max_subtitle_analyze_duration = max_analyze_duration;
3588     if (!max_analyze_duration) {
3589         max_stream_analyze_duration =
3590         max_analyze_duration        = 5*AV_TIME_BASE;
3591         max_subtitle_analyze_duration = 30*AV_TIME_BASE;
3592         if (!strcmp(ic->iformat->name, "flv"))
3593             max_stream_analyze_duration = 90*AV_TIME_BASE;
3594         if (!strcmp(ic->iformat->name, "mpeg") || !strcmp(ic->iformat->name, "mpegts"))
3595             max_stream_analyze_duration = 7*AV_TIME_BASE;
3596     }
3597
3598     if (ic->pb)
3599         av_log(ic, AV_LOG_DEBUG, "Before avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d nb_streams:%d\n",
3600                avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, ic->nb_streams);
3601
3602     for (i = 0; i < ic->nb_streams; i++) {
3603         const AVCodec *codec;
3604         AVDictionary *thread_opt = NULL;
3605         st = ic->streams[i];
3606         avctx = st->internal->avctx;
3607
3608         if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
3609             st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3610 /*            if (!st->time_base.num)
3611                 st->time_base = */
3612             if (!avctx->time_base.num)
3613                 avctx->time_base = st->time_base;
3614         }
3615
3616         /* check if the caller has overridden the codec id */
3617 #if FF_API_LAVF_AVCTX
3618 FF_DISABLE_DEPRECATION_WARNINGS
3619         if (st->codec->codec_id != st->internal->orig_codec_id) {
3620             st->codecpar->codec_id   = st->codec->codec_id;
3621             st->codecpar->codec_type = st->codec->codec_type;
3622             st->internal->orig_codec_id = st->codec->codec_id;
3623         }
3624 FF_ENABLE_DEPRECATION_WARNINGS
3625 #endif
3626         // only for the split stuff
3627         if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE) && st->request_probe <= 0) {
3628             st->parser = av_parser_init(st->codecpar->codec_id);
3629             if (st->parser) {
3630                 if (st->need_parsing == AVSTREAM_PARSE_HEADERS) {
3631                     st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
3632                 } else if (st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
3633                     st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
3634                 }
3635             } else if (st->need_parsing) {
3636                 av_log(ic, AV_LOG_VERBOSE, "parser not found for codec "
3637                        "%s, packets or times may be invalid.\n",
3638                        avcodec_get_name(st->codecpar->codec_id));
3639             }
3640         }
3641
3642         if (st->codecpar->codec_id != st->internal->orig_codec_id)
3643             st->internal->orig_codec_id = st->codecpar->codec_id;
3644
3645         ret = avcodec_parameters_to_context(avctx, st->codecpar);
3646         if (ret < 0)
3647             goto find_stream_info_err;
3648         if (st->request_probe <= 0)
3649             st->internal->avctx_inited = 1;
3650
3651         codec = find_probe_decoder(ic, st, st->codecpar->codec_id);
3652
3653         /* Force thread count to 1 since the H.264 decoder will not extract
3654          * SPS and PPS to extradata during multi-threaded decoding. */
3655         av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
3656
3657         if (ic->codec_whitelist)
3658             av_dict_set(options ? &options[i] : &thread_opt, "codec_whitelist", ic->codec_whitelist, 0);
3659
3660         /* Ensure that subtitle_header is properly set. */
3661         if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE
3662             && codec && !avctx->codec) {
3663             if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0)
3664                 av_log(ic, AV_LOG_WARNING,
3665                        "Failed to open codec in %s\n",__FUNCTION__);
3666         }
3667
3668         // Try to just open decoders, in case this is enough to get parameters.
3669         if (!has_codec_parameters(st, NULL) && st->request_probe <= 0) {
3670             if (codec && !avctx->codec)
3671                 if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0)
3672                     av_log(ic, AV_LOG_WARNING,
3673                            "Failed to open codec in %s\n",__FUNCTION__);
3674         }
3675         if (!options)
3676             av_dict_free(&thread_opt);
3677     }
3678
3679     for (i = 0; i < ic->nb_streams; i++) {
3680 #if FF_API_R_FRAME_RATE
3681         ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
3682 #endif
3683         ic->streams[i]->info->fps_first_dts = AV_NOPTS_VALUE;
3684         ic->streams[i]->info->fps_last_dts  = AV_NOPTS_VALUE;
3685     }
3686
3687     read_size = 0;
3688     for (;;) {
3689         int analyzed_all_streams;
3690         if (ff_check_interrupt(&ic->interrupt_callback)) {
3691             ret = AVERROR_EXIT;
3692             av_log(ic, AV_LOG_DEBUG, "interrupted\n");
3693             break;
3694         }
3695
3696         /* check if one codec still needs to be handled */
3697         for (i = 0; i < ic->nb_streams; i++) {
3698             int fps_analyze_framecount = 20;
3699             int count;
3700
3701             st = ic->streams[i];
3702             if (!has_codec_parameters(st, NULL))
3703                 break;
3704             /* If the timebase is coarse (like the usual millisecond precision
3705              * of mkv), we need to analyze more frames to reliably arrive at
3706              * the correct fps. */
3707             if (av_q2d(st->time_base) > 0.0005)
3708                 fps_analyze_framecount *= 2;
3709             if (!tb_unreliable(st->internal->avctx))
3710                 fps_analyze_framecount = 0;
3711             if (ic->fps_probe_size >= 0)
3712                 fps_analyze_framecount = ic->fps_probe_size;
3713             if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
3714                 fps_analyze_framecount = 0;
3715             /* variable fps and no guess at the real fps */
3716             count = (ic->iformat->flags & AVFMT_NOTIMESTAMPS) ?
3717                        st->info->codec_info_duration_fields/2 :
3718                        st->info->duration_count;
3719             if (!(st->r_frame_rate.num && st->avg_frame_rate.num) &&
3720                 st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
3721                 if (count < fps_analyze_framecount)
3722                     break;
3723             }
3724             // Look at the first 3 frames if there is evidence of frame delay
3725             // but the decoder delay is not set.
3726             if (st->info->frame_delay_evidence && count < 2 && st->internal->avctx->has_b_frames == 0)
3727                 break;
3728             if (!st->internal->avctx->extradata &&
3729                 (!st->internal->extract_extradata.inited ||
3730                  st->internal->extract_extradata.bsf) &&
3731                 extract_extradata_check(st))
3732                 break;
3733             if (st->first_dts == AV_NOPTS_VALUE &&
3734                 !(ic->iformat->flags & AVFMT_NOTIMESTAMPS) &&
3735                 st->codec_info_nb_frames < ((st->disposition & AV_DISPOSITION_ATTACHED_PIC) ? 1 : ic->max_ts_probe) &&
3736                 (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
3737                  st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))
3738                 break;
3739         }
3740         analyzed_all_streams = 0;
3741         if (!missing_streams || !*missing_streams)
3742         if (i == ic->nb_streams) {
3743             analyzed_all_streams = 1;
3744             /* NOTE: If the format has no header, then we need to read some
3745              * packets to get most of the streams, so we cannot stop here. */
3746             if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
3747                 /* If we found the info for all the codecs, we can stop. */
3748                 ret = count;
3749                 av_log(ic, AV_LOG_DEBUG, "All info found\n");
3750                 flush_codecs = 0;
3751                 break;
3752             }
3753         }
3754         /* We did not get all the codec info, but we read too much data. */
3755         if (read_size >= probesize) {
3756             ret = count;
3757             av_log(ic, AV_LOG_DEBUG,
3758                    "Probe buffer size limit of %"PRId64" bytes reached\n", probesize);
3759             for (i = 0; i < ic->nb_streams; i++)
3760                 if (!ic->streams[i]->r_frame_rate.num &&
3761                     ic->streams[i]->info->duration_count <= 1 &&
3762                     ic->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
3763                     strcmp(ic->iformat->name, "image2"))
3764                     av_log(ic, AV_LOG_WARNING,
3765                            "Stream #%d: not enough frames to estimate rate; "
3766                            "consider increasing probesize\n", i);
3767             break;
3768         }
3769
3770         /* NOTE: A new stream can be added there if no header in file
3771          * (AVFMTCTX_NOHEADER). */
3772         ret = read_frame_internal(ic, &pkt1);
3773         if (ret == AVERROR(EAGAIN))
3774             continue;
3775
3776         if (ret < 0) {
3777             /* EOF or error*/
3778             eof_reached = 1;
3779             break;
3780         }
3781
3782         pkt = &pkt1;
3783
3784         if (!(ic->flags & AVFMT_FLAG_NOBUFFER)) {
3785             ret = ff_packet_list_put(&ic->internal->packet_buffer,
3786                                      &ic->internal->packet_buffer_end,
3787                                      pkt, 0);
3788             if (ret < 0)
3789                 goto find_stream_info_err;
3790         }
3791
3792         st = ic->streams[pkt->stream_index];
3793         if (!(st->disposition & AV_DISPOSITION_ATTACHED_PIC))
3794             read_size += pkt->size;
3795
3796         avctx = st->internal->avctx;
3797         if (!st->internal->avctx_inited) {
3798             ret = avcodec_parameters_to_context(avctx, st->codecpar);
3799             if (ret < 0)
3800                 goto find_stream_info_err;
3801             st->internal->avctx_inited = 1;
3802         }
3803
3804         if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
3805             /* check for non-increasing dts */
3806             if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3807                 st->info->fps_last_dts >= pkt->dts) {
3808                 av_log(ic, AV_LOG_DEBUG,
3809                        "Non-increasing DTS in stream %d: packet %d with DTS "
3810                        "%"PRId64", packet %d with DTS %"PRId64"\n",
3811                        st->index, st->info->fps_last_dts_idx,
3812                        st->info->fps_last_dts, st->codec_info_nb_frames,
3813                        pkt->dts);
3814                 st->info->fps_first_dts =
3815                 st->info->fps_last_dts  = AV_NOPTS_VALUE;
3816             }
3817             /* Check for a discontinuity in dts. If the difference in dts
3818              * is more than 1000 times the average packet duration in the
3819              * sequence, we treat it as a discontinuity. */
3820             if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
3821                 st->info->fps_last_dts_idx > st->info->fps_first_dts_idx &&
3822                 (pkt->dts - (uint64_t)st->info->fps_last_dts) / 1000 >
3823                 (st->info->fps_last_dts     - (uint64_t)st->info->fps_first_dts) /
3824                 (st->info->fps_last_dts_idx - st->info->fps_first_dts_idx)) {
3825                 av_log(ic, AV_LOG_WARNING,
3826                        "DTS discontinuity in stream %d: packet %d with DTS "
3827                        "%"PRId64", packet %d with DTS %"PRId64"\n",
3828                        st->index, st->info->fps_last_dts_idx,
3829                        st->info->fps_last_dts, st->codec_info_nb_frames,
3830                        pkt->dts);
3831                 st->info->fps_first_dts =
3832                 st->info->fps_last_dts  = AV_NOPTS_VALUE;
3833             }
3834
3835             /* update stored dts values */
3836             if (st->info->fps_first_dts == AV_NOPTS_VALUE) {
3837                 st->info->fps_first_dts     = pkt->dts;
3838                 st->info->fps_first_dts_idx = st->codec_info_nb_frames;
3839             }
3840             st->info->fps_last_dts     = pkt->dts;
3841             st->info->fps_last_dts_idx = st->codec_info_nb_frames;
3842         }
3843         if (st->codec_info_nb_frames>1) {
3844             int64_t t = 0;
3845             int64_t limit;
3846
3847             if (st->time_base.den > 0)
3848                 t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
3849             if (st->avg_frame_rate.num > 0)
3850                 t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, av_inv_q(st->avg_frame_rate), AV_TIME_BASE_Q));
3851
3852             if (   t == 0
3853                 && st->codec_info_nb_frames>30
3854                 && st->info->fps_first_dts != AV_NOPTS_VALUE
3855                 && st->info->fps_last_dts  != AV_NOPTS_VALUE)
3856                 t = FFMAX(t, av_rescale_q(st->info->fps_last_dts - st->info->fps_first_dts, st->time_base, AV_TIME_BASE_Q));
3857
3858             if (analyzed_all_streams)                                limit = max_analyze_duration;
3859             else if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) limit = max_subtitle_analyze_duration;
3860             else                                                     limit = max_stream_analyze_duration;
3861
3862             if (t >= limit) {
3863                 av_log(ic, AV_LOG_VERBOSE, "max_analyze_duration %"PRId64" reached at %"PRId64" microseconds st:%d\n",
3864                        limit,
3865                        t, pkt->stream_index);
3866                 if (ic->flags & AVFMT_FLAG_NOBUFFER)
3867                     av_packet_unref(pkt);
3868                 break;
3869             }
3870             if (pkt->duration) {
3871                 if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE && pkt->pts != AV_NOPTS_VALUE && st->start_time != AV_NOPTS_VALUE && pkt->pts >= st->start_time) {
3872                     st->info->codec_info_duration = FFMIN(pkt->pts - st->start_time, st->info->codec_info_duration + pkt->duration);
3873                 } else
3874                     st->info->codec_info_duration += pkt->duration;
3875                 st->info->codec_info_duration_fields += st->parser && st->need_parsing && avctx->ticks_per_frame ==2 ? st->parser->repeat_pict + 1 : 2;
3876             }
3877         }
3878         if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
3879 #if FF_API_R_FRAME_RATE
3880             ff_rfps_add_frame(ic, st, pkt->dts);
3881 #endif
3882             if (pkt->dts != pkt->pts && pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE)
3883                 st->info->frame_delay_evidence = 1;
3884         }
3885         if (!st->internal->avctx->extradata) {
3886             ret = extract_extradata(st, pkt);
3887             if (ret < 0)
3888                 goto find_stream_info_err;
3889         }
3890
3891         /* If still no information, we try to open the codec and to
3892          * decompress the frame. We try to avoid that in most cases as
3893          * it takes longer and uses more memory. For MPEG-4, we need to
3894          * decompress for QuickTime.
3895          *
3896          * If AV_CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
3897          * least one frame of codec data, this makes sure the codec initializes
3898          * the channel configuration and does not only trust the values from
3899          * the container. */
3900         try_decode_frame(ic, st, pkt,
3901                          (options && i < orig_nb_streams) ? &options[i] : NULL);
3902
3903         if (ic->flags & AVFMT_FLAG_NOBUFFER)
3904             av_packet_unref(pkt);
3905
3906         st->codec_info_nb_frames++;
3907         count++;
3908     }
3909
3910     if (eof_reached) {
3911         int stream_index;
3912         for (stream_index = 0; stream_index < ic->nb_streams; stream_index++) {
3913             st = ic->streams[stream_index];
3914             avctx = st->internal->avctx;
3915             if (!has_codec_parameters(st, NULL)) {
3916                 const AVCodec *codec = find_probe_decoder(ic, st, st->codecpar->codec_id);
3917                 if (codec && !avctx->codec) {
3918                     AVDictionary *opts = NULL;
3919                     if (ic->codec_whitelist)
3920                         av_dict_set(&opts, "codec_whitelist", ic->codec_whitelist, 0);
3921                     if (avcodec_open2(avctx, codec, (options && stream_index < orig_nb_streams) ? &options[stream_index] : &opts) < 0)
3922                         av_log(ic, AV_LOG_WARNING,
3923                                "Failed to open codec in %s\n",__FUNCTION__);
3924                     av_dict_free(&opts);
3925                 }
3926             }
3927
3928             // EOF already reached while reading the stream above.
3929             // So continue with reoordering DTS with whatever delay we have.
3930             if (ic->internal->packet_buffer && !has_decode_delay_been_guessed(st)) {
3931                 update_dts_from_pts(ic, stream_index, ic->internal->packet_buffer);
3932             }
3933         }
3934     }
3935
3936     if (flush_codecs) {
3937         AVPacket empty_pkt = { 0 };
3938         int err = 0;
3939         av_init_packet(&empty_pkt);
3940
3941         for (i = 0; i < ic->nb_streams; i++) {
3942
3943             st = ic->streams[i];
3944
3945             /* flush the decoders */
3946             if (st->info->found_decoder == 1) {
3947                 do {
3948                     err = try_decode_frame(ic, st, &empty_pkt,
3949                                             (options && i < orig_nb_streams)
3950                                             ? &options[i] : NULL);
3951                 } while (err > 0 && !has_codec_parameters(st, NULL));
3952
3953                 if (err < 0) {
3954                     av_log(ic, AV_LOG_INFO,
3955                         "decoding for stream %d failed\n", st->index);
3956                 }
3957             }
3958         }
3959     }
3960
3961     ff_rfps_calculate(ic);
3962
3963     for (i = 0; i < ic->nb_streams; i++) {
3964         st = ic->streams[i];
3965         avctx = st->internal->avctx;
3966         if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
3967             if (avctx->codec_id == AV_CODEC_ID_RAWVIDEO && !avctx->codec_tag && !avctx->bits_per_coded_sample) {
3968                 uint32_t tag= avcodec_pix_fmt_to_codec_tag(avctx->pix_fmt);
3969                 if (avpriv_find_pix_fmt(avpriv_get_raw_pix_fmt_tags(), tag) == avctx->pix_fmt)
3970                     avctx->codec_tag= tag;
3971             }
3972
3973             /* estimate average framerate if not set by demuxer */
3974             if (st->info->codec_info_duration_fields &&
3975                 !st->avg_frame_rate.num &&
3976                 st->info->codec_info_duration) {
3977                 int best_fps      = 0;
3978                 double best_error = 0.01;
3979                 AVRational codec_frame_rate = avctx->framerate;
3980
3981                 if (st->info->codec_info_duration        >= INT64_MAX / st->time_base.num / 2||
3982                     st->info->codec_info_duration_fields >= INT64_MAX / st->time_base.den ||
3983                     st->info->codec_info_duration        < 0)
3984                     continue;
3985                 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
3986                           st->info->codec_info_duration_fields * (int64_t) st->time_base.den,
3987                           st->info->codec_info_duration * 2 * (int64_t) st->time_base.num, 60000);
3988
3989                 /* Round guessed framerate to a "standard" framerate if it's
3990                  * within 1% of the original estimate. */
3991                 for (j = 0; j < MAX_STD_TIMEBASES; j++) {
3992                     AVRational std_fps = { get_std_framerate(j), 12 * 1001 };
3993                     double error       = fabs(av_q2d(st->avg_frame_rate) /
3994                                               av_q2d(std_fps) - 1);
3995
3996                     if (error < best_error) {
3997                         best_error = error;
3998                         best_fps   = std_fps.num;
3999                     }
4000
4001                     if (ic->internal->prefer_codec_framerate && codec_frame_rate.num > 0 && codec_frame_rate.den > 0) {
4002                         error       = fabs(av_q2d(codec_frame_rate) /
4003                                            av_q2d(std_fps) - 1);
4004                         if (error < best_error) {
4005                             best_error = error;
4006                             best_fps   = std_fps.num;
4007                         }
4008                     }
4009                 }
4010                 if (best_fps)
4011                     av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
4012                               best_fps, 12 * 1001, INT_MAX);
4013             }
4014
4015             if (!st->r_frame_rate.num) {
4016                 if (    avctx->time_base.den * (int64_t) st->time_base.num
4017                     <= avctx->time_base.num * avctx->ticks_per_frame * (int64_t) st->time_base.den) {
4018                     av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den,
4019                               avctx->time_base.den, (int64_t)avctx->time_base.num * avctx->ticks_per_frame, INT_MAX);
4020                 } else {
4021                     st->r_frame_rate.num = st->time_base.den;
4022                     st->r_frame_rate.den = st->time_base.num;
4023                 }
4024             }
4025             if (st->display_aspect_ratio.num && st->display_aspect_ratio.den) {
4026                 AVRational hw_ratio = { avctx->height, avctx->width };
4027                 st->sample_aspect_ratio = av_mul_q(st->display_aspect_ratio,
4028                                                    hw_ratio);
4029             }
4030         } else if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
4031             if (!avctx->bits_per_coded_sample)
4032                 avctx->bits_per_coded_sample =
4033                     av_get_bits_per_sample(avctx->codec_id);
4034             // set stream disposition based on audio service type
4035             switch (avctx->audio_service_type) {
4036             case AV_AUDIO_SERVICE_TYPE_EFFECTS:
4037                 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS;
4038                 break;
4039             case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
4040                 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED;
4041                 break;
4042             case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
4043                 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED;
4044                 break;
4045             case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
4046                 st->disposition = AV_DISPOSITION_COMMENT;
4047                 break;
4048             case AV_AUDIO_SERVICE_TYPE_KARAOKE:
4049                 st->disposition = AV_DISPOSITION_KARAOKE;
4050                 break;
4051             }
4052         }
4053     }
4054
4055     if (probesize)
4056         estimate_timings(ic, old_offset);
4057
4058     av_opt_set(ic, "skip_clear", "0", AV_OPT_SEARCH_CHILDREN);
4059
4060     if (ret >= 0 && ic->nb_streams)
4061         /* We could not have all the codec parameters before EOF. */
4062         ret = -1;
4063     for (i = 0; i < ic->nb_streams; i++) {
4064         const char *errmsg;
4065         st = ic->streams[i];
4066
4067         /* if no packet was ever seen, update context now for has_codec_parameters */
4068         if (!st->internal->avctx_inited) {
4069             if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
4070                 st->codecpar->format == AV_SAMPLE_FMT_NONE)
4071                 st->codecpar->format = st->internal->avctx->sample_fmt;
4072             ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
4073             if (ret < 0)
4074                 goto find_stream_info_err;
4075         }
4076         if (!has_codec_parameters(st, &errmsg)) {
4077             char buf[256];
4078             avcodec_string(buf, sizeof(buf), st->internal->avctx, 0);
4079             av_log(ic, AV_LOG_WARNING,
4080                    "Could not find codec parameters for stream %d (%s): %s\n"
4081                    "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
4082                    i, buf, errmsg);
4083         } else {
4084             ret = 0;
4085         }
4086     }
4087
4088     compute_chapters_end(ic);
4089
4090     /* update the stream parameters from the internal codec contexts */
4091     for (i = 0; i < ic->nb_streams; i++) {
4092         st = ic->streams[i];
4093
4094         if (st->internal->avctx_inited) {
4095             int orig_w = st->codecpar->width;
4096             int orig_h = st->codecpar->height;
4097             ret = avcodec_parameters_from_context(st->codecpar, st->internal->avctx);
4098             if (ret < 0)
4099                 goto find_stream_info_err;
4100 #if FF_API_LOWRES
4101             // The decoder might reduce the video size by the lowres factor.
4102             if (st->internal->avctx->lowres && orig_w) {
4103                 st->codecpar->width = orig_w;
4104                 st->codecpar->height = orig_h;
4105             }
4106 #endif
4107         }
4108
4109 #if FF_API_LAVF_AVCTX
4110 FF_DISABLE_DEPRECATION_WARNINGS
4111         ret = avcodec_parameters_to_context(st->codec, st->codecpar);
4112         if (ret < 0)
4113             goto find_stream_info_err;
4114
4115 #if FF_API_LOWRES
4116         // The old API (AVStream.codec) "requires" the resolution to be adjusted
4117         // by the lowres factor.
4118         if (st->internal->avctx->lowres && st->internal->avctx->width) {
4119             st->codec->lowres = st->internal->avctx->lowres;
4120             st->codec->width = st->internal->avctx->width;
4121             st->codec->height = st->internal->avctx->height;
4122         }
4123 #endif
4124
4125         if (st->codec->codec_tag != MKTAG('t','m','c','d')) {
4126             st->codec->time_base = st->internal->avctx->time_base;
4127             st->codec->ticks_per_frame = st->internal->avctx->ticks_per_frame;
4128         }
4129         st->codec->framerate = st->avg_frame_rate;
4130
4131         if (st->internal->avctx->subtitle_header) {
4132             st->codec->subtitle_header = av_malloc(st->internal->avctx->subtitle_header_size);
4133             if (!st->codec->subtitle_header)
4134                 goto find_stream_info_err;
4135             st->codec->subtitle_header_size = st->internal->avctx->subtitle_header_size;
4136             memcpy(st->codec->subtitle_header, st->internal->avctx->subtitle_header,
4137                    st->codec->subtitle_header_size);
4138         }
4139
4140         // Fields unavailable in AVCodecParameters
4141         st->codec->coded_width = st->internal->avctx->coded_width;
4142         st->codec->coded_height = st->internal->avctx->coded_height;
4143         st->codec->properties = st->internal->avctx->properties;
4144 FF_ENABLE_DEPRECATION_WARNINGS
4145 #endif
4146
4147         st->internal->avctx_inited = 0;
4148     }
4149
4150 find_stream_info_err:
4151     for (i = 0; i < ic->nb_streams; i++) {
4152         st = ic->streams[i];
4153         if (st->info)
4154             av_freep(&st->info->duration_error);
4155         avcodec_close(ic->streams[i]->internal->avctx);
4156         av_freep(&ic->streams[i]->info);
4157         av_bsf_free(&ic->streams[i]->internal->extract_extradata.bsf);
4158         av_packet_free(&ic->streams[i]->internal->extract_extradata.pkt);
4159     }
4160     if (ic->pb)
4161         av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d frames:%d\n",
4162                avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, count);
4163     return ret;
4164 }
4165
4166 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
4167 {
4168     int i, j;
4169
4170     for (i = 0; i < ic->nb_programs; i++) {
4171         if (ic->programs[i] == last) {
4172             last = NULL;
4173         } else {
4174             if (!last)
4175                 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
4176                     if (ic->programs[i]->stream_index[j] == s)
4177                         return ic->programs[i];
4178         }
4179     }
4180     return NULL;
4181 }
4182
4183 int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type,
4184                         int wanted_stream_nb, int related_stream,
4185                         AVCodec **decoder_ret, int flags)
4186 {
4187     int i, nb_streams = ic->nb_streams;
4188     int ret = AVERROR_STREAM_NOT_FOUND;
4189     int best_count = -1, best_multiframe = -1, best_disposition = -1;
4190     int count, multiframe, disposition;
4191     int64_t best_bitrate = -1;
4192     int64_t bitrate;
4193     unsigned *program = NULL;
4194     const AVCodec *decoder = NULL, *best_decoder = NULL;
4195
4196     if (related_stream >= 0 && wanted_stream_nb < 0) {
4197         AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
4198         if (p) {
4199             program    = p->stream_index;
4200             nb_streams = p->nb_stream_indexes;
4201         }
4202     }
4203     for (i = 0; i < nb_streams; i++) {
4204         int real_stream_index = program ? program[i] : i;
4205         AVStream *st          = ic->streams[real_stream_index];
4206         AVCodecParameters *par = st->codecpar;
4207         if (par->codec_type != type)
4208             continue;
4209         if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
4210             continue;
4211         if (type == AVMEDIA_TYPE_AUDIO && !(par->channels && par->sample_rate))
4212             continue;
4213         if (decoder_ret) {
4214             decoder = find_decoder(ic, st, par->codec_id);
4215             if (!decoder) {
4216                 if (ret < 0)
4217                     ret = AVERROR_DECODER_NOT_FOUND;
4218                 continue;
4219             }
4220         }
4221         disposition = !(st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED | AV_DISPOSITION_VISUAL_IMPAIRED))
4222                       + !! (st->disposition & AV_DISPOSITION_DEFAULT);
4223         count = st->codec_info_nb_frames;
4224         bitrate = par->bit_rate;
4225         multiframe = FFMIN(5, count);
4226         if ((best_disposition >  disposition) ||
4227             (best_disposition == disposition && best_multiframe >  multiframe) ||
4228             (best_disposition == disposition && best_multiframe == multiframe && best_bitrate >  bitrate) ||
4229             (best_disposition == disposition && best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
4230             continue;
4231         best_disposition = disposition;
4232         best_count   = count;
4233         best_bitrate = bitrate;
4234         best_multiframe = multiframe;
4235         ret          = real_stream_index;
4236         best_decoder = decoder;
4237         if (program && i == nb_streams - 1 && ret < 0) {
4238             program    = NULL;
4239             nb_streams = ic->nb_streams;
4240             /* no related stream found, try again with everything */
4241             i = 0;
4242         }
4243     }
4244     if (decoder_ret)
4245         *decoder_ret = (AVCodec*)best_decoder;
4246     return ret;
4247 }
4248
4249 /*******************************************************/
4250
4251 int av_read_play(AVFormatContext *s)
4252 {
4253     if (s->iformat->read_play)
4254         return s->iformat->read_play(s);
4255     if (s->pb)
4256         return avio_pause(s->pb, 0);
4257     return AVERROR(ENOSYS);
4258 }
4259
4260 int av_read_pause(AVFormatContext *s)
4261 {
4262     if (s->iformat->read_pause)
4263         return s->iformat->read_pause(s);
4264     if (s->pb)
4265         return avio_pause(s->pb, 1);
4266     return AVERROR(ENOSYS);
4267 }
4268
4269 int ff_stream_encode_params_copy(AVStream *dst, const AVStream *src)
4270 {
4271     int ret, i;
4272
4273     dst->id                  = src->id;
4274     dst->time_base           = src->time_base;
4275     dst->nb_frames           = src->nb_frames;
4276     dst->disposition         = src->disposition;
4277     dst->sample_aspect_ratio = src->sample_aspect_ratio;
4278     dst->avg_frame_rate      = src->avg_frame_rate;
4279     dst->r_frame_rate        = src->r_frame_rate;
4280
4281     av_dict_free(&dst->metadata);
4282     ret = av_dict_copy(&dst->metadata, src->metadata, 0);
4283     if (ret < 0)
4284         return ret;
4285
4286     ret = avcodec_parameters_copy(dst->codecpar, src->codecpar);
4287     if (ret < 0)
4288         return ret;
4289
4290     /* Free existing side data*/
4291     for (i = 0; i < dst->nb_side_data; i++)
4292         av_free(dst->side_data[i].data);
4293     av_freep(&dst->side_data);
4294     dst->nb_side_data = 0;
4295
4296     /* Copy side data if present */
4297     if (src->nb_side_data) {
4298         dst->side_data = av_mallocz_array(src->nb_side_data,
4299                                           sizeof(AVPacketSideData));
4300         if (!dst->side_data)
4301             return AVERROR(ENOMEM);
4302         dst->nb_side_data = src->nb_side_data;
4303
4304         for (i = 0; i < src->nb_side_data; i++) {
4305             uint8_t *data = av_memdup(src->side_data[i].data,
4306                                       src->side_data[i].size);
4307             if (!data)
4308                 return AVERROR(ENOMEM);
4309             dst->side_data[i].type = src->side_data[i].type;
4310             dst->side_data[i].size = src->side_data[i].size;
4311             dst->side_data[i].data = data;
4312         }
4313     }
4314
4315 #if FF_API_LAVF_FFSERVER
4316 FF_DISABLE_DEPRECATION_WARNINGS
4317     av_freep(&dst->recommended_encoder_configuration);
4318     if (src->recommended_encoder_configuration) {
4319         const char *conf_str = src->recommended_encoder_configuration;
4320         dst->recommended_encoder_configuration = av_strdup(conf_str);
4321         if (!dst->recommended_encoder_configuration)
4322             return AVERROR(ENOMEM);
4323     }
4324 FF_ENABLE_DEPRECATION_WARNINGS
4325 #endif
4326
4327     return 0;
4328 }
4329
4330 static void free_stream(AVStream **pst)
4331 {
4332     AVStream *st = *pst;
4333     int i;
4334
4335     if (!st)
4336         return;
4337
4338     for (i = 0; i < st->nb_side_data; i++)
4339         av_freep(&st->side_data[i].data);
4340     av_freep(&st->side_data);
4341
4342     if (st->parser)
4343         av_parser_close(st->parser);
4344
4345     if (st->attached_pic.data)
4346         av_packet_unref(&st->attached_pic);
4347
4348     if (st->internal) {
4349         avcodec_free_context(&st->internal->avctx);
4350         for (i = 0; i < st->internal->nb_bsfcs; i++) {
4351             av_bsf_free(&st->internal->bsfcs[i]);
4352             av_freep(&st->internal->bsfcs);
4353         }
4354         av_freep(&st->internal->priv_pts);
4355         av_bsf_free(&st->internal->extract_extradata.bsf);
4356         av_packet_free(&st->internal->extract_extradata.pkt);
4357     }
4358     av_freep(&st->internal);
4359
4360     av_dict_free(&st->metadata);
4361     avcodec_parameters_free(&st->codecpar);
4362     av_freep(&st->probe_data.buf);
4363     av_freep(&st->index_entries);
4364 #if FF_API_LAVF_AVCTX
4365 FF_DISABLE_DEPRECATION_WARNINGS
4366     avcodec_free_context(&st->codec);
4367 FF_ENABLE_DEPRECATION_WARNINGS
4368 #endif
4369     av_freep(&st->priv_data);
4370     if (st->info)
4371         av_freep(&st->info->duration_error);
4372     av_freep(&st->info);
4373 #if FF_API_LAVF_FFSERVER
4374 FF_DISABLE_DEPRECATION_WARNINGS
4375     av_freep(&st->recommended_encoder_configuration);
4376 FF_ENABLE_DEPRECATION_WARNINGS
4377 #endif
4378
4379     av_freep(pst);
4380 }
4381
4382 void ff_free_stream(AVFormatContext *s, AVStream *st)
4383 {
4384     av_assert0(s->nb_streams>0);
4385     av_assert0(s->streams[ s->nb_streams - 1 ] == st);
4386
4387     free_stream(&s->streams[ --s->nb_streams ]);
4388 }
4389
4390 void avformat_free_context(AVFormatContext *s)
4391 {
4392     int i;
4393
4394     if (!s)
4395         return;
4396
4397     av_opt_free(s);
4398     if (s->iformat && s->iformat->priv_class && s->priv_data)
4399         av_opt_free(s->priv_data);
4400     if (s->oformat && s->oformat->priv_class && s->priv_data)
4401         av_opt_free(s->priv_data);
4402
4403     for (i = s->nb_streams - 1; i >= 0; i--)
4404         ff_free_stream(s, s->streams[i]);
4405
4406
4407     for (i = s->nb_programs - 1; i >= 0; i--) {
4408         av_dict_free(&s->programs[i]->metadata);
4409         av_freep(&s->programs[i]->stream_index);
4410         av_freep(&s->programs[i]);
4411     }
4412     av_freep(&s->programs);
4413     av_freep(&s->priv_data);
4414     while (s->nb_chapters--) {
4415         av_dict_free(&s->chapters[s->nb_chapters]->metadata);
4416         av_freep(&s->chapters[s->nb_chapters]);
4417     }
4418     av_freep(&s->chapters);
4419     av_dict_free(&s->metadata);
4420     av_dict_free(&s->internal->id3v2_meta);
4421     av_freep(&s->streams);
4422     flush_packet_queue(s);
4423     av_freep(&s->internal);
4424     av_freep(&s->url);
4425     av_free(s);
4426 }
4427
4428 void avformat_close_input(AVFormatContext **ps)
4429 {
4430     AVFormatContext *s;
4431     AVIOContext *pb;
4432
4433     if (!ps || !*ps)
4434         return;
4435
4436     s  = *ps;
4437     pb = s->pb;
4438
4439     if ((s->iformat && strcmp(s->iformat->name, "image2") && s->iformat->flags & AVFMT_NOFILE) ||
4440         (s->flags & AVFMT_FLAG_CUSTOM_IO))
4441         pb = NULL;
4442
4443     flush_packet_queue(s);
4444
4445     if (s->iformat)
4446         if (s->iformat->read_close)
4447             s->iformat->read_close(s);
4448
4449     avformat_free_context(s);
4450
4451     *ps = NULL;
4452
4453     avio_close(pb);
4454 }
4455
4456 AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c)
4457 {
4458     AVStream *st;
4459     int i;
4460     AVStream **streams;
4461
4462     if (s->nb_streams >= FFMIN(s->max_streams, INT_MAX/sizeof(*streams))) {
4463         if (s->max_streams < INT_MAX/sizeof(*streams))
4464             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);
4465         return NULL;
4466     }
4467     streams = av_realloc_array(s->streams, s->nb_streams + 1, sizeof(*streams));
4468     if (!streams)
4469         return NULL;
4470     s->streams = streams;
4471
4472     st = av_mallocz(sizeof(AVStream));
4473     if (!st)
4474         return NULL;
4475     if (!(st->info = av_mallocz(sizeof(*st->info)))) {
4476         av_free(st);
4477         return NULL;
4478     }
4479     st->info->last_dts = AV_NOPTS_VALUE;
4480
4481 #if FF_API_LAVF_AVCTX
4482 FF_DISABLE_DEPRECATION_WARNINGS
4483     st->codec = avcodec_alloc_context3(c);
4484     if (!st->codec) {
4485         av_free(st->info);
4486         av_free(st);
4487         return NULL;
4488     }
4489 FF_ENABLE_DEPRECATION_WARNINGS
4490 #endif
4491
4492     st->internal = av_mallocz(sizeof(*st->internal));
4493     if (!st->internal)
4494         goto fail;
4495
4496     st->codecpar = avcodec_parameters_alloc();
4497     if (!st->codecpar)
4498         goto fail;
4499
4500     st->internal->avctx = avcodec_alloc_context3(NULL);
4501     if (!st->internal->avctx)
4502         goto fail;
4503
4504     if (s->iformat) {
4505 #if FF_API_LAVF_AVCTX
4506 FF_DISABLE_DEPRECATION_WARNINGS
4507         /* no default bitrate if decoding */
4508         st->codec->bit_rate = 0;
4509 FF_ENABLE_DEPRECATION_WARNINGS
4510 #endif
4511
4512         /* default pts setting is MPEG-like */
4513         avpriv_set_pts_info(st, 33, 1, 90000);
4514         /* we set the current DTS to 0 so that formats without any timestamps
4515          * but durations get some timestamps, formats with some unknown
4516          * timestamps have their first few packets buffered and the
4517          * timestamps corrected before they are returned to the user */
4518         st->cur_dts = RELATIVE_TS_BASE;
4519     } else {
4520         st->cur_dts = AV_NOPTS_VALUE;
4521     }
4522
4523     st->index      = s->nb_streams;
4524     st->start_time = AV_NOPTS_VALUE;
4525     st->duration   = AV_NOPTS_VALUE;
4526     st->first_dts     = AV_NOPTS_VALUE;
4527     st->probe_packets = MAX_PROBE_PACKETS;
4528     st->pts_wrap_reference = AV_NOPTS_VALUE;
4529     st->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
4530
4531     st->last_IP_pts = AV_NOPTS_VALUE;
4532     st->last_dts_for_order_check = AV_NOPTS_VALUE;
4533     for (i = 0; i < MAX_REORDER_DELAY + 1; i++)
4534         st->pts_buffer[i] = AV_NOPTS_VALUE;
4535
4536     st->sample_aspect_ratio = (AVRational) { 0, 1 };
4537
4538 #if FF_API_R_FRAME_RATE
4539     st->info->last_dts      = AV_NOPTS_VALUE;
4540 #endif
4541     st->info->fps_first_dts = AV_NOPTS_VALUE;
4542     st->info->fps_last_dts  = AV_NOPTS_VALUE;
4543
4544     st->inject_global_side_data = s->internal->inject_global_side_data;
4545
4546     st->internal->need_context_update = 1;
4547
4548     s->streams[s->nb_streams++] = st;
4549     return st;
4550 fail:
4551     free_stream(&st);
4552     return NULL;
4553 }
4554
4555 AVProgram *av_new_program(AVFormatContext *ac, int id)
4556 {
4557     AVProgram *program = NULL;
4558     int i;
4559
4560     av_log(ac, AV_LOG_TRACE, "new_program: id=0x%04x\n", id);
4561
4562     for (i = 0; i < ac->nb_programs; i++)
4563         if (ac->programs[i]->id == id)
4564             program = ac->programs[i];
4565
4566     if (!program) {
4567         program = av_mallocz(sizeof(AVProgram));
4568         if (!program)
4569             return NULL;
4570         dynarray_add(&ac->programs, &ac->nb_programs, program);
4571         program->discard = AVDISCARD_NONE;
4572         program->pmt_version = -1;
4573     }
4574     program->id = id;
4575     program->pts_wrap_reference = AV_NOPTS_VALUE;
4576     program->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
4577
4578     program->start_time =
4579     program->end_time   = AV_NOPTS_VALUE;
4580
4581     return program;
4582 }
4583
4584 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base,
4585                               int64_t start, int64_t end, const char *title)
4586 {
4587     AVChapter *chapter = NULL;
4588     int i;
4589
4590     if (end != AV_NOPTS_VALUE && start > end) {
4591         av_log(s, AV_LOG_ERROR, "Chapter end time %"PRId64" before start %"PRId64"\n", end, start);
4592         return NULL;
4593     }
4594
4595     for (i = 0; i < s->nb_chapters; i++)
4596         if (s->chapters[i]->id == id)
4597             chapter = s->chapters[i];
4598
4599     if (!chapter) {
4600         chapter = av_mallocz(sizeof(AVChapter));
4601         if (!chapter)
4602             return NULL;
4603         dynarray_add(&s->chapters, &s->nb_chapters, chapter);
4604     }
4605     av_dict_set(&chapter->metadata, "title", title, 0);
4606     chapter->id        = id;
4607     chapter->time_base = time_base;
4608     chapter->start     = start;
4609     chapter->end       = end;
4610
4611     return chapter;
4612 }
4613
4614 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
4615 {
4616     int i, j;
4617     AVProgram *program = NULL;
4618     void *tmp;
4619
4620     if (idx >= ac->nb_streams) {
4621         av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
4622         return;
4623     }
4624
4625     for (i = 0; i < ac->nb_programs; i++) {
4626         if (ac->programs[i]->id != progid)
4627             continue;
4628         program = ac->programs[i];
4629         for (j = 0; j < program->nb_stream_indexes; j++)
4630             if (program->stream_index[j] == idx)
4631                 return;
4632
4633         tmp = av_realloc_array(program->stream_index, program->nb_stream_indexes+1, sizeof(unsigned int));
4634         if (!tmp)
4635             return;
4636         program->stream_index = tmp;
4637         program->stream_index[program->nb_stream_indexes++] = idx;
4638         return;
4639     }
4640 }
4641
4642 uint64_t ff_ntp_time(void)
4643 {
4644     return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
4645 }
4646
4647 uint64_t ff_get_formatted_ntp_time(uint64_t ntp_time_us)
4648 {
4649     uint64_t ntp_ts, frac_part, sec;
4650     uint32_t usec;
4651
4652     //current ntp time in seconds and micro seconds
4653     sec = ntp_time_us / 1000000;
4654     usec = ntp_time_us % 1000000;
4655
4656     //encoding in ntp timestamp format
4657     frac_part = usec * 0xFFFFFFFFULL;
4658     frac_part /= 1000000;
4659
4660     if (sec > 0xFFFFFFFFULL)
4661         av_log(NULL, AV_LOG_WARNING, "NTP time format roll over detected\n");
4662
4663     ntp_ts = sec << 32;
4664     ntp_ts |= frac_part;
4665
4666     return ntp_ts;
4667 }
4668
4669 int av_get_frame_filename2(char *buf, int buf_size, const char *path, int number, int flags)
4670 {
4671     const char *p;
4672     char *q, buf1[20], c;
4673     int nd, len, percentd_found;
4674
4675     q = buf;
4676     p = path;
4677     percentd_found = 0;
4678     for (;;) {
4679         c = *p++;
4680         if (c == '\0')
4681             break;
4682         if (c == '%') {
4683             do {
4684                 nd = 0;
4685                 while (av_isdigit(*p))
4686                     nd = nd * 10 + *p++ - '0';
4687                 c = *p++;
4688             } while (av_isdigit(c));
4689
4690             switch (c) {
4691             case '%':
4692                 goto addchar;
4693             case 'd':
4694                 if (!(flags & AV_FRAME_FILENAME_FLAGS_MULTIPLE) && percentd_found)
4695                     goto fail;
4696                 percentd_found = 1;
4697                 if (number < 0)
4698                     nd += 1;
4699                 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
4700                 len = strlen(buf1);
4701                 if ((q - buf + len) > buf_size - 1)
4702                     goto fail;
4703                 memcpy(q, buf1, len);
4704                 q += len;
4705                 break;
4706             default:
4707                 goto fail;
4708             }
4709         } else {
4710 addchar:
4711             if ((q - buf) < buf_size - 1)
4712                 *q++ = c;
4713         }
4714     }
4715     if (!percentd_found)
4716         goto fail;
4717     *q = '\0';
4718     return 0;
4719 fail:
4720     *q = '\0';
4721     return -1;
4722 }
4723
4724 int av_get_frame_filename(char *buf, int buf_size, const char *path, int number)
4725 {
4726     return av_get_frame_filename2(buf, buf_size, path, number, 0);
4727 }
4728
4729 void av_url_split(char *proto, int proto_size,
4730                   char *authorization, int authorization_size,
4731                   char *hostname, int hostname_size,
4732                   int *port_ptr, char *path, int path_size, const char *url)
4733 {
4734     const char *p, *ls, *ls2, *at, *at2, *col, *brk;
4735
4736     if (port_ptr)
4737         *port_ptr = -1;
4738     if (proto_size > 0)
4739         proto[0] = 0;
4740     if (authorization_size > 0)
4741         authorization[0] = 0;
4742     if (hostname_size > 0)
4743         hostname[0] = 0;
4744     if (path_size > 0)
4745         path[0] = 0;
4746
4747     /* parse protocol */
4748     if ((p = strchr(url, ':'))) {
4749         av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
4750         p++; /* skip ':' */
4751         if (*p == '/')
4752             p++;
4753         if (*p == '/')
4754             p++;
4755     } else {
4756         /* no protocol means plain filename */
4757         av_strlcpy(path, url, path_size);
4758         return;
4759     }
4760
4761     /* separate path from hostname */
4762     ls = strchr(p, '/');
4763     ls2 = strchr(p, '?');
4764     if (!ls)
4765         ls = ls2;
4766     else if (ls && ls2)
4767         ls = FFMIN(ls, ls2);
4768     if (ls)
4769         av_strlcpy(path, ls, path_size);
4770     else
4771         ls = &p[strlen(p)];  // XXX
4772
4773     /* the rest is hostname, use that to parse auth/port */
4774     if (ls != p) {
4775         /* authorization (user[:pass]@hostname) */
4776         at2 = p;
4777         while ((at = strchr(p, '@')) && at < ls) {
4778             av_strlcpy(authorization, at2,
4779                        FFMIN(authorization_size, at + 1 - at2));
4780             p = at + 1; /* skip '@' */
4781         }
4782
4783         if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
4784             /* [host]:port */
4785             av_strlcpy(hostname, p + 1,
4786                        FFMIN(hostname_size, brk - p));
4787             if (brk[1] == ':' && port_ptr)
4788                 *port_ptr = atoi(brk + 2);
4789         } else if ((col = strchr(p, ':')) && col < ls) {
4790             av_strlcpy(hostname, p,
4791                        FFMIN(col + 1 - p, hostname_size));
4792             if (port_ptr)
4793                 *port_ptr = atoi(col + 1);
4794         } else
4795             av_strlcpy(hostname, p,
4796                        FFMIN(ls + 1 - p, hostname_size));
4797     }
4798 }
4799
4800 int ff_mkdir_p(const char *path)
4801 {
4802     int ret = 0;
4803     char *temp = av_strdup(path);
4804     char *pos = temp;
4805     char tmp_ch = '\0';
4806
4807     if (!path || !temp) {
4808         return -1;
4809     }
4810
4811     if (!av_strncasecmp(temp, "/", 1) || !av_strncasecmp(temp, "\\", 1)) {
4812         pos++;
4813     } else if (!av_strncasecmp(temp, "./", 2) || !av_strncasecmp(temp, ".\\", 2)) {
4814         pos += 2;
4815     }
4816
4817     for ( ; *pos != '\0'; ++pos) {
4818         if (*pos == '/' || *pos == '\\') {
4819             tmp_ch = *pos;
4820             *pos = '\0';
4821             ret = mkdir(temp, 0755);
4822             *pos = tmp_ch;
4823         }
4824     }
4825
4826     if ((*(pos - 1) != '/') || (*(pos - 1) != '\\')) {
4827         ret = mkdir(temp, 0755);
4828     }
4829
4830     av_free(temp);
4831     return ret;
4832 }
4833
4834 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
4835 {
4836     int i;
4837     static const char hex_table_uc[16] = { '0', '1', '2', '3',
4838                                            '4', '5', '6', '7',
4839                                            '8', '9', 'A', 'B',
4840                                            'C', 'D', 'E', 'F' };
4841     static const char hex_table_lc[16] = { '0', '1', '2', '3',
4842                                            '4', '5', '6', '7',
4843                                            '8', '9', 'a', 'b',
4844                                            'c', 'd', 'e', 'f' };
4845     const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
4846
4847     for (i = 0; i < s; i++) {
4848         buff[i * 2]     = hex_table[src[i] >> 4];
4849         buff[i * 2 + 1] = hex_table[src[i] & 0xF];
4850     }
4851
4852     return buff;
4853 }
4854
4855 int ff_hex_to_data(uint8_t *data, const char *p)
4856 {
4857     int c, len, v;
4858
4859     len = 0;
4860     v   = 1;
4861     for (;;) {
4862         p += strspn(p, SPACE_CHARS);
4863         if (*p == '\0')
4864             break;
4865         c = av_toupper((unsigned char) *p++);
4866         if (c >= '0' && c <= '9')
4867             c = c - '0';
4868         else if (c >= 'A' && c <= 'F')
4869             c = c - 'A' + 10;
4870         else
4871             break;
4872         v = (v << 4) | c;
4873         if (v & 0x100) {
4874             if (data)
4875                 data[len] = v;
4876             len++;
4877             v = 1;
4878         }
4879     }
4880     return len;
4881 }
4882
4883 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
4884                          unsigned int pts_num, unsigned int pts_den)
4885 {
4886     AVRational new_tb;
4887     if (av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)) {
4888         if (new_tb.num != pts_num)
4889             av_log(NULL, AV_LOG_DEBUG,
4890                    "st:%d removing common factor %d from timebase\n",
4891                    s->index, pts_num / new_tb.num);
4892     } else
4893         av_log(NULL, AV_LOG_WARNING,
4894                "st:%d has too large timebase, reducing\n", s->index);
4895
4896     if (new_tb.num <= 0 || new_tb.den <= 0) {
4897         av_log(NULL, AV_LOG_ERROR,
4898                "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
4899                new_tb.num, new_tb.den,
4900                s->index);
4901         return;
4902     }
4903     s->time_base     = new_tb;
4904 #if FF_API_LAVF_AVCTX
4905 FF_DISABLE_DEPRECATION_WARNINGS
4906     s->codec->pkt_timebase = new_tb;
4907 FF_ENABLE_DEPRECATION_WARNINGS
4908 #endif
4909     s->internal->avctx->pkt_timebase = new_tb;
4910     s->pts_wrap_bits = pts_wrap_bits;
4911 }
4912
4913 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
4914                         void *context)
4915 {
4916     const char *ptr = str;
4917
4918     /* Parse key=value pairs. */
4919     for (;;) {
4920         const char *key;
4921         char *dest = NULL, *dest_end;
4922         int key_len, dest_len = 0;
4923
4924         /* Skip whitespace and potential commas. */
4925         while (*ptr && (av_isspace(*ptr) || *ptr == ','))
4926             ptr++;
4927         if (!*ptr)
4928             break;
4929
4930         key = ptr;
4931
4932         if (!(ptr = strchr(key, '=')))
4933             break;
4934         ptr++;
4935         key_len = ptr - key;
4936
4937         callback_get_buf(context, key, key_len, &dest, &dest_len);
4938         dest_end = dest + dest_len - 1;
4939
4940         if (*ptr == '\"') {
4941             ptr++;
4942             while (*ptr && *ptr != '\"') {
4943                 if (*ptr == '\\') {
4944                     if (!ptr[1])
4945                         break;
4946                     if (dest && dest < dest_end)
4947                         *dest++ = ptr[1];
4948                     ptr += 2;
4949                 } else {
4950                     if (dest && dest < dest_end)
4951                         *dest++ = *ptr;
4952                     ptr++;
4953                 }
4954             }
4955             if (*ptr == '\"')
4956                 ptr++;
4957         } else {
4958             for (; *ptr && !(av_isspace(*ptr) || *ptr == ','); ptr++)
4959                 if (dest && dest < dest_end)
4960                     *dest++ = *ptr;
4961         }
4962         if (dest)
4963             *dest = 0;
4964     }
4965 }
4966
4967 int ff_find_stream_index(AVFormatContext *s, int id)
4968 {
4969     int i;
4970     for (i = 0; i < s->nb_streams; i++)
4971         if (s->streams[i]->id == id)
4972             return i;
4973     return -1;
4974 }
4975
4976 int avformat_query_codec(const AVOutputFormat *ofmt, enum AVCodecID codec_id,
4977                          int std_compliance)
4978 {
4979     if (ofmt) {
4980         unsigned int codec_tag;
4981         if (ofmt->query_codec)
4982             return ofmt->query_codec(codec_id, std_compliance);
4983         else if (ofmt->codec_tag)
4984             return !!av_codec_get_tag2(ofmt->codec_tag, codec_id, &codec_tag);
4985         else if (codec_id == ofmt->video_codec ||
4986                  codec_id == ofmt->audio_codec ||
4987                  codec_id == ofmt->subtitle_codec ||
4988                  codec_id == ofmt->data_codec)
4989             return 1;
4990     }
4991     return AVERROR_PATCHWELCOME;
4992 }
4993
4994 int avformat_network_init(void)
4995 {
4996 #if CONFIG_NETWORK
4997     int ret;
4998     if ((ret = ff_network_init()) < 0)
4999         return ret;
5000     if ((ret = ff_tls_init()) < 0)
5001         return ret;
5002 #endif
5003     return 0;
5004 }
5005
5006 int avformat_network_deinit(void)
5007 {
5008 #if CONFIG_NETWORK
5009     ff_network_close();
5010     ff_tls_deinit();
5011 #endif
5012     return 0;
5013 }
5014
5015 int ff_add_param_change(AVPacket *pkt, int32_t channels,
5016                         uint64_t channel_layout, int32_t sample_rate,
5017                         int32_t width, int32_t height)
5018 {
5019     uint32_t flags = 0;
5020     int size = 4;
5021     uint8_t *data;
5022     if (!pkt)
5023         return AVERROR(EINVAL);
5024     if (channels) {
5025         size  += 4;
5026         flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
5027     }
5028     if (channel_layout) {
5029         size  += 8;
5030         flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
5031     }
5032     if (sample_rate) {
5033         size  += 4;
5034         flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
5035     }
5036     if (width || height) {
5037         size  += 8;
5038         flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
5039     }
5040     data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
5041     if (!data)
5042         return AVERROR(ENOMEM);
5043     bytestream_put_le32(&data, flags);
5044     if (channels)
5045         bytestream_put_le32(&data, channels);
5046     if (channel_layout)
5047         bytestream_put_le64(&data, channel_layout);
5048     if (sample_rate)
5049         bytestream_put_le32(&data, sample_rate);
5050     if (width || height) {
5051         bytestream_put_le32(&data, width);
5052         bytestream_put_le32(&data, height);
5053     }
5054     return 0;
5055 }
5056
5057 AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame)
5058 {
5059     AVRational undef = {0, 1};
5060     AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
5061     AVRational codec_sample_aspect_ratio  = stream && stream->codecpar ? stream->codecpar->sample_aspect_ratio : undef;
5062     AVRational frame_sample_aspect_ratio  = frame  ? frame->sample_aspect_ratio  : codec_sample_aspect_ratio;
5063
5064     av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
5065                stream_sample_aspect_ratio.num,  stream_sample_aspect_ratio.den, INT_MAX);
5066     if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
5067         stream_sample_aspect_ratio = undef;
5068
5069     av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
5070                frame_sample_aspect_ratio.num,  frame_sample_aspect_ratio.den, INT_MAX);
5071     if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
5072         frame_sample_aspect_ratio = undef;
5073
5074     if (stream_sample_aspect_ratio.num)
5075         return stream_sample_aspect_ratio;
5076     else
5077         return frame_sample_aspect_ratio;
5078 }
5079
5080 AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *frame)
5081 {
5082     AVRational fr = st->r_frame_rate;
5083     AVRational codec_fr = st->internal->avctx->framerate;
5084     AVRational   avg_fr = st->avg_frame_rate;
5085
5086     if (avg_fr.num > 0 && avg_fr.den > 0 && fr.num > 0 && fr.den > 0 &&
5087         av_q2d(avg_fr) < 70 && av_q2d(fr) > 210) {
5088         fr = avg_fr;
5089     }
5090
5091
5092     if (st->internal->avctx->ticks_per_frame > 1) {
5093         if (   codec_fr.num > 0 && codec_fr.den > 0 &&
5094             (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))
5095             fr = codec_fr;
5096     }
5097
5098     return fr;
5099 }
5100
5101 /**
5102  * Matches a stream specifier (but ignores requested index).
5103  *
5104  * @param indexptr set to point to the requested stream index if there is one
5105  *
5106  * @return <0 on error
5107  *         0  if st is NOT a matching stream
5108  *         >0 if st is a matching stream
5109  */
5110 static int match_stream_specifier(AVFormatContext *s, AVStream *st,
5111                                   const char *spec, const char **indexptr, AVProgram **p)
5112 {
5113     int match = 1;                      /* Stores if the specifier matches so far. */
5114     while (*spec) {
5115         if (*spec <= '9' && *spec >= '0') { /* opt:index */
5116             if (indexptr)
5117                 *indexptr = spec;
5118             return match;
5119         } else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
5120                    *spec == 't' || *spec == 'V') { /* opt:[vasdtV] */
5121             enum AVMediaType type;
5122             int nopic = 0;
5123
5124             switch (*spec++) {
5125             case 'v': type = AVMEDIA_TYPE_VIDEO;      break;
5126             case 'a': type = AVMEDIA_TYPE_AUDIO;      break;
5127             case 's': type = AVMEDIA_TYPE_SUBTITLE;   break;
5128             case 'd': type = AVMEDIA_TYPE_DATA;       break;
5129             case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
5130             case 'V': type = AVMEDIA_TYPE_VIDEO; nopic = 1; break;
5131             default:  av_assert0(0);
5132             }
5133             if (*spec && *spec++ != ':')         /* If we are not at the end, then another specifier must follow. */
5134                 return AVERROR(EINVAL);
5135
5136 #if FF_API_LAVF_AVCTX
5137 FF_DISABLE_DEPRECATION_WARNINGS
5138             if (type != st->codecpar->codec_type
5139                && (st->codecpar->codec_type != AVMEDIA_TYPE_UNKNOWN || st->codec->codec_type != type))
5140                 match = 0;
5141     FF_ENABLE_DEPRECATION_WARNINGS
5142 #else
5143             if (type != st->codecpar->codec_type)
5144                 match = 0;
5145 #endif
5146             if (nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC))
5147                 match = 0;
5148         } else if (*spec == 'p' && *(spec + 1) == ':') {
5149             int prog_id, i, j;
5150             int found = 0;
5151             char *endptr;
5152             spec += 2;
5153             prog_id = strtol(spec, &endptr, 0);
5154             /* Disallow empty id and make sure that if we are not at the end, then another specifier must follow. */
5155             if (spec == endptr || (*endptr && *endptr++ != ':'))
5156                 return AVERROR(EINVAL);
5157             spec = endptr;
5158             if (match) {
5159                 for (i = 0; i < s->nb_programs; i++) {
5160                     if (s->programs[i]->id != prog_id)
5161                         continue;
5162
5163                     for (j = 0; j < s->programs[i]->nb_stream_indexes; j++) {
5164                         if (st->index == s->programs[i]->stream_index[j]) {
5165                             found = 1;
5166                             if (p)
5167                                 *p = s->programs[i];
5168                             i = s->nb_programs;
5169                             break;
5170                         }
5171                     }
5172                 }
5173             }
5174             if (!found)
5175                 match = 0;
5176         } else if (*spec == '#' ||
5177                    (*spec == 'i' && *(spec + 1) == ':')) {
5178             int stream_id;
5179             char *endptr;
5180             spec += 1 + (*spec == 'i');
5181             stream_id = strtol(spec, &endptr, 0);
5182             if (spec == endptr || *endptr)                /* Disallow empty id and make sure we are at the end. */
5183                 return AVERROR(EINVAL);
5184             return match && (stream_id == st->id);
5185         } else if (*spec == 'm' && *(spec + 1) == ':') {
5186             AVDictionaryEntry *tag;
5187             char *key, *val;
5188             int ret;
5189
5190             if (match) {
5191                spec += 2;
5192                val = strchr(spec, ':');
5193
5194                key = val ? av_strndup(spec, val - spec) : av_strdup(spec);
5195                if (!key)
5196                    return AVERROR(ENOMEM);
5197
5198                tag = av_dict_get(st->metadata, key, NULL, 0);
5199                if (tag) {
5200                    if (!val || !strcmp(tag->value, val + 1))
5201                        ret = 1;
5202                    else
5203                        ret = 0;
5204                } else
5205                    ret = 0;
5206
5207                av_freep(&key);
5208             }
5209             return match && ret;
5210         } else if (*spec == 'u' && *(spec + 1) == '\0') {
5211             AVCodecParameters *par = st->codecpar;
5212 #if FF_API_LAVF_AVCTX
5213 FF_DISABLE_DEPRECATION_WARNINGS
5214             AVCodecContext *codec = st->codec;
5215 FF_ENABLE_DEPRECATION_WARNINGS
5216 #endif
5217             int val;
5218             switch (par->codec_type) {
5219             case AVMEDIA_TYPE_AUDIO:
5220                 val = par->sample_rate && par->channels;
5221 #if FF_API_LAVF_AVCTX
5222                 val = val || (codec->sample_rate && codec->channels);
5223 #endif
5224                 if (par->format == AV_SAMPLE_FMT_NONE
5225 #if FF_API_LAVF_AVCTX
5226                     && codec->sample_fmt == AV_SAMPLE_FMT_NONE
5227 #endif
5228                     )
5229                     return 0;
5230                 break;
5231             case AVMEDIA_TYPE_VIDEO:
5232                 val = par->width && par->height;
5233 #if FF_API_LAVF_AVCTX
5234                 val = val || (codec->width && codec->height);
5235 #endif
5236                 if (par->format == AV_PIX_FMT_NONE
5237 #if FF_API_LAVF_AVCTX
5238                     && codec->pix_fmt == AV_PIX_FMT_NONE
5239 #endif
5240                     )
5241                     return 0;
5242                 break;
5243             case AVMEDIA_TYPE_UNKNOWN:
5244                 val = 0;
5245                 break;
5246             default:
5247                 val = 1;
5248                 break;
5249             }
5250 #if FF_API_LAVF_AVCTX
5251             return match && ((par->codec_id != AV_CODEC_ID_NONE || codec->codec_id != AV_CODEC_ID_NONE) && val != 0);
5252 #else
5253             return match && (par->codec_id != AV_CODEC_ID_NONE && val != 0);
5254 #endif
5255         } else {
5256             return AVERROR(EINVAL);
5257         }
5258     }
5259
5260     return match;
5261 }
5262
5263
5264 int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
5265                                     const char *spec)
5266 {
5267     int ret, index;
5268     char *endptr;
5269     const char *indexptr = NULL;
5270     AVProgram *p = NULL;
5271     int nb_streams;
5272
5273     ret = match_stream_specifier(s, st, spec, &indexptr, &p);
5274     if (ret < 0)
5275         goto error;
5276
5277     if (!indexptr)
5278         return ret;
5279
5280     index = strtol(indexptr, &endptr, 0);
5281     if (*endptr) {                  /* We can't have anything after the requested index. */
5282         ret = AVERROR(EINVAL);
5283         goto error;
5284     }
5285
5286     /* This is not really needed but saves us a loop for simple stream index specifiers. */
5287     if (spec == indexptr)
5288         return (index == st->index);
5289
5290     /* If we requested a matching stream index, we have to ensure st is that. */
5291     nb_streams = p ? p->nb_stream_indexes : s->nb_streams;
5292     for (int i = 0; i < nb_streams && index >= 0; i++) {
5293         AVStream *candidate = p ? s->streams[p->stream_index[i]] : s->streams[i];
5294         ret = match_stream_specifier(s, candidate, spec, NULL, NULL);
5295         if (ret < 0)
5296             goto error;
5297         if (ret > 0 && index-- == 0 && st == candidate)
5298             return 1;
5299     }
5300     return 0;
5301
5302 error:
5303     if (ret == AVERROR(EINVAL))
5304         av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
5305     return ret;
5306 }
5307
5308 int ff_generate_avci_extradata(AVStream *st)
5309 {
5310     static const uint8_t avci100_1080p_extradata[] = {
5311         // SPS
5312         0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5313         0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
5314         0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
5315         0x18, 0x21, 0x02, 0x56, 0xb9, 0x3d, 0x7d, 0x7e,
5316         0x4f, 0xe3, 0x3f, 0x11, 0xf1, 0x9e, 0x08, 0xb8,
5317         0x8c, 0x54, 0x43, 0xc0, 0x78, 0x02, 0x27, 0xe2,
5318         0x70, 0x1e, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00,
5319         0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xca,
5320         0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5321         // PPS
5322         0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
5323         0xd0
5324     };
5325     static const uint8_t avci100_1080i_extradata[] = {
5326         // SPS
5327         0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5328         0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
5329         0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
5330         0x18, 0x21, 0x03, 0x3a, 0x46, 0x65, 0x6a, 0x65,
5331         0x24, 0xad, 0xe9, 0x12, 0x32, 0x14, 0x1a, 0x26,
5332         0x34, 0xad, 0xa4, 0x41, 0x82, 0x23, 0x01, 0x50,
5333         0x2b, 0x1a, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2e,
5334         0x11, 0x12, 0x08, 0xc6, 0x8c, 0x04, 0x41, 0x28,
5335         0x4c, 0x34, 0xf0, 0x1e, 0x01, 0x13, 0xf2, 0xe0,
5336         0x3c, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03,
5337         0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x20,
5338         // PPS
5339         0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
5340         0xd0
5341     };
5342     static const uint8_t avci50_1080p_extradata[] = {
5343         // SPS
5344         0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
5345         0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5346         0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5347         0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
5348         0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
5349         0x6e, 0x6c, 0xd3, 0x3c, 0x05, 0xa0, 0x22, 0x7e,
5350         0x5f, 0xfc, 0x00, 0x0c, 0x00, 0x13, 0x8c, 0x04,
5351         0x04, 0x05, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00,
5352         0x00, 0x03, 0x00, 0x32, 0x84, 0x00, 0x00, 0x00,
5353         // PPS
5354         0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5355         0x11
5356     };
5357     static const uint8_t avci50_1080i_extradata[] = {
5358         // SPS
5359         0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
5360         0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5361         0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5362         0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6e, 0x61,
5363         0x87, 0x3e, 0x73, 0x4d, 0x98, 0x0c, 0x03, 0x06,
5364         0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63,
5365         0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19,
5366         0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16,
5367         0x81, 0x13, 0xf7, 0xff, 0x80, 0x02, 0x00, 0x01,
5368         0xf1, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
5369         0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00,
5370         // PPS
5371         0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5372         0x11
5373     };
5374     static const uint8_t avci100_720p_extradata[] = {
5375         // SPS
5376         0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
5377         0xb6, 0xd4, 0x20, 0x2a, 0x33, 0x1d, 0xc7, 0x62,
5378         0xa1, 0x08, 0x40, 0x54, 0x66, 0x3b, 0x8e, 0xc5,
5379         0x42, 0x02, 0x10, 0x25, 0x64, 0x2c, 0x89, 0xe8,
5380         0x85, 0xe4, 0x21, 0x4b, 0x90, 0x83, 0x06, 0x95,
5381         0xd1, 0x06, 0x46, 0x97, 0x20, 0xc8, 0xd7, 0x43,
5382         0x08, 0x11, 0xc2, 0x1e, 0x4c, 0x91, 0x0f, 0x01,
5383         0x40, 0x16, 0xec, 0x07, 0x8c, 0x04, 0x04, 0x05,
5384         0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03,
5385         0x00, 0x64, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
5386         // PPS
5387         0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x31, 0x12,
5388         0x11
5389     };
5390     static const uint8_t avci50_720p_extradata[] = {
5391         // SPS
5392         0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x20,
5393         0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
5394         0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
5395         0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
5396         0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
5397         0x6e, 0x6c, 0xd3, 0x3c, 0x0f, 0x01, 0x6e, 0xff,
5398         0xc0, 0x00, 0xc0, 0x01, 0x38, 0xc0, 0x40, 0x40,
5399         0x50, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00,
5400         0x06, 0x48, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
5401         // PPS
5402         0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
5403         0x11
5404     };
5405
5406     const uint8_t *data = NULL;
5407     int size            = 0;
5408
5409     if (st->codecpar->width == 1920) {
5410         if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
5411             data = avci100_1080p_extradata;
5412             size = sizeof(avci100_1080p_extradata);
5413         } else {
5414             data = avci100_1080i_extradata;
5415             size = sizeof(avci100_1080i_extradata);
5416         }
5417     } else if (st->codecpar->width == 1440) {
5418         if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
5419             data = avci50_1080p_extradata;
5420             size = sizeof(avci50_1080p_extradata);
5421         } else {
5422             data = avci50_1080i_extradata;
5423             size = sizeof(avci50_1080i_extradata);
5424         }
5425     } else if (st->codecpar->width == 1280) {
5426         data = avci100_720p_extradata;
5427         size = sizeof(avci100_720p_extradata);
5428     } else if (st->codecpar->width == 960) {
5429         data = avci50_720p_extradata;
5430         size = sizeof(avci50_720p_extradata);
5431     }
5432
5433     if (!size)
5434         return 0;
5435
5436     av_freep(&st->codecpar->extradata);
5437     if (ff_alloc_extradata(st->codecpar, size))
5438         return AVERROR(ENOMEM);
5439     memcpy(st->codecpar->extradata, data, size);
5440
5441     return 0;
5442 }
5443
5444 uint8_t *av_stream_get_side_data(const AVStream *st,
5445                                  enum AVPacketSideDataType type, int *size)
5446 {
5447     int i;
5448
5449     for (i = 0; i < st->nb_side_data; i++) {
5450         if (st->side_data[i].type == type) {
5451             if (size)
5452                 *size = st->side_data[i].size;
5453             return st->side_data[i].data;
5454         }
5455     }
5456     return NULL;
5457 }
5458
5459 int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type,
5460                             uint8_t *data, size_t size)
5461 {
5462     AVPacketSideData *sd, *tmp;
5463     int i;
5464
5465     for (i = 0; i < st->nb_side_data; i++) {
5466         sd = &st->side_data[i];
5467
5468         if (sd->type == type) {
5469             av_freep(&sd->data);
5470             sd->data = data;
5471             sd->size = size;
5472             return 0;
5473         }
5474     }
5475
5476     if ((unsigned)st->nb_side_data + 1 >= INT_MAX / sizeof(*st->side_data))
5477         return AVERROR(ERANGE);
5478
5479     tmp = av_realloc(st->side_data, (st->nb_side_data + 1) * sizeof(*tmp));
5480     if (!tmp) {
5481         return AVERROR(ENOMEM);
5482     }
5483
5484     st->side_data = tmp;
5485     st->nb_side_data++;
5486
5487     sd = &st->side_data[st->nb_side_data - 1];
5488     sd->type = type;
5489     sd->data = data;
5490     sd->size = size;
5491
5492     return 0;
5493 }
5494
5495 uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type,
5496                                  int size)
5497 {
5498     int ret;
5499     uint8_t *data = av_malloc(size);
5500
5501     if (!data)
5502         return NULL;
5503
5504     ret = av_stream_add_side_data(st, type, data, size);
5505     if (ret < 0) {
5506         av_freep(&data);
5507         return NULL;
5508     }
5509
5510     return data;
5511 }
5512
5513 int ff_stream_add_bitstream_filter(AVStream *st, const char *name, const char *args)
5514 {
5515     int ret;
5516     const AVBitStreamFilter *bsf;
5517     AVBSFContext *bsfc;
5518     AVCodecParameters *in_par;
5519
5520     if (!(bsf = av_bsf_get_by_name(name))) {
5521         av_log(NULL, AV_LOG_ERROR, "Unknown bitstream filter '%s'\n", name);
5522         return AVERROR_BSF_NOT_FOUND;
5523     }
5524
5525     if ((ret = av_bsf_alloc(bsf, &bsfc)) < 0)
5526         return ret;
5527
5528     if (st->internal->nb_bsfcs) {
5529         in_par = st->internal->bsfcs[st->internal->nb_bsfcs - 1]->par_out;
5530         bsfc->time_base_in = st->internal->bsfcs[st->internal->nb_bsfcs - 1]->time_base_out;
5531     } else {
5532         in_par = st->codecpar;
5533         bsfc->time_base_in = st->time_base;
5534     }
5535
5536     if ((ret = avcodec_parameters_copy(bsfc->par_in, in_par)) < 0) {
5537         av_bsf_free(&bsfc);
5538         return ret;
5539     }
5540
5541     if (args && bsfc->filter->priv_class) {
5542         const AVOption *opt = av_opt_next(bsfc->priv_data, NULL);
5543         const char * shorthand[2] = {NULL};
5544
5545         if (opt)
5546             shorthand[0] = opt->name;
5547
5548         if ((ret = av_opt_set_from_string(bsfc->priv_data, args, shorthand, "=", ":")) < 0) {
5549             av_bsf_free(&bsfc);
5550             return ret;
5551         }
5552     }
5553
5554     if ((ret = av_bsf_init(bsfc)) < 0) {
5555         av_bsf_free(&bsfc);
5556         return ret;
5557     }
5558
5559     if ((ret = av_dynarray_add_nofree(&st->internal->bsfcs, &st->internal->nb_bsfcs, bsfc))) {
5560         av_bsf_free(&bsfc);
5561         return ret;
5562     }
5563
5564     av_log(NULL, AV_LOG_VERBOSE,
5565            "Automatically inserted bitstream filter '%s'; args='%s'\n",
5566            name, args ? args : "");
5567     return 1;
5568 }
5569
5570 #if FF_API_OLD_BSF
5571 FF_DISABLE_DEPRECATION_WARNINGS
5572 int av_apply_bitstream_filters(AVCodecContext *codec, AVPacket *pkt,
5573                                AVBitStreamFilterContext *bsfc)
5574 {
5575     int ret = 0;
5576     while (bsfc) {
5577         AVPacket new_pkt = *pkt;
5578         int a = av_bitstream_filter_filter(bsfc, codec, NULL,
5579                                            &new_pkt.data, &new_pkt.size,
5580                                            pkt->data, pkt->size,
5581                                            pkt->flags & AV_PKT_FLAG_KEY);
5582         if (a == 0 && new_pkt.size == 0 && new_pkt.side_data_elems == 0) {
5583             av_packet_unref(pkt);
5584             memset(pkt, 0, sizeof(*pkt));
5585             return 0;
5586         }
5587         if(a == 0 && new_pkt.data != pkt->data) {
5588             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
5589             if (t) {
5590                 memcpy(t, new_pkt.data, new_pkt.size);
5591                 memset(t + new_pkt.size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
5592                 new_pkt.data = t;
5593                 new_pkt.buf = NULL;
5594                 a = 1;
5595             } else {
5596                 a = AVERROR(ENOMEM);
5597             }
5598         }
5599         if (a > 0) {
5600             new_pkt.buf = av_buffer_create(new_pkt.data, new_pkt.size,
5601                                            av_buffer_default_free, NULL, 0);
5602             if (new_pkt.buf) {
5603                 pkt->side_data = NULL;
5604                 pkt->side_data_elems = 0;
5605                 av_packet_unref(pkt);
5606             } else {
5607                 av_freep(&new_pkt.data);
5608                 a = AVERROR(ENOMEM);
5609             }
5610         }
5611         if (a < 0) {
5612             av_log(codec, AV_LOG_ERROR,
5613                    "Failed to open bitstream filter %s for stream %d with codec %s",
5614                    bsfc->filter->name, pkt->stream_index,
5615                    codec->codec ? codec->codec->name : "copy");
5616             ret = a;
5617             break;
5618         }
5619         *pkt = new_pkt;
5620
5621         bsfc = bsfc->next;
5622     }
5623     return ret;
5624 }
5625 FF_ENABLE_DEPRECATION_WARNINGS
5626 #endif
5627
5628 int ff_format_output_open(AVFormatContext *s, const char *url, AVDictionary **options)
5629 {
5630     if (!s->oformat)
5631         return AVERROR(EINVAL);
5632
5633     if (!(s->oformat->flags & AVFMT_NOFILE))
5634         return s->io_open(s, &s->pb, url, AVIO_FLAG_WRITE, options);
5635     return 0;
5636 }
5637
5638 void ff_format_io_close(AVFormatContext *s, AVIOContext **pb)
5639 {
5640     if (*pb)
5641         s->io_close(s, *pb);
5642     *pb = NULL;
5643 }
5644
5645 int ff_is_http_proto(char *filename) {
5646     const char *proto = avio_find_protocol_name(filename);
5647     return proto ? (!av_strcasecmp(proto, "http") || !av_strcasecmp(proto, "https")) : 0;
5648 }
5649
5650 int ff_parse_creation_time_metadata(AVFormatContext *s, int64_t *timestamp, int return_seconds)
5651 {
5652     AVDictionaryEntry *entry;
5653     int64_t parsed_timestamp;
5654     int ret;
5655     if ((entry = av_dict_get(s->metadata, "creation_time", NULL, 0))) {
5656         if ((ret = av_parse_time(&parsed_timestamp, entry->value, 0)) >= 0) {
5657             *timestamp = return_seconds ? parsed_timestamp / 1000000 : parsed_timestamp;
5658             return 1;
5659         } else {
5660             av_log(s, AV_LOG_WARNING, "Failed to parse creation_time %s\n", entry->value);
5661             return ret;
5662         }
5663     }
5664     return 0;
5665 }
5666
5667 int ff_standardize_creation_time(AVFormatContext *s)
5668 {
5669     int64_t timestamp;
5670     int ret = ff_parse_creation_time_metadata(s, &timestamp, 0);
5671     if (ret == 1)
5672         return avpriv_dict_set_timestamp(&s->metadata, "creation_time", timestamp);
5673     return ret;
5674 }
5675
5676 int ff_get_packet_palette(AVFormatContext *s, AVPacket *pkt, int ret, uint32_t *palette)
5677 {
5678     uint8_t *side_data;
5679     int size;
5680
5681     side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_PALETTE, &size);
5682     if (side_data) {
5683         if (size != AVPALETTE_SIZE) {
5684             av_log(s, AV_LOG_ERROR, "Invalid palette side data\n");
5685             return AVERROR_INVALIDDATA;
5686         }
5687         memcpy(palette, side_data, AVPALETTE_SIZE);
5688         return 1;
5689     }
5690
5691     if (ret == CONTAINS_PAL) {
5692         int i;
5693         for (i = 0; i < AVPALETTE_COUNT; i++)
5694             palette[i] = AV_RL32(pkt->data + pkt->size - AVPALETTE_SIZE + i*4);
5695         return 1;
5696     }
5697
5698     return 0;
5699 }
5700
5701 int ff_bprint_to_codecpar_extradata(AVCodecParameters *par, struct AVBPrint *buf)
5702 {
5703     int ret;
5704     char *str;
5705
5706     ret = av_bprint_finalize(buf, &str);
5707     if (ret < 0)
5708         return ret;
5709     if (!av_bprint_is_complete(buf)) {
5710         av_free(str);
5711         return AVERROR(ENOMEM);
5712     }
5713
5714     par->extradata = str;
5715     /* Note: the string is NUL terminated (so extradata can be read as a
5716      * string), but the ending character is not accounted in the size (in
5717      * binary formats you are likely not supposed to mux that character). When
5718      * extradata is copied, it is also padded with AV_INPUT_BUFFER_PADDING_SIZE
5719      * zeros. */
5720     par->extradata_size = buf->len;
5721     return 0;
5722 }
5723
5724 int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt,
5725                                                   AVStream *ost, const AVStream *ist,
5726                                                   enum AVTimebaseSource copy_tb)
5727 {
5728     //TODO: use [io]st->internal->avctx
5729     const AVCodecContext *dec_ctx = ist->codec;
5730     AVCodecContext       *enc_ctx = ost->codec;
5731
5732     enc_ctx->time_base = ist->time_base;
5733     /*
5734      * Avi is a special case here because it supports variable fps but
5735      * having the fps and timebase differe significantly adds quite some
5736      * overhead
5737      */
5738     if (!strcmp(ofmt->name, "avi")) {
5739 #if FF_API_R_FRAME_RATE
5740         if (copy_tb == AVFMT_TBCF_AUTO && ist->r_frame_rate.num
5741             && av_q2d(ist->r_frame_rate) >= av_q2d(ist->avg_frame_rate)
5742             && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(ist->time_base)
5743             && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(dec_ctx->time_base)
5744             && av_q2d(ist->time_base) < 1.0/500 && av_q2d(dec_ctx->time_base) < 1.0/500
5745             || copy_tb == AVFMT_TBCF_R_FRAMERATE) {
5746             enc_ctx->time_base.num = ist->r_frame_rate.den;
5747             enc_ctx->time_base.den = 2*ist->r_frame_rate.num;
5748             enc_ctx->ticks_per_frame = 2;
5749         } else
5750 #endif
5751             if (copy_tb == AVFMT_TBCF_AUTO && av_q2d(dec_ctx->time_base)*dec_ctx->ticks_per_frame > 2*av_q2d(ist->time_base)
5752                    && av_q2d(ist->time_base) < 1.0/500
5753                    || copy_tb == AVFMT_TBCF_DECODER) {
5754             enc_ctx->time_base = dec_ctx->time_base;
5755             enc_ctx->time_base.num *= dec_ctx->ticks_per_frame;
5756             enc_ctx->time_base.den *= 2;
5757             enc_ctx->ticks_per_frame = 2;
5758         }
5759     } else if (!(ofmt->flags & AVFMT_VARIABLE_FPS)
5760                && !av_match_name(ofmt->name, "mov,mp4,3gp,3g2,psp,ipod,ismv,f4v")) {
5761         if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx->time_base.den
5762             && av_q2d(dec_ctx->time_base)*dec_ctx->ticks_per_frame > av_q2d(ist->time_base)
5763             && av_q2d(ist->time_base) < 1.0/500
5764             || copy_tb == AVFMT_TBCF_DECODER) {
5765             enc_ctx->time_base = dec_ctx->time_base;
5766             enc_ctx->time_base.num *= dec_ctx->ticks_per_frame;
5767         }
5768     }
5769
5770     if ((enc_ctx->codec_tag == AV_RL32("tmcd") || ost->codecpar->codec_tag == AV_RL32("tmcd"))
5771         && dec_ctx->time_base.num < dec_ctx->time_base.den
5772         && dec_ctx->time_base.num > 0
5773         && 121LL*dec_ctx->time_base.num > dec_ctx->time_base.den) {
5774         enc_ctx->time_base = dec_ctx->time_base;
5775     }
5776
5777     if (ost->avg_frame_rate.num)
5778         enc_ctx->time_base = av_inv_q(ost->avg_frame_rate);
5779
5780     av_reduce(&enc_ctx->time_base.num, &enc_ctx->time_base.den,
5781               enc_ctx->time_base.num, enc_ctx->time_base.den, INT_MAX);
5782
5783     return 0;
5784 }
5785
5786 AVRational av_stream_get_codec_timebase(const AVStream *st)
5787 {
5788     // See avformat_transfer_internal_stream_timing_info() TODO.
5789 #if FF_API_LAVF_AVCTX
5790 FF_DISABLE_DEPRECATION_WARNINGS
5791     return st->codec->time_base;
5792 FF_ENABLE_DEPRECATION_WARNINGS
5793 #else
5794     return st->internal->avctx->time_base;
5795 #endif
5796 }
5797
5798 void ff_format_set_url(AVFormatContext *s, char *url)
5799 {
5800     av_assert0(url);
5801     av_freep(&s->url);
5802     s->url = url;
5803 #if FF_API_FORMAT_FILENAME
5804 FF_DISABLE_DEPRECATION_WARNINGS
5805     av_strlcpy(s->filename, url, sizeof(s->filename));
5806 FF_ENABLE_DEPRECATION_WARNINGS
5807 #endif
5808 }