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