FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
utils.c
Go to the documentation of this file.
1 /*
2  * various utility functions for use within FFmpeg
3  * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 #include "avformat.h"
23 #include "avio_internal.h"
24 #include "internal.h"
25 #include "libavcodec/internal.h"
26 #include "libavcodec/raw.h"
27 #include "libavcodec/bytestream.h"
28 #include "libavutil/avassert.h"
29 #include "libavutil/opt.h"
30 #include "libavutil/dict.h"
31 #include "libavutil/pixdesc.h"
32 #include "metadata.h"
33 #include "id3v2.h"
34 #include "libavutil/avassert.h"
35 #include "libavutil/avstring.h"
36 #include "libavutil/mathematics.h"
37 #include "libavutil/parseutils.h"
38 #include "libavutil/time.h"
39 #include "libavutil/timestamp.h"
40 #include "riff.h"
41 #include "audiointerleave.h"
42 #include "url.h"
43 #include <stdarg.h>
44 #if CONFIG_NETWORK
45 #include "network.h"
46 #endif
47 
48 #undef NDEBUG
49 #include <assert.h>
50 
51 /**
52  * @file
53  * various utility functions for use within FFmpeg
54  */
55 
56 unsigned avformat_version(void)
57 {
60 }
61 
62 const char *avformat_configuration(void)
63 {
64  return FFMPEG_CONFIGURATION;
65 }
66 
67 const char *avformat_license(void)
68 {
69 #define LICENSE_PREFIX "libavformat license: "
70  return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
71 }
72 
73 #define RELATIVE_TS_BASE (INT64_MAX - (1LL<<48))
74 
75 static int is_relative(int64_t ts) {
76  return ts > (RELATIVE_TS_BASE - (1LL<<48));
77 }
78 
79 /**
80  * Wrap a given time stamp, if there is an indication for an overflow
81  *
82  * @param st stream
83  * @param timestamp the time stamp to wrap
84  * @return resulting time stamp
85  */
86 static int64_t wrap_timestamp(AVStream *st, int64_t timestamp)
87 {
89  st->pts_wrap_reference != AV_NOPTS_VALUE && timestamp != AV_NOPTS_VALUE) {
91  timestamp < st->pts_wrap_reference)
92  return timestamp + (1ULL<<st->pts_wrap_bits);
93  else if (st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET &&
94  timestamp >= st->pts_wrap_reference)
95  return timestamp - (1ULL<<st->pts_wrap_bits);
96  }
97  return timestamp;
98 }
99 
100 #define MAKE_ACCESSORS(str, name, type, field) \
101  type av_##name##_get_##field(const str *s) { return s->field; } \
102  void av_##name##_set_##field(str *s, type v) { s->field = v; }
103 
104 MAKE_ACCESSORS(AVStream, stream, AVRational, r_frame_rate)
105 
106 /** head of registered input format linked list */
108 /** head of registered output format linked list */
110 
112 {
113  if(f) return f->next;
114  else return first_iformat;
115 }
116 
118 {
119  if(f) return f->next;
120  else return first_oformat;
121 }
122 
124 {
125  AVInputFormat **p;
126  p = &first_iformat;
127  while (*p != NULL) p = &(*p)->next;
128  *p = format;
129  format->next = NULL;
130 }
131 
133 {
134  AVOutputFormat **p;
135  p = &first_oformat;
136  while (*p != NULL) p = &(*p)->next;
137  *p = format;
138  format->next = NULL;
139 }
140 
141 int av_match_ext(const char *filename, const char *extensions)
142 {
143  const char *ext, *p;
144  char ext1[32], *q;
145 
146  if(!filename)
147  return 0;
148 
149  ext = strrchr(filename, '.');
150  if (ext) {
151  ext++;
152  p = extensions;
153  for(;;) {
154  q = ext1;
155  while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
156  *q++ = *p++;
157  *q = '\0';
158  if (!av_strcasecmp(ext1, ext))
159  return 1;
160  if (*p == '\0')
161  break;
162  p++;
163  }
164  }
165  return 0;
166 }
167 
168 static int match_format(const char *name, const char *names)
169 {
170  const char *p;
171  int len, namelen;
172 
173  if (!name || !names)
174  return 0;
175 
176  namelen = strlen(name);
177  while ((p = strchr(names, ','))) {
178  len = FFMAX(p - names, namelen);
179  if (!av_strncasecmp(name, names, len))
180  return 1;
181  names = p+1;
182  }
183  return !av_strcasecmp(name, names);
184 }
185 
186 AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
187  const char *mime_type)
188 {
189  AVOutputFormat *fmt = NULL, *fmt_found;
190  int score_max, score;
191 
192  /* specific test for image sequences */
193 #if CONFIG_IMAGE2_MUXER
194  if (!short_name && filename &&
195  av_filename_number_test(filename) &&
197  return av_guess_format("image2", NULL, NULL);
198  }
199 #endif
200  /* Find the proper file type. */
201  fmt_found = NULL;
202  score_max = 0;
203  while ((fmt = av_oformat_next(fmt))) {
204  score = 0;
205  if (fmt->name && short_name && match_format(short_name, fmt->name))
206  score += 100;
207  if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
208  score += 10;
209  if (filename && fmt->extensions &&
210  av_match_ext(filename, fmt->extensions)) {
211  score += 5;
212  }
213  if (score > score_max) {
214  score_max = score;
215  fmt_found = fmt;
216  }
217  }
218  return fmt_found;
219 }
220 
221 enum AVCodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
222  const char *filename, const char *mime_type, enum AVMediaType type){
223  if (!strcmp(fmt->name, "segment") || !strcmp(fmt->name, "ssegment")) {
224  fmt = av_guess_format(NULL, filename, NULL);
225  }
226 
227  if(type == AVMEDIA_TYPE_VIDEO){
229 
230 #if CONFIG_IMAGE2_MUXER
231  if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
232  codec_id= ff_guess_image2_codec(filename);
233  }
234 #endif
235  if(codec_id == AV_CODEC_ID_NONE)
236  codec_id= fmt->video_codec;
237  return codec_id;
238  }else if(type == AVMEDIA_TYPE_AUDIO)
239  return fmt->audio_codec;
240  else if (type == AVMEDIA_TYPE_SUBTITLE)
241  return fmt->subtitle_codec;
242  else
243  return AV_CODEC_ID_NONE;
244 }
245 
246 AVInputFormat *av_find_input_format(const char *short_name)
247 {
249  while ((fmt = av_iformat_next(fmt))) {
250  if (match_format(short_name, fmt->name))
251  return fmt;
252  }
253  return NULL;
254 }
255 
256 /* an arbitrarily chosen "sane" max packet size -- 50M */
257 #define SANE_CHUNK_SIZE (50000000)
258 
260 {
261  if(s->maxsize>=0){
262  int64_t remaining= s->maxsize - avio_tell(s);
263  if(remaining < size){
264  int64_t newsize= avio_size(s);
265  if(!s->maxsize || s->maxsize<newsize)
266  s->maxsize= newsize - !newsize;
267  remaining= s->maxsize - avio_tell(s);
268  remaining= FFMAX(remaining, 0);
269  }
270 
271  if(s->maxsize>=0 && remaining+1 < size){
272  av_log(NULL, remaining ? AV_LOG_ERROR : AV_LOG_DEBUG, "Truncating packet of size %d to %"PRId64"\n", size, remaining+1);
273  size= remaining+1;
274  }
275  }
276  return size;
277 }
278 
279 /*
280  * Read the data in sane-sized chunks and append to pkt.
281  * Return the number of bytes read or an error.
282  */
284 {
285  int64_t orig_pos = pkt->pos; // av_grow_packet might reset pos
286  int orig_size = pkt->size;
287  int ret;
288 
289  do {
290  int prev_size = pkt->size;
291  int read_size;
292 
293  /*
294  * When the caller requests a lot of data, limit it to the amount left
295  * in file or SANE_CHUNK_SIZE when it is not known
296  */
297  read_size = size;
298  if (read_size > SANE_CHUNK_SIZE/10) {
299  read_size = ffio_limit(s, read_size);
300  // If filesize/maxsize is unknown, limit to SANE_CHUNK_SIZE
301  if (s->maxsize < 0)
302  read_size = FFMIN(read_size, SANE_CHUNK_SIZE);
303  }
304 
305  ret = av_grow_packet(pkt, read_size);
306  if (ret < 0)
307  break;
308 
309  ret = avio_read(s, pkt->data + prev_size, read_size);
310  if (ret != read_size) {
311  av_shrink_packet(pkt, prev_size + FFMAX(ret, 0));
312  break;
313  }
314 
315  size -= read_size;
316  } while (size > 0);
317  if (size > 0)
318  pkt->flags |= AV_PKT_FLAG_CORRUPT;
319 
320  pkt->pos = orig_pos;
321  if (!pkt->size)
322  av_free_packet(pkt);
323  return pkt->size > orig_size ? pkt->size - orig_size : ret;
324 }
325 
327 {
328  av_init_packet(pkt);
329  pkt->data = NULL;
330  pkt->size = 0;
331  pkt->pos = avio_tell(s);
332 
333  return append_packet_chunked(s, pkt, size);
334 }
335 
337 {
338  if (!pkt->size)
339  return av_get_packet(s, pkt, size);
340  return append_packet_chunked(s, pkt, size);
341 }
342 
343 
344 int av_filename_number_test(const char *filename)
345 {
346  char buf[1024];
347  return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
348 }
349 
350 AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret)
351 {
352  AVProbeData lpd = *pd;
353  AVInputFormat *fmt1 = NULL, *fmt;
354  int score, nodat = 0, score_max=0;
355  const static uint8_t zerobuffer[AVPROBE_PADDING_SIZE];
356 
357  if (!lpd.buf)
358  lpd.buf = zerobuffer;
359 
360  if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
361  int id3len = ff_id3v2_tag_len(lpd.buf);
362  if (lpd.buf_size > id3len + 16) {
363  lpd.buf += id3len;
364  lpd.buf_size -= id3len;
365  }else
366  nodat = 1;
367  }
368 
369  fmt = NULL;
370  while ((fmt1 = av_iformat_next(fmt1))) {
371  if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
372  continue;
373  score = 0;
374  if (fmt1->read_probe) {
375  score = fmt1->read_probe(&lpd);
376  if(fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions))
377  score = FFMAX(score, nodat ? AVPROBE_SCORE_EXTENSION / 2 - 1 : 1);
378  } else if (fmt1->extensions) {
379  if (av_match_ext(lpd.filename, fmt1->extensions)) {
380  score = AVPROBE_SCORE_EXTENSION;
381  }
382  }
383  if (score > score_max) {
384  score_max = score;
385  fmt = fmt1;
386  }else if (score == score_max)
387  fmt = NULL;
388  }
389  if(nodat)
390  score_max = FFMIN(AVPROBE_SCORE_EXTENSION / 2 - 1, score_max);
391  *score_ret= score_max;
392 
393  return fmt;
394 }
395 
396 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
397 {
398  int score_ret;
399  AVInputFormat *fmt= av_probe_input_format3(pd, is_opened, &score_ret);
400  if(score_ret > *score_max){
401  *score_max= score_ret;
402  return fmt;
403  }else
404  return NULL;
405 }
406 
408  int score=0;
409  return av_probe_input_format2(pd, is_opened, &score);
410 }
411 
413 {
414  static const struct {
415  const char *name; enum AVCodecID id; enum AVMediaType type;
416  } fmt_id_type[] = {
417  { "aac" , AV_CODEC_ID_AAC , AVMEDIA_TYPE_AUDIO },
418  { "ac3" , AV_CODEC_ID_AC3 , AVMEDIA_TYPE_AUDIO },
419  { "dts" , AV_CODEC_ID_DTS , AVMEDIA_TYPE_AUDIO },
420  { "eac3" , AV_CODEC_ID_EAC3 , AVMEDIA_TYPE_AUDIO },
421  { "h264" , AV_CODEC_ID_H264 , AVMEDIA_TYPE_VIDEO },
424  { "mp3" , AV_CODEC_ID_MP3 , AVMEDIA_TYPE_AUDIO },
425  { "mpegvideo", AV_CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
426  { 0 }
427  };
428  int score;
429  AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
430 
431  if (fmt && st->request_probe <= score) {
432  int i;
433  av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
434  pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
435  for (i = 0; fmt_id_type[i].name; i++) {
436  if (!strcmp(fmt->name, fmt_id_type[i].name)) {
437  st->codec->codec_id = fmt_id_type[i].id;
438  st->codec->codec_type = fmt_id_type[i].type;
439  break;
440  }
441  }
442  }
443  return score;
444 }
445 
446 /************************************************************/
447 /* input media file */
448 
450  int err;
451 
452  if (ic->iformat->read_header) {
453  err = ic->iformat->read_header(ic);
454  if (err < 0)
455  return err;
456  }
457 
458  if (ic->pb && !ic->data_offset)
459  ic->data_offset = avio_tell(ic->pb);
460 
461  return 0;
462 }
463 
464 
465 /** size of probe buffer, for guessing file type from file contents */
466 #define PROBE_BUF_MIN 2048
467 #define PROBE_BUF_MAX (1<<20)
468 
470  const char *filename, void *logctx,
471  unsigned int offset, unsigned int max_probe_size)
472 {
473  AVProbeData pd = { filename ? filename : "", NULL, -offset };
474  unsigned char *buf = NULL;
475  uint8_t *mime_type;
476  int ret = 0, probe_size, buf_offset = 0;
477 
478  if (!max_probe_size) {
479  max_probe_size = PROBE_BUF_MAX;
480  } else if (max_probe_size > PROBE_BUF_MAX) {
481  max_probe_size = PROBE_BUF_MAX;
482  } else if (max_probe_size < PROBE_BUF_MIN) {
483  av_log(logctx, AV_LOG_ERROR,
484  "Specified probe size value %u cannot be < %u\n", max_probe_size, PROBE_BUF_MIN);
485  return AVERROR(EINVAL);
486  }
487 
488  if (offset >= max_probe_size) {
489  return AVERROR(EINVAL);
490  }
491 
492  if (!*fmt && pb->av_class && av_opt_get(pb, "mime_type", AV_OPT_SEARCH_CHILDREN, &mime_type) >= 0 && mime_type) {
493  if (!av_strcasecmp(mime_type, "audio/aacp")) {
494  *fmt = av_find_input_format("aac");
495  }
496  av_freep(&mime_type);
497  }
498 
499  for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt;
500  probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
501  int score = probe_size < max_probe_size ? AVPROBE_SCORE_RETRY : 0;
502  void *buftmp;
503 
504  if (probe_size < offset) {
505  continue;
506  }
507 
508  /* read probe data */
509  buftmp = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
510  if(!buftmp){
511  av_free(buf);
512  return AVERROR(ENOMEM);
513  }
514  buf=buftmp;
515  if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
516  /* fail if error was not end of file, otherwise, lower score */
517  if (ret != AVERROR_EOF) {
518  av_free(buf);
519  return ret;
520  }
521  score = 0;
522  ret = 0; /* error was end of file, nothing read */
523  }
524  pd.buf_size = buf_offset += ret;
525  pd.buf = &buf[offset];
526 
527  memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
528 
529  /* guess file format */
530  *fmt = av_probe_input_format2(&pd, 1, &score);
531  if(*fmt){
532  if(score <= AVPROBE_SCORE_RETRY){ //this can only be true in the last iteration
533  av_log(logctx, AV_LOG_WARNING, "Format %s detected only with low score of %d, misdetection possible!\n", (*fmt)->name, score);
534  }else
535  av_log(logctx, AV_LOG_DEBUG, "Format %s probed with size=%d and score=%d\n", (*fmt)->name, probe_size, score);
536  }
537  }
538 
539  if (!*fmt) {
540  av_free(buf);
541  return AVERROR_INVALIDDATA;
542  }
543 
544  /* rewind. reuse probe buffer to avoid seeking */
545  ret = ffio_rewind_with_probe_data(pb, &buf, pd.buf_size);
546 
547  return ret;
548 }
549 
550 /* open input file and probe the format if necessary */
551 static int init_input(AVFormatContext *s, const char *filename, AVDictionary **options)
552 {
553  int ret;
554  AVProbeData pd = {filename, NULL, 0};
555  int score = AVPROBE_SCORE_RETRY;
556 
557  if (s->pb) {
559  if (!s->iformat)
560  return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, s->probesize);
561  else if (s->iformat->flags & AVFMT_NOFILE)
562  av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
563  "will be ignored with AVFMT_NOFILE format.\n");
564  return 0;
565  }
566 
567  if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
568  (!s->iformat && (s->iformat = av_probe_input_format2(&pd, 0, &score))))
569  return 0;
570 
571  if ((ret = avio_open2(&s->pb, filename, AVIO_FLAG_READ | s->avio_flags,
572  &s->interrupt_callback, options)) < 0)
573  return ret;
574  if (s->iformat)
575  return 0;
576  return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, s->probesize);
577 }
578 
579 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
580  AVPacketList **plast_pktl){
581  AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
582  if (!pktl)
583  return NULL;
584 
585  if (*packet_buffer)
586  (*plast_pktl)->next = pktl;
587  else
588  *packet_buffer = pktl;
589 
590  /* add the packet in the buffered packet list */
591  *plast_pktl = pktl;
592  pktl->pkt= *pkt;
593  return &pktl->pkt;
594 }
595 
597 {
598  int i;
599  for (i = 0; i < s->nb_streams; i++)
601  s->streams[i]->discard < AVDISCARD_ALL) {
603  copy.buf = av_buffer_ref(copy.buf);
604  if (!copy.buf)
605  return AVERROR(ENOMEM);
606 
608  }
609  return 0;
610 }
611 
613 {
614  AVFormatContext *s = *ps;
615  int ret = 0;
616  AVDictionary *tmp = NULL;
617  ID3v2ExtraMeta *id3v2_extra_meta = NULL;
618 
619  if (!s && !(s = avformat_alloc_context()))
620  return AVERROR(ENOMEM);
621  if (!s->av_class){
622  av_log(NULL, AV_LOG_ERROR, "Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n");
623  return AVERROR(EINVAL);
624  }
625  if (fmt)
626  s->iformat = fmt;
627 
628  if (options)
629  av_dict_copy(&tmp, *options, 0);
630 
631  if ((ret = av_opt_set_dict(s, &tmp)) < 0)
632  goto fail;
633 
634  if ((ret = init_input(s, filename, &tmp)) < 0)
635  goto fail;
637 
638  /* check filename in case an image number is expected */
639  if (s->iformat->flags & AVFMT_NEEDNUMBER) {
640  if (!av_filename_number_test(filename)) {
641  ret = AVERROR(EINVAL);
642  goto fail;
643  }
644  }
645 
647  av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename));
648 
649  /* allocate private data */
650  if (s->iformat->priv_data_size > 0) {
651  if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
652  ret = AVERROR(ENOMEM);
653  goto fail;
654  }
655  if (s->iformat->priv_class) {
656  *(const AVClass**)s->priv_data = s->iformat->priv_class;
658  if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
659  goto fail;
660  }
661  }
662 
663  /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
664  if (s->pb)
665  ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
666 
667  if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
668  if ((ret = s->iformat->read_header(s)) < 0)
669  goto fail;
670 
671  if (id3v2_extra_meta) {
672  if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac")) {
673  if((ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
674  goto fail;
675  } else
676  av_log(s, AV_LOG_DEBUG, "demuxer does not support additional id3 data, skipping\n");
677  }
678  ff_id3v2_free_extra_meta(&id3v2_extra_meta);
679 
680  if ((ret = avformat_queue_attached_pictures(s)) < 0)
681  goto fail;
682 
683  if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->data_offset)
684  s->data_offset = avio_tell(s->pb);
685 
687 
688  if (options) {
689  av_dict_free(options);
690  *options = tmp;
691  }
692  *ps = s;
693  return 0;
694 
695 fail:
696  ff_id3v2_free_extra_meta(&id3v2_extra_meta);
697  av_dict_free(&tmp);
698  if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
699  avio_close(s->pb);
701  *ps = NULL;
702  return ret;
703 }
704 
705 /*******************************************************/
706 
708 {
709  switch(st->codec->codec_type){
710  case AVMEDIA_TYPE_VIDEO:
712  break;
713  case AVMEDIA_TYPE_AUDIO:
715  break;
718  break;
719  }
720 }
721 
722 static void probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
723 {
724  if(st->request_probe>0){
725  AVProbeData *pd = &st->probe_data;
726  int end;
727  av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
728  --st->probe_packets;
729 
730  if (pkt) {
731  uint8_t *new_buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
732  if(!new_buf)
733  goto no_packet;
734  pd->buf = new_buf;
735  memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
736  pd->buf_size += pkt->size;
737  memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
738  } else {
739 no_packet:
740  st->probe_packets = 0;
741  if (!pd->buf_size) {
742  av_log(s, AV_LOG_WARNING, "nothing to probe for stream %d\n",
743  st->index);
744  }
745  }
746 
748  || st->probe_packets<=0;
749 
750  if(end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
751  int score= set_codec_from_probe_data(s, st, pd);
752  if( (st->codec->codec_id != AV_CODEC_ID_NONE && score > AVPROBE_SCORE_RETRY)
753  || end){
754  pd->buf_size=0;
755  av_freep(&pd->buf);
756  st->request_probe= -1;
757  if(st->codec->codec_id != AV_CODEC_ID_NONE){
758  av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
759  }else
760  av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
761  }
762  force_codec_ids(s, st);
763  }
764  }
765 }
766 
768 {
769  int ret, i;
770  AVStream *st;
771 
772  for(;;){
773  AVPacketList *pktl = s->raw_packet_buffer;
774 
775  if (pktl) {
776  *pkt = pktl->pkt;
777  st = s->streams[pkt->stream_index];
779  probe_codec(s, st, NULL);
780  if(st->request_probe <= 0){
781  s->raw_packet_buffer = pktl->next;
783  av_free(pktl);
784  return 0;
785  }
786  }
787 
788  pkt->data = NULL;
789  pkt->size = 0;
790  av_init_packet(pkt);
791  ret= s->iformat->read_packet(s, pkt);
792  if (ret < 0) {
793  if (!pktl || ret == AVERROR(EAGAIN))
794  return ret;
795  for (i = 0; i < s->nb_streams; i++) {
796  st = s->streams[i];
797  if (st->probe_packets) {
798  probe_codec(s, st, NULL);
799  }
800  av_assert0(st->request_probe <= 0);
801  }
802  continue;
803  }
804 
805  if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
806  (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
808  "Dropped corrupted packet (stream = %d)\n",
809  pkt->stream_index);
810  av_free_packet(pkt);
811  continue;
812  }
813 
814  if(!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
816 
817  if(pkt->stream_index >= (unsigned)s->nb_streams){
818  av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
819  continue;
820  }
821 
822  st= s->streams[pkt->stream_index];
823  pkt->dts = wrap_timestamp(st, pkt->dts);
824  pkt->pts = wrap_timestamp(st, pkt->pts);
825 
826  force_codec_ids(s, st);
827 
828  /* TODO: audio: time filter; video: frame reordering (pts != dts) */
830  pkt->dts = pkt->pts = av_rescale_q(av_gettime(), AV_TIME_BASE_Q, st->time_base);
831 
832  if(!pktl && st->request_probe <= 0)
833  return ret;
834 
837 
838  probe_codec(s, st, pkt);
839  }
840 }
841 
842 #if FF_API_READ_PACKET
843 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
844 {
845  return ff_read_packet(s, pkt);
846 }
847 #endif
848 
849 
850 /**********************************************************/
851 
853 {
854  if (/*avctx->codec_id == AV_CODEC_ID_AAC ||*/
855  avctx->codec_id == AV_CODEC_ID_MP1 ||
856  avctx->codec_id == AV_CODEC_ID_MP2 ||
857  avctx->codec_id == AV_CODEC_ID_MP3/* ||
858  avctx->codec_id == AV_CODEC_ID_CELT*/)
859  return 1;
860  return 0;
861 }
862 
863 /**
864  * Get the number of samples of an audio frame. Return -1 on error.
865  */
867 {
868  int frame_size;
869 
870  /* give frame_size priority if demuxing */
871  if (!mux && enc->frame_size > 1)
872  return enc->frame_size;
873 
874  if ((frame_size = av_get_audio_frame_duration(enc, size)) > 0)
875  return frame_size;
876 
877  /* Fall back on using frame_size if muxing. */
878  if (enc->frame_size > 1)
879  return enc->frame_size;
880 
881  //For WMA we currently have no other means to calculate duration thus we
882  //do it here by assuming CBR, which is true for all known cases.
883  if(!mux && enc->bit_rate>0 && size>0 && enc->sample_rate>0 && enc->block_align>1) {
884  if (enc->codec_id == AV_CODEC_ID_WMAV1 || enc->codec_id == AV_CODEC_ID_WMAV2)
885  return ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
886  }
887 
888  return -1;
889 }
890 
891 
892 /**
893  * Return the frame duration in seconds. Return 0 if not available.
894  */
895 void ff_compute_frame_duration(int *pnum, int *pden, AVStream *st,
897 {
898  int frame_size;
899 
900  *pnum = 0;
901  *pden = 0;
902  switch(st->codec->codec_type) {
903  case AVMEDIA_TYPE_VIDEO:
904  if (st->r_frame_rate.num && !pc) {
905  *pnum = st->r_frame_rate.den;
906  *pden = st->r_frame_rate.num;
907  } else if(st->time_base.num*1000LL > st->time_base.den) {
908  *pnum = st->time_base.num;
909  *pden = st->time_base.den;
910  }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
911  *pnum = st->codec->time_base.num;
912  *pden = st->codec->time_base.den;
913  if (pc && pc->repeat_pict) {
914  if (*pnum > INT_MAX / (1 + pc->repeat_pict))
915  *pden /= 1 + pc->repeat_pict;
916  else
917  *pnum *= 1 + pc->repeat_pict;
918  }
919  //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
920  //Thus if we have no parser in such case leave duration undefined.
921  if(st->codec->ticks_per_frame>1 && !pc){
922  *pnum = *pden = 0;
923  }
924  }
925  break;
926  case AVMEDIA_TYPE_AUDIO:
927  frame_size = ff_get_audio_frame_size(st->codec, pkt->size, 0);
928  if (frame_size <= 0 || st->codec->sample_rate <= 0)
929  break;
930  *pnum = frame_size;
931  *pden = st->codec->sample_rate;
932  break;
933  default:
934  break;
935  }
936 }
937 
938 static int is_intra_only(AVCodecContext *enc){
939  const AVCodecDescriptor *desc;
940 
941  if(enc->codec_type != AVMEDIA_TYPE_VIDEO)
942  return 1;
943 
944  desc = av_codec_get_codec_descriptor(enc);
945  if (!desc) {
946  desc = avcodec_descriptor_get(enc->codec_id);
948  }
949  if (desc)
950  return !!(desc->props & AV_CODEC_PROP_INTRA_ONLY);
951  return 0;
952 }
953 
955 {
956  if(st->codec->codec_id != AV_CODEC_ID_H264) return 1;
957  if(!st->info) // if we have left find_stream_info then nb_decoded_frames wont increase anymore for stream copy
958  return 1;
959 #if CONFIG_H264_DECODER
960  if(st->codec->has_b_frames &&
962  return 1;
963 #endif
964  if(st->codec->has_b_frames<3)
965  return st->nb_decoded_frames >= 7;
966  else if(st->codec->has_b_frames<4)
967  return st->nb_decoded_frames >= 18;
968  else
969  return st->nb_decoded_frames >= 20;
970 }
971 
973 {
974  if (pktl->next)
975  return pktl->next;
976  if (pktl == s->parse_queue_end)
977  return s->packet_buffer;
978  return NULL;
979 }
980 
981 static int update_wrap_reference(AVFormatContext *s, AVStream *st, int stream_index)
982 {
983  if (s->correct_ts_overflow && st->pts_wrap_bits < 63 &&
985  int i;
986 
987  // reference time stamp should be 60 s before first time stamp
988  int64_t pts_wrap_reference = st->first_dts - av_rescale(60, st->time_base.den, st->time_base.num);
989  // if first time stamp is not more than 1/8 and 60s before the wrap point, subtract rather than add wrap offset
990  int pts_wrap_behavior = (st->first_dts < (1LL<<st->pts_wrap_bits) - (1LL<<st->pts_wrap_bits-3)) ||
991  (st->first_dts < (1LL<<st->pts_wrap_bits) - av_rescale(60, st->time_base.den, st->time_base.num)) ?
993 
994  AVProgram *first_program = av_find_program_from_stream(s, NULL, stream_index);
995 
996  if (!first_program) {
997  int default_stream_index = av_find_default_stream_index(s);
998  if (s->streams[default_stream_index]->pts_wrap_reference == AV_NOPTS_VALUE) {
999  for (i=0; i<s->nb_streams; i++) {
1000  s->streams[i]->pts_wrap_reference = pts_wrap_reference;
1001  s->streams[i]->pts_wrap_behavior = pts_wrap_behavior;
1002  }
1003  }
1004  else {
1005  st->pts_wrap_reference = s->streams[default_stream_index]->pts_wrap_reference;
1006  st->pts_wrap_behavior = s->streams[default_stream_index]->pts_wrap_behavior;
1007  }
1008  }
1009  else {
1010  AVProgram *program = first_program;
1011  while (program) {
1012  if (program->pts_wrap_reference != AV_NOPTS_VALUE) {
1013  pts_wrap_reference = program->pts_wrap_reference;
1014  pts_wrap_behavior = program->pts_wrap_behavior;
1015  break;
1016  }
1017  program = av_find_program_from_stream(s, program, stream_index);
1018  }
1019 
1020  // update every program with differing pts_wrap_reference
1021  program = first_program;
1022  while(program) {
1023  if (program->pts_wrap_reference != pts_wrap_reference) {
1024  for (i=0; i<program->nb_stream_indexes; i++) {
1025  s->streams[program->stream_index[i]]->pts_wrap_reference = pts_wrap_reference;
1026  s->streams[program->stream_index[i]]->pts_wrap_behavior = pts_wrap_behavior;
1027  }
1028 
1029  program->pts_wrap_reference = pts_wrap_reference;
1030  program->pts_wrap_behavior = pts_wrap_behavior;
1031  }
1032  program = av_find_program_from_stream(s, program, stream_index);
1033  }
1034  }
1035  return 1;
1036  }
1037  return 0;
1038 }
1039 
1040 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
1041  int64_t dts, int64_t pts, AVPacket *pkt)
1042 {
1043  AVStream *st= s->streams[stream_index];
1044  AVPacketList *pktl= s->parse_queue ? s->parse_queue : s->packet_buffer;
1045  int64_t pts_buffer[MAX_REORDER_DELAY+1];
1046  int64_t shift;
1047  int i, delay;
1048 
1049  if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE || is_relative(dts))
1050  return;
1051 
1052  delay = st->codec->has_b_frames;
1053  st->first_dts= dts - (st->cur_dts - RELATIVE_TS_BASE);
1054  st->cur_dts= dts;
1055  shift = st->first_dts - RELATIVE_TS_BASE;
1056 
1057  for (i=0; i<MAX_REORDER_DELAY+1; i++)
1058  pts_buffer[i] = AV_NOPTS_VALUE;
1059 
1060  if (is_relative(pts))
1061  pts += shift;
1062 
1063  for(; pktl; pktl= get_next_pkt(s, st, pktl)){
1064  if(pktl->pkt.stream_index != stream_index)
1065  continue;
1066  if(is_relative(pktl->pkt.pts))
1067  pktl->pkt.pts += shift;
1068 
1069  if(is_relative(pktl->pkt.dts))
1070  pktl->pkt.dts += shift;
1071 
1072  if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
1073  st->start_time= pktl->pkt.pts;
1074 
1075  if(pktl->pkt.pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY && has_decode_delay_been_guessed(st)){
1076  pts_buffer[0]= pktl->pkt.pts;
1077  for(i=0; i<delay && pts_buffer[i] > pts_buffer[i+1]; i++)
1078  FFSWAP(int64_t, pts_buffer[i], pts_buffer[i+1]);
1079  if(pktl->pkt.dts == AV_NOPTS_VALUE)
1080  pktl->pkt.dts= pts_buffer[0];
1081  }
1082  }
1083 
1084  if (update_wrap_reference(s, st, stream_index) && st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET) {
1085  // correct first time stamps to negative values
1086  st->first_dts = wrap_timestamp(st, st->first_dts);
1087  st->cur_dts = wrap_timestamp(st, st->cur_dts);
1088  pkt->dts = wrap_timestamp(st, pkt->dts);
1089  pkt->pts = wrap_timestamp(st, pkt->pts);
1090  pts = wrap_timestamp(st, pts);
1091  }
1092 
1093  if (st->start_time == AV_NOPTS_VALUE)
1094  st->start_time = pts;
1095 }
1096 
1098  int stream_index, int duration)
1099 {
1100  AVPacketList *pktl= s->parse_queue ? s->parse_queue : s->packet_buffer;
1101  int64_t cur_dts= RELATIVE_TS_BASE;
1102 
1103  if(st->first_dts != AV_NOPTS_VALUE){
1104  cur_dts= st->first_dts;
1105  for(; pktl; pktl= get_next_pkt(s, st, pktl)){
1106  if(pktl->pkt.stream_index == stream_index){
1107  if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
1108  break;
1109  cur_dts -= duration;
1110  }
1111  }
1112  if(pktl && pktl->pkt.dts != st->first_dts) {
1113  av_log(s, AV_LOG_DEBUG, "first_dts %s not matching first dts %s in the queue\n", av_ts2str(st->first_dts), av_ts2str(pktl->pkt.dts));
1114  return;
1115  }
1116  if(!pktl) {
1117  av_log(s, AV_LOG_DEBUG, "first_dts %s but no packet with dts in the queue\n", av_ts2str(st->first_dts));
1118  return;
1119  }
1120  pktl= s->parse_queue ? s->parse_queue : s->packet_buffer;
1121  st->first_dts = cur_dts;
1122  }else if(st->cur_dts != RELATIVE_TS_BASE)
1123  return;
1124 
1125  for(; pktl; pktl= get_next_pkt(s, st, pktl)){
1126  if(pktl->pkt.stream_index != stream_index)
1127  continue;
1128  if(pktl->pkt.pts == pktl->pkt.dts && (pktl->pkt.dts == AV_NOPTS_VALUE || pktl->pkt.dts == st->first_dts)
1129  && !pktl->pkt.duration){
1130  pktl->pkt.dts= cur_dts;
1131  if(!st->codec->has_b_frames)
1132  pktl->pkt.pts= cur_dts;
1133 // if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
1134  pktl->pkt.duration = duration;
1135  }else
1136  break;
1137  cur_dts = pktl->pkt.dts + pktl->pkt.duration;
1138  }
1139  if(!pktl)
1140  st->cur_dts= cur_dts;
1141 }
1142 
1145 {
1146  int num, den, presentation_delayed, delay, i;
1147  int64_t offset;
1148 
1149  if (s->flags & AVFMT_FLAG_NOFILLIN)
1150  return;
1151 
1152  if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
1153  pkt->dts= AV_NOPTS_VALUE;
1154 
1155  if (st->codec->codec_id != AV_CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
1156  //FIXME Set low_delay = 0 when has_b_frames = 1
1157  st->codec->has_b_frames = 1;
1158 
1159  /* do we have a video B-frame ? */
1160  delay= st->codec->has_b_frames;
1161  presentation_delayed = 0;
1162 
1163  /* XXX: need has_b_frame, but cannot get it if the codec is
1164  not initialized */
1165  if (delay &&
1166  pc && pc->pict_type != AV_PICTURE_TYPE_B)
1167  presentation_delayed = 1;
1168 
1169  if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && st->pts_wrap_bits<63 && pkt->dts - (1LL<<(st->pts_wrap_bits-1)) > pkt->pts){
1170  if(is_relative(st->cur_dts) || pkt->dts - (1LL<<(st->pts_wrap_bits-1)) > st->cur_dts) {
1171  pkt->dts -= 1LL<<st->pts_wrap_bits;
1172  } else
1173  pkt->pts += 1LL<<st->pts_wrap_bits;
1174  }
1175 
1176  // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
1177  // we take the conservative approach and discard both
1178  // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
1179  if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
1180  av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
1181  if(strcmp(s->iformat->name, "mov,mp4,m4a,3gp,3g2,mj2")) // otherwise we discard correct timestamps for vc1-wmapro.ism
1182  pkt->dts= AV_NOPTS_VALUE;
1183  }
1184 
1185  if (pkt->duration == 0) {
1186  ff_compute_frame_duration(&num, &den, st, pc, pkt);
1187  if (den && num) {
1188  pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
1189  }
1190  }
1191  if(pkt->duration != 0 && (s->packet_buffer || s->parse_queue))
1192  update_initial_durations(s, st, pkt->stream_index, pkt->duration);
1193 
1194  /* correct timestamps with byte offset if demuxers only have timestamps
1195  on packet boundaries */
1196  if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
1197  /* this will estimate bitrate based on this frame's duration and size */
1198  offset = av_rescale(pc->offset, pkt->duration, pkt->size);
1199  if(pkt->pts != AV_NOPTS_VALUE)
1200  pkt->pts += offset;
1201  if(pkt->dts != AV_NOPTS_VALUE)
1202  pkt->dts += offset;
1203  }
1204 
1205  if (pc && pc->dts_sync_point >= 0) {
1206  // we have synchronization info from the parser
1207  int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
1208  if (den > 0) {
1209  int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
1210  if (pkt->dts != AV_NOPTS_VALUE) {
1211  // got DTS from the stream, update reference timestamp
1212  st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
1213  pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1214  } else if (st->reference_dts != AV_NOPTS_VALUE) {
1215  // compute DTS based on reference timestamp
1216  pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
1217  pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1218  }
1219  if (pc->dts_sync_point > 0)
1220  st->reference_dts = pkt->dts; // new reference
1221  }
1222  }
1223 
1224  /* This may be redundant, but it should not hurt. */
1225  if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
1226  presentation_delayed = 1;
1227 
1228  av_dlog(NULL, "IN delayed:%d pts:%s, dts:%s cur_dts:%s st:%d pc:%p duration:%d\n",
1229  presentation_delayed, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts), pkt->stream_index, pc, pkt->duration);
1230  /* interpolate PTS and DTS if they are not present */
1231  //We skip H264 currently because delay and has_b_frames are not reliably set
1232  if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != AV_CODEC_ID_H264){
1233  if (presentation_delayed) {
1234  /* DTS = decompression timestamp */
1235  /* PTS = presentation timestamp */
1236  if (pkt->dts == AV_NOPTS_VALUE)
1237  pkt->dts = st->last_IP_pts;
1238  update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
1239  if (pkt->dts == AV_NOPTS_VALUE)
1240  pkt->dts = st->cur_dts;
1241 
1242  /* this is tricky: the dts must be incremented by the duration
1243  of the frame we are displaying, i.e. the last I- or P-frame */
1244  if (st->last_IP_duration == 0)
1245  st->last_IP_duration = pkt->duration;
1246  if(pkt->dts != AV_NOPTS_VALUE)
1247  st->cur_dts = pkt->dts + st->last_IP_duration;
1248  st->last_IP_duration = pkt->duration;
1249  st->last_IP_pts= pkt->pts;
1250  /* cannot compute PTS if not present (we can compute it only
1251  by knowing the future */
1252  } else if (pkt->pts != AV_NOPTS_VALUE ||
1253  pkt->dts != AV_NOPTS_VALUE ||
1254  pkt->duration ) {
1255  int duration = pkt->duration;
1256 
1257  /* presentation is not delayed : PTS and DTS are the same */
1258  if (pkt->pts == AV_NOPTS_VALUE)
1259  pkt->pts = pkt->dts;
1261  pkt->pts, pkt);
1262  if (pkt->pts == AV_NOPTS_VALUE)
1263  pkt->pts = st->cur_dts;
1264  pkt->dts = pkt->pts;
1265  if (pkt->pts != AV_NOPTS_VALUE)
1266  st->cur_dts = pkt->pts + duration;
1267  }
1268  }
1269 
1270  if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY && has_decode_delay_been_guessed(st)){
1271  st->pts_buffer[0]= pkt->pts;
1272  for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1273  FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1274  if(pkt->dts == AV_NOPTS_VALUE)
1275  pkt->dts= st->pts_buffer[0];
1276  }
1277  if(st->codec->codec_id == AV_CODEC_ID_H264){ // we skipped it above so we try here
1278  update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt); // this should happen on the first packet
1279  }
1280  if(pkt->dts > st->cur_dts)
1281  st->cur_dts = pkt->dts;
1282 
1283  av_dlog(NULL, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s\n",
1284  presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts));
1285 
1286  /* update flags */
1287  if (is_intra_only(st->codec))
1288  pkt->flags |= AV_PKT_FLAG_KEY;
1289  if (pc)
1291 }
1292 
1293 static void free_packet_buffer(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end)
1294 {
1295  while (*pkt_buf) {
1296  AVPacketList *pktl = *pkt_buf;
1297  *pkt_buf = pktl->next;
1298  av_free_packet(&pktl->pkt);
1299  av_freep(&pktl);
1300  }
1301  *pkt_buf_end = NULL;
1302 }
1303 
1304 /**
1305  * Parse a packet, add all split parts to parse_queue
1306  *
1307  * @param pkt packet to parse, NULL when flushing the parser at end of stream
1308  */
1309 static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index)
1310 {
1311  AVPacket out_pkt = { 0 }, flush_pkt = { 0 };
1312  AVStream *st = s->streams[stream_index];
1313  uint8_t *data = pkt ? pkt->data : NULL;
1314  int size = pkt ? pkt->size : 0;
1315  int ret = 0, got_output = 0;
1316 
1317  if (!pkt) {
1319  pkt = &flush_pkt;
1320  got_output = 1;
1321  } else if (!size && st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) {
1322  // preserve 0-size sync packets
1323  compute_pkt_fields(s, st, st->parser, pkt);
1324  }
1325 
1326  while (size > 0 || (pkt == &flush_pkt && got_output)) {
1327  int len;
1328 
1329  av_init_packet(&out_pkt);
1330  len = av_parser_parse2(st->parser, st->codec,
1331  &out_pkt.data, &out_pkt.size, data, size,
1332  pkt->pts, pkt->dts, pkt->pos);
1333 
1334  pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1335  pkt->pos = -1;
1336  /* increment read pointer */
1337  data += len;
1338  size -= len;
1339 
1340  got_output = !!out_pkt.size;
1341 
1342  if (!out_pkt.size)
1343  continue;
1344 
1345  /* set the duration */
1346  out_pkt.duration = 0;
1347  if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1348  if (st->codec->sample_rate > 0) {
1349  out_pkt.duration = av_rescale_q_rnd(st->parser->duration,
1350  (AVRational){ 1, st->codec->sample_rate },
1351  st->time_base,
1352  AV_ROUND_DOWN);
1353  }
1354  } else if (st->codec->time_base.num != 0 &&
1355  st->codec->time_base.den != 0) {
1356  out_pkt.duration = av_rescale_q_rnd(st->parser->duration,
1357  st->codec->time_base,
1358  st->time_base,
1359  AV_ROUND_DOWN);
1360  }
1361 
1362  out_pkt.stream_index = st->index;
1363  out_pkt.pts = st->parser->pts;
1364  out_pkt.dts = st->parser->dts;
1365  out_pkt.pos = st->parser->pos;
1366 
1368  out_pkt.pos = st->parser->frame_offset;
1369 
1370  if (st->parser->key_frame == 1 ||
1371  (st->parser->key_frame == -1 &&
1373  out_pkt.flags |= AV_PKT_FLAG_KEY;
1374 
1375  if(st->parser->key_frame == -1 && st->parser->pict_type==AV_PICTURE_TYPE_NONE && (pkt->flags&AV_PKT_FLAG_KEY))
1376  out_pkt.flags |= AV_PKT_FLAG_KEY;
1377 
1378  compute_pkt_fields(s, st, st->parser, &out_pkt);
1379 
1380  if (out_pkt.data == pkt->data && out_pkt.size == pkt->size) {
1381  out_pkt.buf = pkt->buf;
1382  pkt->buf = NULL;
1383 #if FF_API_DESTRUCT_PACKET
1384  out_pkt.destruct = pkt->destruct;
1385  pkt->destruct = NULL;
1386 #endif
1387  }
1388  if ((ret = av_dup_packet(&out_pkt)) < 0)
1389  goto fail;
1390 
1391  if (!add_to_pktbuf(&s->parse_queue, &out_pkt, &s->parse_queue_end)) {
1392  av_free_packet(&out_pkt);
1393  ret = AVERROR(ENOMEM);
1394  goto fail;
1395  }
1396  }
1397 
1398 
1399  /* end of the stream => close and free the parser */
1400  if (pkt == &flush_pkt) {
1401  av_parser_close(st->parser);
1402  st->parser = NULL;
1403  }
1404 
1405 fail:
1407  return ret;
1408 }
1409 
1410 static int read_from_packet_buffer(AVPacketList **pkt_buffer,
1411  AVPacketList **pkt_buffer_end,
1412  AVPacket *pkt)
1413 {
1414  AVPacketList *pktl;
1415  av_assert0(*pkt_buffer);
1416  pktl = *pkt_buffer;
1417  *pkt = pktl->pkt;
1418  *pkt_buffer = pktl->next;
1419  if (!pktl->next)
1420  *pkt_buffer_end = NULL;
1421  av_freep(&pktl);
1422  return 0;
1423 }
1424 
1426 {
1427  int ret = 0, i, got_packet = 0;
1428 
1429  av_init_packet(pkt);
1430 
1431  while (!got_packet && !s->parse_queue) {
1432  AVStream *st;
1433  AVPacket cur_pkt;
1434 
1435  /* read next packet */
1436  ret = ff_read_packet(s, &cur_pkt);
1437  if (ret < 0) {
1438  if (ret == AVERROR(EAGAIN))
1439  return ret;
1440  /* flush the parsers */
1441  for(i = 0; i < s->nb_streams; i++) {
1442  st = s->streams[i];
1443  if (st->parser && st->need_parsing)
1444  parse_packet(s, NULL, st->index);
1445  }
1446  /* all remaining packets are now in parse_queue =>
1447  * really terminate parsing */
1448  break;
1449  }
1450  ret = 0;
1451  st = s->streams[cur_pkt.stream_index];
1452 
1453  if (cur_pkt.pts != AV_NOPTS_VALUE &&
1454  cur_pkt.dts != AV_NOPTS_VALUE &&
1455  cur_pkt.pts < cur_pkt.dts) {
1456  av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
1457  cur_pkt.stream_index,
1458  av_ts2str(cur_pkt.pts),
1459  av_ts2str(cur_pkt.dts),
1460  cur_pkt.size);
1461  }
1462  if (s->debug & FF_FDEBUG_TS)
1463  av_log(s, AV_LOG_DEBUG, "ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%d, flags=%d\n",
1464  cur_pkt.stream_index,
1465  av_ts2str(cur_pkt.pts),
1466  av_ts2str(cur_pkt.dts),
1467  cur_pkt.size,
1468  cur_pkt.duration,
1469  cur_pkt.flags);
1470 
1471  if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1472  st->parser = av_parser_init(st->codec->codec_id);
1473  if (!st->parser) {
1474  av_log(s, AV_LOG_VERBOSE, "parser not found for codec "
1475  "%s, packets or times may be invalid.\n",
1477  /* no parser available: just output the raw packets */
1479  } else if(st->need_parsing == AVSTREAM_PARSE_HEADERS) {
1481  } else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE) {
1482  st->parser->flags |= PARSER_FLAG_ONCE;
1483  } else if(st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
1485  }
1486  }
1487 
1488  if (!st->need_parsing || !st->parser) {
1489  /* no parsing needed: we just output the packet as is */
1490  *pkt = cur_pkt;
1491  compute_pkt_fields(s, st, NULL, pkt);
1492  if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1493  (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1494  ff_reduce_index(s, st->index);
1495  av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1496  }
1497  got_packet = 1;
1498  } else if (st->discard < AVDISCARD_ALL) {
1499  if ((ret = parse_packet(s, &cur_pkt, cur_pkt.stream_index)) < 0)
1500  return ret;
1501  } else {
1502  /* free packet */
1503  av_free_packet(&cur_pkt);
1504  }
1505  if (pkt->flags & AV_PKT_FLAG_KEY)
1506  st->skip_to_keyframe = 0;
1507  if (st->skip_to_keyframe) {
1508  av_free_packet(&cur_pkt);
1509  got_packet = 0;
1510  }
1511  }
1512 
1513  if (!got_packet && s->parse_queue)
1515 
1516  if(s->debug & FF_FDEBUG_TS)
1517  av_log(s, AV_LOG_DEBUG, "read_frame_internal stream=%d, pts=%s, dts=%s, size=%d, duration=%d, flags=%d\n",
1518  pkt->stream_index,
1519  av_ts2str(pkt->pts),
1520  av_ts2str(pkt->dts),
1521  pkt->size,
1522  pkt->duration,
1523  pkt->flags);
1524 
1525  return ret;
1526 }
1527 
1529 {
1530  const int genpts = s->flags & AVFMT_FLAG_GENPTS;
1531  int eof = 0;
1532  int ret;
1533  AVStream *st;
1534 
1535  if (!genpts) {
1536  ret = s->packet_buffer ?
1538  read_frame_internal(s, pkt);
1539  if (ret < 0)
1540  return ret;
1541  goto return_packet;
1542  }
1543 
1544  for (;;) {
1545  AVPacketList *pktl = s->packet_buffer;
1546 
1547  if (pktl) {
1548  AVPacket *next_pkt = &pktl->pkt;
1549 
1550  if (next_pkt->dts != AV_NOPTS_VALUE) {
1551  int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1552  // last dts seen for this stream. if any of packets following
1553  // current one had no dts, we will set this to AV_NOPTS_VALUE.
1554  int64_t last_dts = next_pkt->dts;
1555  while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
1556  if (pktl->pkt.stream_index == next_pkt->stream_index &&
1557  (av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)) < 0)) {
1558  if (av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1559  next_pkt->pts = pktl->pkt.dts;
1560  }
1561  if (last_dts != AV_NOPTS_VALUE) {
1562  // Once last dts was set to AV_NOPTS_VALUE, we don't change it.
1563  last_dts = pktl->pkt.dts;
1564  }
1565  }
1566  pktl = pktl->next;
1567  }
1568  if (eof && next_pkt->pts == AV_NOPTS_VALUE && last_dts != AV_NOPTS_VALUE) {
1569  // Fixing the last reference frame had none pts issue (For MXF etc).
1570  // We only do this when
1571  // 1. eof.
1572  // 2. we are not able to resolve a pts value for current packet.
1573  // 3. the packets for this stream at the end of the files had valid dts.
1574  next_pkt->pts = last_dts + next_pkt->duration;
1575  }
1576  pktl = s->packet_buffer;
1577  }
1578 
1579  /* read packet from packet buffer, if there is data */
1580  if (!(next_pkt->pts == AV_NOPTS_VALUE &&
1581  next_pkt->dts != AV_NOPTS_VALUE && !eof)) {
1583  &s->packet_buffer_end, pkt);
1584  goto return_packet;
1585  }
1586  }
1587 
1588  ret = read_frame_internal(s, pkt);
1589  if (ret < 0) {
1590  if (pktl && ret != AVERROR(EAGAIN)) {
1591  eof = 1;
1592  continue;
1593  } else
1594  return ret;
1595  }
1596 
1598  &s->packet_buffer_end)) < 0)
1599  return AVERROR(ENOMEM);
1600  }
1601 
1602 return_packet:
1603 
1604  st = s->streams[pkt->stream_index];
1605  if (st->skip_samples) {
1607  AV_WL32(p, st->skip_samples);
1608  av_log(s, AV_LOG_DEBUG, "demuxer injecting skip %d\n", st->skip_samples);
1609  st->skip_samples = 0;
1610  }
1611 
1612  if ((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY) {
1613  ff_reduce_index(s, st->index);
1614  av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1615  }
1616 
1617  if (is_relative(pkt->dts))
1618  pkt->dts -= RELATIVE_TS_BASE;
1619  if (is_relative(pkt->pts))
1620  pkt->pts -= RELATIVE_TS_BASE;
1621 
1622  return ret;
1623 }
1624 
1625 /* XXX: suppress the packet queue */
1627 {
1631 
1633 }
1634 
1635 /*******************************************************/
1636 /* seek support */
1637 
1639 {
1640  int first_audio_index = -1;
1641  int i;
1642  AVStream *st;
1643 
1644  if (s->nb_streams <= 0)
1645  return -1;
1646  for(i = 0; i < s->nb_streams; i++) {
1647  st = s->streams[i];
1648  if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1650  return i;
1651  }
1652  if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1653  first_audio_index = i;
1654  }
1655  return first_audio_index >= 0 ? first_audio_index : 0;
1656 }
1657 
1658 /**
1659  * Flush the frame reader.
1660  */
1662 {
1663  AVStream *st;
1664  int i, j;
1665 
1666  flush_packet_queue(s);
1667 
1668  /* for each stream, reset read state */
1669  for(i = 0; i < s->nb_streams; i++) {
1670  st = s->streams[i];
1671 
1672  if (st->parser) {
1673  av_parser_close(st->parser);
1674  st->parser = NULL;
1675  }
1678  else st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1680 
1682 
1683  for(j=0; j<MAX_REORDER_DELAY+1; j++)
1684  st->pts_buffer[j]= AV_NOPTS_VALUE;
1685  }
1686 }
1687 
1688 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
1689 {
1690  int i;
1691 
1692  for(i = 0; i < s->nb_streams; i++) {
1693  AVStream *st = s->streams[i];
1694 
1695  st->cur_dts = av_rescale(timestamp,
1696  st->time_base.den * (int64_t)ref_st->time_base.num,
1697  st->time_base.num * (int64_t)ref_st->time_base.den);
1698  }
1699 }
1700 
1701 void ff_reduce_index(AVFormatContext *s, int stream_index)
1702 {
1703  AVStream *st= s->streams[stream_index];
1704  unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1705 
1706  if((unsigned)st->nb_index_entries >= max_entries){
1707  int i;
1708  for(i=0; 2*i<st->nb_index_entries; i++)
1709  st->index_entries[i]= st->index_entries[2*i];
1710  st->nb_index_entries= i;
1711  }
1712 }
1713 
1714 int ff_add_index_entry(AVIndexEntry **index_entries,
1715  int *nb_index_entries,
1716  unsigned int *index_entries_allocated_size,
1717  int64_t pos, int64_t timestamp, int size, int distance, int flags)
1718 {
1719  AVIndexEntry *entries, *ie;
1720  int index;
1721 
1722  if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1723  return -1;
1724 
1725  if(timestamp == AV_NOPTS_VALUE)
1726  return AVERROR(EINVAL);
1727 
1728  if (is_relative(timestamp)) //FIXME this maintains previous behavior but we should shift by the correct offset once known
1729  timestamp -= RELATIVE_TS_BASE;
1730 
1731  entries = av_fast_realloc(*index_entries,
1732  index_entries_allocated_size,
1733  (*nb_index_entries + 1) *
1734  sizeof(AVIndexEntry));
1735  if(!entries)
1736  return -1;
1737 
1738  *index_entries= entries;
1739 
1740  index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1741 
1742  if(index<0){
1743  index= (*nb_index_entries)++;
1744  ie= &entries[index];
1745  av_assert0(index==0 || ie[-1].timestamp < timestamp);
1746  }else{
1747  ie= &entries[index];
1748  if(ie->timestamp != timestamp){
1749  if(ie->timestamp <= timestamp)
1750  return -1;
1751  memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1752  (*nb_index_entries)++;
1753  }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1754  distance= ie->min_distance;
1755  }
1756 
1757  ie->pos = pos;
1758  ie->timestamp = timestamp;
1759  ie->min_distance= distance;
1760  ie->size= size;
1761  ie->flags = flags;
1762 
1763  return index;
1764 }
1765 
1767  int64_t pos, int64_t timestamp, int size, int distance, int flags)
1768 {
1769  timestamp = wrap_timestamp(st, timestamp);
1771  &st->index_entries_allocated_size, pos,
1772  timestamp, size, distance, flags);
1773 }
1774 
1775 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1776  int64_t wanted_timestamp, int flags)
1777 {
1778  int a, b, m;
1779  int64_t timestamp;
1780 
1781  a = - 1;
1782  b = nb_entries;
1783 
1784  //optimize appending index entries at the end
1785  if(b && entries[b-1].timestamp < wanted_timestamp)
1786  a= b-1;
1787 
1788  while (b - a > 1) {
1789  m = (a + b) >> 1;
1790  timestamp = entries[m].timestamp;
1791  if(timestamp >= wanted_timestamp)
1792  b = m;
1793  if(timestamp <= wanted_timestamp)
1794  a = m;
1795  }
1796  m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1797 
1798  if(!(flags & AVSEEK_FLAG_ANY)){
1799  while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1800  m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1801  }
1802  }
1803 
1804  if(m == nb_entries)
1805  return -1;
1806  return m;
1807 }
1808 
1809 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1810  int flags)
1811 {
1813  wanted_timestamp, flags);
1814 }
1815 
1816 static int64_t ff_read_timestamp(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit,
1817  int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1818 {
1819  int64_t ts = read_timestamp(s, stream_index, ppos, pos_limit);
1820  if (stream_index >= 0)
1821  ts = wrap_timestamp(s->streams[stream_index], ts);
1822  return ts;
1823 }
1824 
1825 int ff_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags)
1826 {
1827  AVInputFormat *avif= s->iformat;
1828  int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1829  int64_t ts_min, ts_max, ts;
1830  int index;
1831  int64_t ret;
1832  AVStream *st;
1833 
1834  if (stream_index < 0)
1835  return -1;
1836 
1837  av_dlog(s, "read_seek: %d %s\n", stream_index, av_ts2str(target_ts));
1838 
1839  ts_max=
1840  ts_min= AV_NOPTS_VALUE;
1841  pos_limit= -1; //gcc falsely says it may be uninitialized
1842 
1843  st= s->streams[stream_index];
1844  if(st->index_entries){
1845  AVIndexEntry *e;
1846 
1847  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()
1848  index= FFMAX(index, 0);
1849  e= &st->index_entries[index];
1850 
1851  if(e->timestamp <= target_ts || e->pos == e->min_distance){
1852  pos_min= e->pos;
1853  ts_min= e->timestamp;
1854  av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%s\n",
1855  pos_min, av_ts2str(ts_min));
1856  }else{
1857  av_assert1(index==0);
1858  }
1859 
1860  index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1861  av_assert0(index < st->nb_index_entries);
1862  if(index >= 0){
1863  e= &st->index_entries[index];
1864  av_assert1(e->timestamp >= target_ts);
1865  pos_max= e->pos;
1866  ts_max= e->timestamp;
1867  pos_limit= pos_max - e->min_distance;
1868  av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%s\n",
1869  pos_max, pos_limit, av_ts2str(ts_max));
1870  }
1871  }
1872 
1873  pos= ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1874  if(pos<0)
1875  return -1;
1876 
1877  /* do the seek */
1878  if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1879  return ret;
1880 
1882  ff_update_cur_dts(s, st, ts);
1883 
1884  return 0;
1885 }
1886 
1887 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
1888  int64_t pos_min, int64_t pos_max, int64_t pos_limit,
1889  int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret,
1890  int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
1891 {
1892  int64_t pos, ts;
1893  int64_t start_pos, filesize;
1894  int no_change;
1895 
1896  av_dlog(s, "gen_seek: %d %s\n", stream_index, av_ts2str(target_ts));
1897 
1898  if(ts_min == AV_NOPTS_VALUE){
1899  pos_min = s->data_offset;
1900  ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
1901  if (ts_min == AV_NOPTS_VALUE)
1902  return -1;
1903  }
1904 
1905  if(ts_min >= target_ts){
1906  *ts_ret= ts_min;
1907  return pos_min;
1908  }
1909 
1910  if(ts_max == AV_NOPTS_VALUE){
1911  int step= 1024;
1912  filesize = avio_size(s->pb);
1913  pos_max = filesize - 1;
1914  do{
1915  pos_max = FFMAX(0, pos_max - step);
1916  ts_max = ff_read_timestamp(s, stream_index, &pos_max, pos_max + step, read_timestamp);
1917  step += step;
1918  }while(ts_max == AV_NOPTS_VALUE && pos_max > 0);
1919  if (ts_max == AV_NOPTS_VALUE)
1920  return -1;
1921 
1922  for(;;){
1923  int64_t tmp_pos= pos_max + 1;
1924  int64_t tmp_ts= ff_read_timestamp(s, stream_index, &tmp_pos, INT64_MAX, read_timestamp);
1925  if(tmp_ts == AV_NOPTS_VALUE)
1926  break;
1927  ts_max= tmp_ts;
1928  pos_max= tmp_pos;
1929  if(tmp_pos >= filesize)
1930  break;
1931  }
1932  pos_limit= pos_max;
1933  }
1934 
1935  if(ts_max <= target_ts){
1936  *ts_ret= ts_max;
1937  return pos_max;
1938  }
1939 
1940  if(ts_min > ts_max){
1941  return -1;
1942  }else if(ts_min == ts_max){
1943  pos_limit= pos_min;
1944  }
1945 
1946  no_change=0;
1947  while (pos_min < pos_limit) {
1948  av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%s dts_max=%s\n",
1949  pos_min, pos_max, av_ts2str(ts_min), av_ts2str(ts_max));
1950  assert(pos_limit <= pos_max);
1951 
1952  if(no_change==0){
1953  int64_t approximate_keyframe_distance= pos_max - pos_limit;
1954  // interpolate position (better than dichotomy)
1955  pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1956  + pos_min - approximate_keyframe_distance;
1957  }else if(no_change==1){
1958  // bisection, if interpolation failed to change min or max pos last time
1959  pos = (pos_min + pos_limit)>>1;
1960  }else{
1961  /* linear search if bisection failed, can only happen if there
1962  are very few or no keyframes between min/max */
1963  pos=pos_min;
1964  }
1965  if(pos <= pos_min)
1966  pos= pos_min + 1;
1967  else if(pos > pos_limit)
1968  pos= pos_limit;
1969  start_pos= pos;
1970 
1971  ts = ff_read_timestamp(s, stream_index, &pos, INT64_MAX, read_timestamp); //may pass pos_limit instead of -1
1972  if(pos == pos_max)
1973  no_change++;
1974  else
1975  no_change=0;
1976  av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %s %s %s target:%s limit:%"PRId64" start:%"PRId64" noc:%d\n",
1977  pos_min, pos, pos_max,
1978  av_ts2str(ts_min), av_ts2str(ts), av_ts2str(ts_max), av_ts2str(target_ts),
1979  pos_limit, start_pos, no_change);
1980  if(ts == AV_NOPTS_VALUE){
1981  av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1982  return -1;
1983  }
1984  assert(ts != AV_NOPTS_VALUE);
1985  if (target_ts <= ts) {
1986  pos_limit = start_pos - 1;
1987  pos_max = pos;
1988  ts_max = ts;
1989  }
1990  if (target_ts >= ts) {
1991  pos_min = pos;
1992  ts_min = ts;
1993  }
1994  }
1995 
1996  pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1997  ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1998 #if 0
1999  pos_min = pos;
2000  ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2001  pos_min++;
2002  ts_max = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
2003  av_dlog(s, "pos=0x%"PRIx64" %s<=%s<=%s\n",
2004  pos, av_ts2str(ts_min), av_ts2str(target_ts), av_ts2str(ts_max));
2005 #endif
2006  *ts_ret= ts;
2007  return pos;
2008 }
2009 
2010 static int seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
2011  int64_t pos_min, pos_max;
2012 
2013  pos_min = s->data_offset;
2014  pos_max = avio_size(s->pb) - 1;
2015 
2016  if (pos < pos_min) pos= pos_min;
2017  else if(pos > pos_max) pos= pos_max;
2018 
2019  avio_seek(s->pb, pos, SEEK_SET);
2020 
2021  s->io_repositioned = 1;
2022 
2023  return 0;
2024 }
2025 
2027  int stream_index, int64_t timestamp, int flags)
2028 {
2029  int index;
2030  int64_t ret;
2031  AVStream *st;
2032  AVIndexEntry *ie;
2033 
2034  st = s->streams[stream_index];
2035 
2036  index = av_index_search_timestamp(st, timestamp, flags);
2037 
2038  if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
2039  return -1;
2040 
2041  if(index < 0 || index==st->nb_index_entries-1){
2042  AVPacket pkt;
2043  int nonkey=0;
2044 
2045  if(st->nb_index_entries){
2047  ie= &st->index_entries[st->nb_index_entries-1];
2048  if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2049  return ret;
2050  ff_update_cur_dts(s, st, ie->timestamp);
2051  }else{
2052  if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
2053  return ret;
2054  }
2055  for (;;) {
2056  int read_status;
2057  do{
2058  read_status = av_read_frame(s, &pkt);
2059  } while (read_status == AVERROR(EAGAIN));
2060  if (read_status < 0)
2061  break;
2062  av_free_packet(&pkt);
2063  if(stream_index == pkt.stream_index && pkt.dts > timestamp){
2064  if(pkt.flags & AV_PKT_FLAG_KEY)
2065  break;
2066  if(nonkey++ > 1000 && st->codec->codec_id != AV_CODEC_ID_CDGRAPHICS){
2067  av_log(s, AV_LOG_ERROR,"seek_frame_generic failed as this stream seems to contain no keyframes after the target timestamp, %d non keyframes found\n", nonkey);
2068  break;
2069  }
2070  }
2071  }
2072  index = av_index_search_timestamp(st, timestamp, flags);
2073  }
2074  if (index < 0)
2075  return -1;
2076 
2078  if (s->iformat->read_seek){
2079  if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
2080  return 0;
2081  }
2082  ie = &st->index_entries[index];
2083  if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
2084  return ret;
2085  ff_update_cur_dts(s, st, ie->timestamp);
2086 
2087  return 0;
2088 }
2089 
2090 static int seek_frame_internal(AVFormatContext *s, int stream_index,
2091  int64_t timestamp, int flags)
2092 {
2093  int ret;
2094  AVStream *st;
2095 
2096  if (flags & AVSEEK_FLAG_BYTE) {
2097  if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
2098  return -1;
2100  return seek_frame_byte(s, stream_index, timestamp, flags);
2101  }
2102 
2103  if(stream_index < 0){
2104  stream_index= av_find_default_stream_index(s);
2105  if(stream_index < 0)
2106  return -1;
2107 
2108  st= s->streams[stream_index];
2109  /* timestamp for default must be expressed in AV_TIME_BASE units */
2110  timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
2111  }
2112 
2113  /* first, we try the format specific seek */
2114  if (s->iformat->read_seek) {
2116  ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
2117  } else
2118  ret = -1;
2119  if (ret >= 0) {
2120  return 0;
2121  }
2122 
2123  if (s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
2125  return ff_seek_frame_binary(s, stream_index, timestamp, flags);
2126  } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
2128  return seek_frame_generic(s, stream_index, timestamp, flags);
2129  }
2130  else
2131  return -1;
2132 }
2133 
2134 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
2135 {
2136  int ret;
2137 
2138  if (s->iformat->read_seek2 && !s->iformat->read_seek) {
2139  int64_t min_ts = INT64_MIN, max_ts = INT64_MAX;
2140  if ((flags & AVSEEK_FLAG_BACKWARD))
2141  max_ts = timestamp;
2142  else
2143  min_ts = timestamp;
2144  return avformat_seek_file(s, stream_index, min_ts, timestamp, max_ts,
2145  flags & ~AVSEEK_FLAG_BACKWARD);
2146  }
2147 
2148  ret = seek_frame_internal(s, stream_index, timestamp, flags);
2149 
2150  if (ret >= 0)
2152 
2153  return ret;
2154 }
2155 
2156 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
2157 {
2158  if(min_ts > ts || max_ts < ts)
2159  return -1;
2160  if (stream_index < -1 || stream_index >= (int)s->nb_streams)
2161  return AVERROR(EINVAL);
2162 
2163  if(s->seek2any>0)
2164  flags |= AVSEEK_FLAG_ANY;
2165  flags &= ~AVSEEK_FLAG_BACKWARD;
2166 
2167  if (s->iformat->read_seek2) {
2168  int ret;
2170 
2171  if (stream_index == -1 && s->nb_streams == 1) {
2172  AVRational time_base = s->streams[0]->time_base;
2173  ts = av_rescale_q(ts, AV_TIME_BASE_Q, time_base);
2174  min_ts = av_rescale_rnd(min_ts, time_base.den,
2175  time_base.num * (int64_t)AV_TIME_BASE,
2177  max_ts = av_rescale_rnd(max_ts, time_base.den,
2178  time_base.num * (int64_t)AV_TIME_BASE,
2180  }
2181 
2182  ret = s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
2183 
2184  if (ret >= 0)
2186  return ret;
2187  }
2188 
2189  if(s->iformat->read_timestamp){
2190  //try to seek via read_timestamp()
2191  }
2192 
2193  // Fall back on old API if new is not implemented but old is.
2194  // Note the old API has somewhat different semantics.
2195  if (s->iformat->read_seek || 1) {
2196  int dir = (ts - (uint64_t)min_ts > (uint64_t)max_ts - ts ? AVSEEK_FLAG_BACKWARD : 0);
2197  int ret = av_seek_frame(s, stream_index, ts, flags | dir);
2198  if (ret<0 && ts != min_ts && max_ts != ts) {
2199  ret = av_seek_frame(s, stream_index, dir ? max_ts : min_ts, flags | dir);
2200  if (ret >= 0)
2201  ret = av_seek_frame(s, stream_index, ts, flags | (dir^AVSEEK_FLAG_BACKWARD));
2202  }
2203  return ret;
2204  }
2205 
2206  // try some generic seek like seek_frame_generic() but with new ts semantics
2207  return -1; //unreachable
2208 }
2209 
2210 /*******************************************************/
2211 
2212 /**
2213  * Return TRUE if the stream has accurate duration in any stream.
2214  *
2215  * @return TRUE if the stream has accurate duration for at least one component.
2216  */
2218 {
2219  int i;
2220  AVStream *st;
2221 
2222  for(i = 0;i < ic->nb_streams; i++) {
2223  st = ic->streams[i];
2224  if (st->duration != AV_NOPTS_VALUE)
2225  return 1;
2226  }
2227  if (ic->duration != AV_NOPTS_VALUE)
2228  return 1;
2229  return 0;
2230 }
2231 
2232 /**
2233  * Estimate the stream timings from the one of each components.
2234  *
2235  * Also computes the global bitrate if possible.
2236  */
2238 {
2239  int64_t start_time, start_time1, start_time_text, end_time, end_time1;
2240  int64_t duration, duration1, filesize;
2241  int i;
2242  AVStream *st;
2243  AVProgram *p;
2244 
2245  start_time = INT64_MAX;
2246  start_time_text = INT64_MAX;
2247  end_time = INT64_MIN;
2248  duration = INT64_MIN;
2249  for(i = 0;i < ic->nb_streams; i++) {
2250  st = ic->streams[i];
2251  if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
2252  start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
2254  if (start_time1 < start_time_text)
2255  start_time_text = start_time1;
2256  } else
2257  start_time = FFMIN(start_time, start_time1);
2258  end_time1 = AV_NOPTS_VALUE;
2259  if (st->duration != AV_NOPTS_VALUE) {
2260  end_time1 = start_time1
2262  end_time = FFMAX(end_time, end_time1);
2263  }
2264  for(p = NULL; (p = av_find_program_from_stream(ic, p, i)); ){
2265  if(p->start_time == AV_NOPTS_VALUE || p->start_time > start_time1)
2266  p->start_time = start_time1;
2267  if(p->end_time < end_time1)
2268  p->end_time = end_time1;
2269  }
2270  }
2271  if (st->duration != AV_NOPTS_VALUE) {
2272  duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
2273  duration = FFMAX(duration, duration1);
2274  }
2275  }
2276  if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
2277  start_time = start_time_text;
2278  else if(start_time > start_time_text)
2279  av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream starttime %f\n", start_time_text / (float)AV_TIME_BASE);
2280 
2281  if (start_time != INT64_MAX) {
2282  ic->start_time = start_time;
2283  if (end_time != INT64_MIN) {
2284  if (ic->nb_programs) {
2285  for (i=0; i<ic->nb_programs; i++) {
2286  p = ic->programs[i];
2287  if(p->start_time != AV_NOPTS_VALUE && p->end_time > p->start_time)
2288  duration = FFMAX(duration, p->end_time - p->start_time);
2289  }
2290  } else
2291  duration = FFMAX(duration, end_time - start_time);
2292  }
2293  }
2294  if (duration != INT64_MIN && duration > 0 && ic->duration == AV_NOPTS_VALUE) {
2295  ic->duration = duration;
2296  }
2297  if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration != AV_NOPTS_VALUE) {
2298  /* compute the bitrate */
2299  double bitrate = (double)filesize * 8.0 * AV_TIME_BASE /
2300  (double)ic->duration;
2301  if (bitrate >= 0 && bitrate <= INT_MAX)
2302  ic->bit_rate = bitrate;
2303  }
2304 }
2305 
2307 {
2308  int i;
2309  AVStream *st;
2310 
2312  for(i = 0;i < ic->nb_streams; i++) {
2313  st = ic->streams[i];
2314  if (st->start_time == AV_NOPTS_VALUE) {
2315  if(ic->start_time != AV_NOPTS_VALUE)
2317  if(ic->duration != AV_NOPTS_VALUE)
2319  }
2320  }
2321 }
2322 
2324 {
2325  int64_t filesize, duration;
2326  int bit_rate, i, show_warning = 0;
2327  AVStream *st;
2328 
2329  /* if bit_rate is already set, we believe it */
2330  if (ic->bit_rate <= 0) {
2331  bit_rate = 0;
2332  for(i=0;i<ic->nb_streams;i++) {
2333  st = ic->streams[i];
2334  if (st->codec->bit_rate > 0)
2335  bit_rate += st->codec->bit_rate;
2336  }
2337  ic->bit_rate = bit_rate;
2338  }
2339 
2340  /* if duration is already set, we believe it */
2341  if (ic->duration == AV_NOPTS_VALUE &&
2342  ic->bit_rate != 0) {
2343  filesize = ic->pb ? avio_size(ic->pb) : 0;
2344  if (filesize > 0) {
2345  for(i = 0; i < ic->nb_streams; i++) {
2346  st = ic->streams[i];
2347  if ( st->time_base.num <= INT64_MAX / ic->bit_rate
2348  && st->duration == AV_NOPTS_VALUE) {
2349  duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
2350  st->duration = duration;
2351  show_warning = 1;
2352  }
2353  }
2354  }
2355  }
2356  if (show_warning)
2357  av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2358 }
2359 
2360 #define DURATION_MAX_READ_SIZE 250000LL
2361 #define DURATION_MAX_RETRY 4
2362 
2363 /* only usable for MPEG-PS streams */
2364 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
2365 {
2366  AVPacket pkt1, *pkt = &pkt1;
2367  AVStream *st;
2368  int read_size, i, ret;
2369  int64_t end_time;
2370  int64_t filesize, offset, duration;
2371  int retry=0;
2372 
2373  /* flush packet queue */
2374  flush_packet_queue(ic);
2375 
2376  for (i=0; i<ic->nb_streams; i++) {
2377  st = ic->streams[i];
2378  if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
2379  av_log(st->codec, AV_LOG_WARNING, "start time is not set in estimate_timings_from_pts\n");
2380 
2381  if (st->parser) {
2382  av_parser_close(st->parser);
2383  st->parser= NULL;
2384  }
2385  }
2386 
2387  /* estimate the end time (duration) */
2388  /* XXX: may need to support wrapping */
2389  filesize = ic->pb ? avio_size(ic->pb) : 0;
2390  end_time = AV_NOPTS_VALUE;
2391  do{
2392  offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
2393  if (offset < 0)
2394  offset = 0;
2395 
2396  avio_seek(ic->pb, offset, SEEK_SET);
2397  read_size = 0;
2398  for(;;) {
2399  if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
2400  break;
2401 
2402  do {
2403  ret = ff_read_packet(ic, pkt);
2404  } while(ret == AVERROR(EAGAIN));
2405  if (ret != 0)
2406  break;
2407  read_size += pkt->size;
2408  st = ic->streams[pkt->stream_index];
2409  if (pkt->pts != AV_NOPTS_VALUE &&
2410  (st->start_time != AV_NOPTS_VALUE ||
2411  st->first_dts != AV_NOPTS_VALUE)) {
2412  duration = end_time = pkt->pts;
2413  if (st->start_time != AV_NOPTS_VALUE)
2414  duration -= st->start_time;
2415  else
2416  duration -= st->first_dts;
2417  if (duration > 0) {
2418  if (st->duration == AV_NOPTS_VALUE || st->info->last_duration<=0 ||
2419  (st->duration < duration && FFABS(duration - st->info->last_duration) < 60LL*st->time_base.den / st->time_base.num))
2420  st->duration = duration;
2421  st->info->last_duration = duration;
2422  }
2423  }
2424  av_free_packet(pkt);
2425  }
2426  }while( end_time==AV_NOPTS_VALUE
2427  && filesize > (DURATION_MAX_READ_SIZE<<retry)
2428  && ++retry <= DURATION_MAX_RETRY);
2429 
2431 
2432  avio_seek(ic->pb, old_offset, SEEK_SET);
2433  for (i=0; i<ic->nb_streams; i++) {
2434  st= ic->streams[i];
2435  st->cur_dts= st->first_dts;
2438  }
2439 }
2440 
2441 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
2442 {
2443  int64_t file_size;
2444 
2445  /* get the file size, if possible */
2446  if (ic->iformat->flags & AVFMT_NOFILE) {
2447  file_size = 0;
2448  } else {
2449  file_size = avio_size(ic->pb);
2450  file_size = FFMAX(0, file_size);
2451  }
2452 
2453  if ((!strcmp(ic->iformat->name, "mpeg") ||
2454  !strcmp(ic->iformat->name, "mpegts")) &&
2455  file_size && ic->pb->seekable) {
2456  /* get accurate estimate from the PTSes */
2457  estimate_timings_from_pts(ic, old_offset);
2459  } else if (has_duration(ic)) {
2460  /* at least one component has timings - we use them for all
2461  the components */
2464  } else {
2465  /* less precise: use bitrate info */
2468  }
2470 
2471  {
2472  int i;
2473  AVStream av_unused *st;
2474  for(i = 0;i < ic->nb_streams; i++) {
2475  st = ic->streams[i];
2476  av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
2477  (double) st->start_time / AV_TIME_BASE,
2478  (double) st->duration / AV_TIME_BASE);
2479  }
2480  av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2481  (double) ic->start_time / AV_TIME_BASE,
2482  (double) ic->duration / AV_TIME_BASE,
2483  ic->bit_rate / 1000);
2484  }
2485 }
2486 
2487 static int has_codec_parameters(AVStream *st, const char **errmsg_ptr)
2488 {
2489  AVCodecContext *avctx = st->codec;
2490 
2491 #define FAIL(errmsg) do { \
2492  if (errmsg_ptr) \
2493  *errmsg_ptr = errmsg; \
2494  return 0; \
2495  } while (0)
2496 
2497  switch (avctx->codec_type) {
2498  case AVMEDIA_TYPE_AUDIO:
2499  if (!avctx->frame_size && determinable_frame_size(avctx))
2500  FAIL("unspecified frame size");
2501  if (st->info->found_decoder >= 0 && avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
2502  FAIL("unspecified sample format");
2503  if (!avctx->sample_rate)
2504  FAIL("unspecified sample rate");
2505  if (!avctx->channels)
2506  FAIL("unspecified number of channels");
2507  if (st->info->found_decoder >= 0 && !st->nb_decoded_frames && avctx->codec_id == AV_CODEC_ID_DTS)
2508  FAIL("no decodable DTS frames");
2509  break;
2510  case AVMEDIA_TYPE_VIDEO:
2511  if (!avctx->width)
2512  FAIL("unspecified size");
2513  if (st->info->found_decoder >= 0 && avctx->pix_fmt == AV_PIX_FMT_NONE)
2514  FAIL("unspecified pixel format");
2517  FAIL("no frame in rv30/40 and no sar");
2518  break;
2519  case AVMEDIA_TYPE_SUBTITLE:
2520  if (avctx->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE && !avctx->width)
2521  FAIL("unspecified size");
2522  break;
2523  case AVMEDIA_TYPE_DATA:
2524  if(avctx->codec_id == AV_CODEC_ID_NONE) return 1;
2525  }
2526 
2527  if (avctx->codec_id == AV_CODEC_ID_NONE)
2528  FAIL("unknown codec");
2529  return 1;
2530 }
2531 
2532 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
2534 {
2535  const AVCodec *codec;
2536  int got_picture = 1, ret = 0;
2538  AVSubtitle subtitle;
2539  AVPacket pkt = *avpkt;
2540 
2541  if (!frame)
2542  return AVERROR(ENOMEM);
2543 
2544  if (!avcodec_is_open(st->codec) && !st->info->found_decoder) {
2545  AVDictionary *thread_opt = NULL;
2546 
2547  codec = st->codec->codec ? st->codec->codec :
2549 
2550  if (!codec) {
2551  st->info->found_decoder = -1;
2552  ret = -1;
2553  goto fail;
2554  }
2555 
2556  /* force thread count to 1 since the h264 decoder will not extract SPS
2557  * and PPS to extradata during multi-threaded decoding */
2558  av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
2559  ret = avcodec_open2(st->codec, codec, options ? options : &thread_opt);
2560  if (!options)
2561  av_dict_free(&thread_opt);
2562  if (ret < 0) {
2563  st->info->found_decoder = -1;
2564  goto fail;
2565  }
2566  st->info->found_decoder = 1;
2567  } else if (!st->info->found_decoder)
2568  st->info->found_decoder = 1;
2569 
2570  if (st->info->found_decoder < 0) {
2571  ret = -1;
2572  goto fail;
2573  }
2574 
2575  while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
2576  ret >= 0 &&
2577  (!has_codec_parameters(st, NULL) ||
2580  got_picture = 0;
2582  switch(st->codec->codec_type) {
2583  case AVMEDIA_TYPE_VIDEO:
2584  ret = avcodec_decode_video2(st->codec, frame,
2585  &got_picture, &pkt);
2586  break;
2587  case AVMEDIA_TYPE_AUDIO:
2588  ret = avcodec_decode_audio4(st->codec, frame, &got_picture, &pkt);
2589  break;
2590  case AVMEDIA_TYPE_SUBTITLE:
2591  ret = avcodec_decode_subtitle2(st->codec, &subtitle,
2592  &got_picture, &pkt);
2593  ret = pkt.size;
2594  break;
2595  default:
2596  break;
2597  }
2598  if (ret >= 0) {
2599  if (got_picture)
2600  st->nb_decoded_frames++;
2601  pkt.data += ret;
2602  pkt.size -= ret;
2603  ret = got_picture;
2604  }
2605  }
2606 
2607  if(!pkt.data && !got_picture)
2608  ret = -1;
2609 
2610 fail:
2611  avcodec_free_frame(&frame);
2612  return ret;
2613 }
2614 
2615 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id)
2616 {
2617  while (tags->id != AV_CODEC_ID_NONE) {
2618  if (tags->id == id)
2619  return tags->tag;
2620  tags++;
2621  }
2622  return 0;
2623 }
2624 
2625 enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2626 {
2627  int i;
2628  for(i=0; tags[i].id != AV_CODEC_ID_NONE;i++) {
2629  if(tag == tags[i].tag)
2630  return tags[i].id;
2631  }
2632  for(i=0; tags[i].id != AV_CODEC_ID_NONE; i++) {
2633  if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
2634  return tags[i].id;
2635  }
2636  return AV_CODEC_ID_NONE;
2637 }
2638 
2639 enum AVCodecID ff_get_pcm_codec_id(int bps, int flt, int be, int sflags)
2640 {
2641  if (flt) {
2642  switch (bps) {
2643  case 32: return be ? AV_CODEC_ID_PCM_F32BE : AV_CODEC_ID_PCM_F32LE;
2644  case 64: return be ? AV_CODEC_ID_PCM_F64BE : AV_CODEC_ID_PCM_F64LE;
2645  default: return AV_CODEC_ID_NONE;
2646  }
2647  } else {
2648  bps += 7;
2649  bps >>= 3;
2650  if (sflags & (1 << (bps - 1))) {
2651  switch (bps) {
2652  case 1: return AV_CODEC_ID_PCM_S8;
2653  case 2: return be ? AV_CODEC_ID_PCM_S16BE : AV_CODEC_ID_PCM_S16LE;
2654  case 3: return be ? AV_CODEC_ID_PCM_S24BE : AV_CODEC_ID_PCM_S24LE;
2655  case 4: return be ? AV_CODEC_ID_PCM_S32BE : AV_CODEC_ID_PCM_S32LE;
2656  default: return AV_CODEC_ID_NONE;
2657  }
2658  } else {
2659  switch (bps) {
2660  case 1: return AV_CODEC_ID_PCM_U8;
2661  case 2: return be ? AV_CODEC_ID_PCM_U16BE : AV_CODEC_ID_PCM_U16LE;
2662  case 3: return be ? AV_CODEC_ID_PCM_U24BE : AV_CODEC_ID_PCM_U24LE;
2663  case 4: return be ? AV_CODEC_ID_PCM_U32BE : AV_CODEC_ID_PCM_U32LE;
2664  default: return AV_CODEC_ID_NONE;
2665  }
2666  }
2667  }
2668 }
2669 
2670 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum AVCodecID id)
2671 {
2672  unsigned int tag;
2673  if (!av_codec_get_tag2(tags, id, &tag))
2674  return 0;
2675  return tag;
2676 }
2677 
2678 int av_codec_get_tag2(const AVCodecTag * const *tags, enum AVCodecID id,
2679  unsigned int *tag)
2680 {
2681  int i;
2682  for(i=0; tags && tags[i]; i++){
2683  const AVCodecTag *codec_tags = tags[i];
2684  while (codec_tags->id != AV_CODEC_ID_NONE) {
2685  if (codec_tags->id == id) {
2686  *tag = codec_tags->tag;
2687  return 1;
2688  }
2689  codec_tags++;
2690  }
2691  }
2692  return 0;
2693 }
2694 
2695 enum AVCodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2696 {
2697  int i;
2698  for(i=0; tags && tags[i]; i++){
2699  enum AVCodecID id= ff_codec_get_id(tags[i], tag);
2700  if(id!=AV_CODEC_ID_NONE) return id;
2701  }
2702  return AV_CODEC_ID_NONE;
2703 }
2704 
2706 {
2707  unsigned int i, j;
2708  int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2709 
2710  for (i = 0; i < s->nb_chapters; i++)
2711  if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2712  AVChapter *ch = s->chapters[i];
2713  int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2714  : INT64_MAX;
2715 
2716  for (j = 0; j < s->nb_chapters; j++) {
2717  AVChapter *ch1 = s->chapters[j];
2718  int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2719  if (j != i && next_start > ch->start && next_start < end)
2720  end = next_start;
2721  }
2722  ch->end = (end == INT64_MAX) ? ch->start : end;
2723  }
2724 }
2725 
2726 static int get_std_framerate(int i){
2727  if(i<60*12) return (i+1)*1001;
2728  else return ((const int[]){24,30,60,12,15,48})[i-60*12]*1000*12;
2729 }
2730 
2731 /*
2732  * Is the time base unreliable.
2733  * This is a heuristic to balance between quick acceptance of the values in
2734  * the headers vs. some extra checks.
2735  * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2736  * MPEG-2 commonly misuses field repeat flags to store different framerates.
2737  * And there are "variable" fps files this needs to detect as well.
2738  */
2740  if( c->time_base.den >= 101L*c->time_base.num
2741  || c->time_base.den < 5L*c->time_base.num
2742 /* || c->codec_tag == AV_RL32("DIVX")
2743  || c->codec_tag == AV_RL32("XVID")*/
2744  || c->codec_tag == AV_RL32("mp4v")
2746  || c->codec_id == AV_CODEC_ID_H264
2747  )
2748  return 1;
2749  return 0;
2750 }
2751 
2752 #if FF_API_FORMAT_PARAMETERS
2753 int av_find_stream_info(AVFormatContext *ic)
2754 {
2755  return avformat_find_stream_info(ic, NULL);
2756 }
2757 #endif
2758 
2760 {
2761  int i, count, ret, j;
2762  int64_t read_size;
2763  AVStream *st;
2764  AVPacket pkt1, *pkt;
2765  int64_t old_offset = avio_tell(ic->pb);
2766  int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those
2767  int flush_codecs = ic->probesize > 0;
2768 
2769  if(ic->pb)
2770  av_log(ic, AV_LOG_DEBUG, "File position before avformat_find_stream_info() is %"PRId64"\n", avio_tell(ic->pb));
2771 
2772  for(i=0;i<ic->nb_streams;i++) {
2773  const AVCodec *codec;
2774  AVDictionary *thread_opt = NULL;
2775  st = ic->streams[i];
2776 
2777  if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2779 /* if(!st->time_base.num)
2780  st->time_base= */
2781  if(!st->codec->time_base.num)
2782  st->codec->time_base= st->time_base;
2783  }
2784  //only for the split stuff
2785  if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2786  st->parser = av_parser_init(st->codec->codec_id);
2787  if(st->parser){
2790  } else if(st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
2792  }
2793  } else if (st->need_parsing) {
2794  av_log(ic, AV_LOG_VERBOSE, "parser not found for codec "
2795  "%s, packets or times may be invalid.\n",
2797  }
2798  }
2799  codec = st->codec->codec ? st->codec->codec :
2801 
2802  /* force thread count to 1 since the h264 decoder will not extract SPS
2803  * and PPS to extradata during multi-threaded decoding */
2804  av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
2805 
2806  /* Ensure that subtitle_header is properly set. */
2808  && codec && !st->codec->codec)
2809  avcodec_open2(st->codec, codec, options ? &options[i]
2810  : &thread_opt);
2811 
2812  //try to just open decoders, in case this is enough to get parameters
2813  if (!has_codec_parameters(st, NULL) && st->request_probe <= 0) {
2814  if (codec && !st->codec->codec)
2815  avcodec_open2(st->codec, codec, options ? &options[i]
2816  : &thread_opt);
2817  }
2818  if (!options)
2819  av_dict_free(&thread_opt);
2820  }
2821 
2822  for (i=0; i<ic->nb_streams; i++) {
2823 #if FF_API_R_FRAME_RATE
2824  ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2825 #endif
2828  }
2829 
2830  count = 0;
2831  read_size = 0;
2832  for(;;) {
2834  ret= AVERROR_EXIT;
2835  av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2836  break;
2837  }
2838 
2839  /* check if one codec still needs to be handled */
2840  for(i=0;i<ic->nb_streams;i++) {
2841  int fps_analyze_framecount = 20;
2842 
2843  st = ic->streams[i];
2844  if (!has_codec_parameters(st, NULL))
2845  break;
2846  /* if the timebase is coarse (like the usual millisecond precision
2847  of mkv), we need to analyze more frames to reliably arrive at
2848  the correct fps */
2849  if (av_q2d(st->time_base) > 0.0005)
2850  fps_analyze_framecount *= 2;
2851  if (ic->fps_probe_size >= 0)
2852  fps_analyze_framecount = ic->fps_probe_size;
2854  fps_analyze_framecount = 0;
2855  /* variable fps and no guess at the real fps */
2856  if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2857  && st->info->duration_count < fps_analyze_framecount
2858  && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2859  break;
2860  if(st->parser && st->parser->parser->split && !st->codec->extradata)
2861  break;
2862  if (st->first_dts == AV_NOPTS_VALUE &&
2863  (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2865  break;
2866  }
2867  if (i == ic->nb_streams) {
2868  /* NOTE: if the format has no header, then we need to read
2869  some packets to get most of the streams, so we cannot
2870  stop here */
2871  if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2872  /* if we found the info for all the codecs, we can stop */
2873  ret = count;
2874  av_log(ic, AV_LOG_DEBUG, "All info found\n");
2875  flush_codecs = 0;
2876  break;
2877  }
2878  }
2879  /* we did not get all the codec info, but we read too much data */
2880  if (read_size >= ic->probesize) {
2881  ret = count;
2882  av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit of %d bytes reached\n", ic->probesize);
2883  for (i = 0; i < ic->nb_streams; i++)
2884  if (!ic->streams[i]->r_frame_rate.num &&
2885  ic->streams[i]->info->duration_count <= 1)
2886  av_log(ic, AV_LOG_WARNING,
2887  "Stream #%d: not enough frames to estimate rate; "
2888  "consider increasing probesize\n", i);
2889  break;
2890  }
2891 
2892  /* NOTE: a new stream can be added there if no header in file
2893  (AVFMTCTX_NOHEADER) */
2894  ret = read_frame_internal(ic, &pkt1);
2895  if (ret == AVERROR(EAGAIN))
2896  continue;
2897 
2898  if (ret < 0) {
2899  /* EOF or error*/
2900  break;
2901  }
2902 
2903  if (ic->flags & AVFMT_FLAG_NOBUFFER) {
2904  pkt = &pkt1;
2905  } else {
2906  pkt = add_to_pktbuf(&ic->packet_buffer, &pkt1,
2907  &ic->packet_buffer_end);
2908  if ((ret = av_dup_packet(pkt)) < 0)
2909  goto find_stream_info_err;
2910  }
2911 
2912  read_size += pkt->size;
2913 
2914  st = ic->streams[pkt->stream_index];
2915  if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
2916  /* check for non-increasing dts */
2917  if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
2918  st->info->fps_last_dts >= pkt->dts) {
2919  av_log(ic, AV_LOG_DEBUG, "Non-increasing DTS in stream %d: "
2920  "packet %d with DTS %"PRId64", packet %d with DTS "
2921  "%"PRId64"\n", st->index, st->info->fps_last_dts_idx,
2922  st->info->fps_last_dts, st->codec_info_nb_frames, pkt->dts);
2924  }
2925  /* check for a discontinuity in dts - if the difference in dts
2926  * is more than 1000 times the average packet duration in the sequence,
2927  * we treat it as a discontinuity */
2928  if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
2930  (pkt->dts - st->info->fps_last_dts) / 1000 >
2932  av_log(ic, AV_LOG_WARNING, "DTS discontinuity in stream %d: "
2933  "packet %d with DTS %"PRId64", packet %d with DTS "
2934  "%"PRId64"\n", st->index, st->info->fps_last_dts_idx,
2935  st->info->fps_last_dts, st->codec_info_nb_frames, pkt->dts);
2937  }
2938 
2939  /* update stored dts values */
2940  if (st->info->fps_first_dts == AV_NOPTS_VALUE) {
2941  st->info->fps_first_dts = pkt->dts;
2943  }
2944  st->info->fps_last_dts = pkt->dts;
2946  }
2947  if (st->codec_info_nb_frames>1) {
2948  int64_t t=0;
2949  if (st->time_base.den > 0)
2951  if (st->avg_frame_rate.num > 0)
2953 
2954  if (t >= ic->max_analyze_duration) {
2955  av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached at %"PRId64" microseconds\n", ic->max_analyze_duration, t);
2956  break;
2957  }
2958  if (pkt->duration) {
2959  st->info->codec_info_duration += pkt->duration;
2960  st->info->codec_info_duration_fields += st->parser && st->codec->ticks_per_frame==2 ? st->parser->repeat_pict + 1 : 2;
2961  }
2962  }
2963 #if FF_API_R_FRAME_RATE
2964  {
2965  int64_t last = st->info->last_dts;
2966 
2967  if( pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && pkt->dts > last
2968  && pkt->dts - (uint64_t)last < INT64_MAX){
2969  double dts= (is_relative(pkt->dts) ? pkt->dts - RELATIVE_TS_BASE : pkt->dts) * av_q2d(st->time_base);
2970  int64_t duration= pkt->dts - last;
2971 
2972  if (!st->info->duration_error)
2973  st->info->duration_error = av_mallocz(sizeof(st->info->duration_error[0])*2);
2974 
2975 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2976 // av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
2977  for (i=0; i<MAX_STD_TIMEBASES; i++) {
2978  int framerate= get_std_framerate(i);
2979  double sdts= dts*framerate/(1001*12);
2980  for(j=0; j<2; j++){
2981  int64_t ticks= llrint(sdts+j*0.5);
2982  double error= sdts - ticks + j*0.5;
2983  st->info->duration_error[j][0][i] += error;
2984  st->info->duration_error[j][1][i] += error*error;
2985  }
2986  }
2987  st->info->duration_count++;
2988  // ignore the first 4 values, they might have some random jitter
2989  if (st->info->duration_count > 3 && is_relative(pkt->dts) == is_relative(last))
2990  st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2991  }
2992  if (pkt->dts != AV_NOPTS_VALUE)
2993  st->info->last_dts = pkt->dts;
2994  }
2995 #endif
2996  if(st->parser && st->parser->parser->split && !st->codec->extradata){
2997  int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2998  if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) {
2999  st->codec->extradata_size= i;
3001  if (!st->codec->extradata)
3002  return AVERROR(ENOMEM);
3003  memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
3004  memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
3005  }
3006  }
3007 
3008  /* if still no information, we try to open the codec and to
3009  decompress the frame. We try to avoid that in most cases as
3010  it takes longer and uses more memory. For MPEG-4, we need to
3011  decompress for QuickTime.
3012 
3013  If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
3014  least one frame of codec data, this makes sure the codec initializes
3015  the channel configuration and does not only trust the values from the container.
3016  */
3017  try_decode_frame(st, pkt, (options && i < orig_nb_streams ) ? &options[i] : NULL);
3018 
3019  st->codec_info_nb_frames++;
3020  count++;
3021  }
3022 
3023  if (flush_codecs) {
3024  AVPacket empty_pkt = { 0 };
3025  int err = 0;
3026  av_init_packet(&empty_pkt);
3027 
3028  ret = -1; /* we could not have all the codec parameters before EOF */
3029  for(i=0;i<ic->nb_streams;i++) {
3030  const char *errmsg;
3031 
3032  st = ic->streams[i];
3033 
3034  /* flush the decoders */
3035  if (st->info->found_decoder == 1) {
3036  do {
3037  err = try_decode_frame(st, &empty_pkt,
3038  (options && i < orig_nb_streams) ?
3039  &options[i] : NULL);
3040  } while (err > 0 && !has_codec_parameters(st, NULL));
3041 
3042  if (err < 0) {
3043  av_log(ic, AV_LOG_INFO,
3044  "decoding for stream %d failed\n", st->index);
3045  }
3046  }
3047 
3048  if (!has_codec_parameters(st, &errmsg)) {
3049  char buf[256];
3050  avcodec_string(buf, sizeof(buf), st->codec, 0);
3051  av_log(ic, AV_LOG_WARNING,
3052  "Could not find codec parameters for stream %d (%s): %s\n"
3053  "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
3054  i, buf, errmsg);
3055  } else {
3056  ret = 0;
3057  }
3058  }
3059  }
3060 
3061  // close codecs which were opened in try_decode_frame()
3062  for(i=0;i<ic->nb_streams;i++) {
3063  st = ic->streams[i];
3064  avcodec_close(st->codec);
3065  }
3066  for(i=0;i<ic->nb_streams;i++) {
3067  st = ic->streams[i];
3068  if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
3072  st->codec->codec_tag= tag;
3073  }
3074 
3075  /* estimate average framerate if not set by demuxer */
3077  int best_fps = 0;
3078  double best_error = 0.01;
3079 
3081  st->info->codec_info_duration_fields*(int64_t)st->time_base.den,
3082  st->info->codec_info_duration*2*(int64_t)st->time_base.num, 60000);
3083 
3084  /* round guessed framerate to a "standard" framerate if it's
3085  * within 1% of the original estimate*/
3086  for (j = 1; j < MAX_STD_TIMEBASES; j++) {
3087  AVRational std_fps = { get_std_framerate(j), 12*1001 };
3088  double error = fabs(av_q2d(st->avg_frame_rate) / av_q2d(std_fps) - 1);
3089 
3090  if (error < best_error) {
3091  best_error = error;
3092  best_fps = std_fps.num;
3093  }
3094  }
3095  if (best_fps) {
3097  best_fps, 12*1001, INT_MAX);
3098  }
3099  }
3100  // the check for tb_unreliable() is not completely correct, since this is not about handling
3101  // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
3102  // ipmovie.c produces.
3103  if (tb_unreliable(st->codec) && st->info->duration_count > 15 && st->info->duration_gcd > FFMAX(1, st->time_base.den/(500LL*st->time_base.num)) && !st->r_frame_rate.num)
3104  av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, st->time_base.den, st->time_base.num * st->info->duration_gcd, INT_MAX);
3105  if (st->info->duration_count>1 && !st->r_frame_rate.num
3106  && tb_unreliable(st->codec)) {
3107  int num = 0;
3108  double best_error= 0.01;
3109 
3110  for (j=0; j<MAX_STD_TIMEBASES; j++) {
3111  int k;
3112 
3113  if(st->info->codec_info_duration && st->info->codec_info_duration*av_q2d(st->time_base) < (1001*12.0)/get_std_framerate(j))
3114  continue;
3115  if(!st->info->codec_info_duration && 1.0 < (1001*12.0)/get_std_framerate(j))
3116  continue;
3117  for(k=0; k<2; k++){
3118  int n= st->info->duration_count;
3119  double a= st->info->duration_error[k][0][j] / n;
3120  double error= st->info->duration_error[k][1][j]/n - a*a;
3121 
3122  if(error < best_error && best_error> 0.000000001){
3123  best_error= error;
3124  num = get_std_framerate(j);
3125  }
3126  if(error < 0.02)
3127  av_log(NULL, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
3128  }
3129  }
3130  // do not increase frame rate by more than 1 % in order to match a standard rate.
3131  if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
3132  av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
3133  }
3134 
3135  if (!st->r_frame_rate.num){
3136  if( st->codec->time_base.den * (int64_t)st->time_base.num
3137  <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
3138  st->r_frame_rate.num = st->codec->time_base.den;
3140  }else{
3141  st->r_frame_rate.num = st->time_base.den;
3142  st->r_frame_rate.den = st->time_base.num;
3143  }
3144  }
3145  }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
3146  if(!st->codec->bits_per_coded_sample)
3148  // set stream disposition based on audio service type
3149  switch (st->codec->audio_service_type) {
3157  st->disposition = AV_DISPOSITION_COMMENT; break;
3159  st->disposition = AV_DISPOSITION_KARAOKE; break;
3160  }
3161  }
3162  }
3163 
3164  if(ic->probesize)
3165  estimate_timings(ic, old_offset);
3166 
3168 
3169  find_stream_info_err:
3170  for (i=0; i < ic->nb_streams; i++) {
3171  st = ic->streams[i];
3172  if (ic->streams[i]->codec)
3173  ic->streams[i]->codec->thread_count = 0;
3174  if (st->info)
3175  av_freep(&st->info->duration_error);
3176  av_freep(&ic->streams[i]->info);
3177  }
3178  if(ic->pb)
3179  av_log(ic, AV_LOG_DEBUG, "File position after avformat_find_stream_info() is %"PRId64"\n", avio_tell(ic->pb));
3180  return ret;
3181 }
3182 
3184 {
3185  int i, j;
3186 
3187  for (i = 0; i < ic->nb_programs; i++) {
3188  if (ic->programs[i] == last) {
3189  last = NULL;
3190  } else {
3191  if (!last)
3192  for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
3193  if (ic->programs[i]->stream_index[j] == s)
3194  return ic->programs[i];
3195  }
3196  }
3197  return NULL;
3198 }
3199 
3201  enum AVMediaType type,
3202  int wanted_stream_nb,
3203  int related_stream,
3204  AVCodec **decoder_ret,
3205  int flags)
3206 {
3207  int i, nb_streams = ic->nb_streams;
3208  int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1, best_bitrate = -1, best_multiframe = -1, count, bitrate, multiframe;
3209  unsigned *program = NULL;
3210  AVCodec *decoder = NULL, *best_decoder = NULL;
3211 
3212  if (related_stream >= 0 && wanted_stream_nb < 0) {
3213  AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
3214  if (p) {
3215  program = p->stream_index;
3216  nb_streams = p->nb_stream_indexes;
3217  }
3218  }
3219  for (i = 0; i < nb_streams; i++) {
3220  int real_stream_index = program ? program[i] : i;
3221  AVStream *st = ic->streams[real_stream_index];
3222  AVCodecContext *avctx = st->codec;
3223  if (avctx->codec_type != type)
3224  continue;
3225  if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
3226  continue;
3228  continue;
3229  if (decoder_ret) {
3230  decoder = avcodec_find_decoder(st->codec->codec_id);
3231  if (!decoder) {
3232  if (ret < 0)
3234  continue;
3235  }
3236  }
3238  bitrate = avctx->bit_rate;
3239  multiframe = FFMIN(5, count);
3240  if ((best_multiframe > multiframe) ||
3241  (best_multiframe == multiframe && best_bitrate > bitrate) ||
3242  (best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
3243  continue;
3244  best_count = count;
3245  best_bitrate = bitrate;
3246  best_multiframe = multiframe;
3247  ret = real_stream_index;
3248  best_decoder = decoder;
3249  if (program && i == nb_streams - 1 && ret < 0) {
3250  program = NULL;
3251  nb_streams = ic->nb_streams;
3252  i = 0; /* no related stream found, try again with everything */
3253  }
3254  }
3255  if (decoder_ret)
3256  *decoder_ret = best_decoder;
3257  return ret;
3258 }
3259 
3260 /*******************************************************/
3261 
3263 {
3264  if (s->iformat->read_play)
3265  return s->iformat->read_play(s);
3266  if (s->pb)
3267  return avio_pause(s->pb, 0);
3268  return AVERROR(ENOSYS);
3269 }
3270 
3272 {
3273  if (s->iformat->read_pause)
3274  return s->iformat->read_pause(s);
3275  if (s->pb)
3276  return avio_pause(s->pb, 1);
3277  return AVERROR(ENOSYS);
3278 }
3279 
3281  av_assert0(s->nb_streams>0);
3282  av_assert0(s->streams[ s->nb_streams-1 ] == st);
3283 
3284  if (st->parser) {
3285  av_parser_close(st->parser);
3286  }
3287  if (st->attached_pic.data)
3289  av_dict_free(&st->metadata);
3290  av_freep(&st->probe_data.buf);
3291  av_freep(&st->index_entries);
3292  av_freep(&st->codec->extradata);
3294  av_freep(&st->codec);
3295  av_freep(&st->priv_data);
3296  if (st->info)
3297  av_freep(&st->info->duration_error);
3298  av_freep(&st->info);
3299  av_freep(&s->streams[ --s->nb_streams ]);
3300 }
3301 
3303 {
3304  int i;
3305 
3306  if (!s)
3307  return;
3308 
3309  av_opt_free(s);
3310  if (s->iformat && s->iformat->priv_class && s->priv_data)
3311  av_opt_free(s->priv_data);
3312 
3313  for(i=s->nb_streams-1; i>=0; i--) {
3314  ff_free_stream(s, s->streams[i]);
3315  }
3316  for(i=s->nb_programs-1; i>=0; i--) {
3317  av_dict_free(&s->programs[i]->metadata);
3318  av_freep(&s->programs[i]->stream_index);
3319  av_freep(&s->programs[i]);
3320  }
3321  av_freep(&s->programs);
3322  av_freep(&s->priv_data);
3323  while(s->nb_chapters--) {
3325  av_freep(&s->chapters[s->nb_chapters]);
3326  }
3327  av_freep(&s->chapters);
3328  av_dict_free(&s->metadata);
3329  av_freep(&s->streams);
3330  av_free(s);
3331 }
3332 
3333 #if FF_API_CLOSE_INPUT_FILE
3334 void av_close_input_file(AVFormatContext *s)
3335 {
3337 }
3338 #endif
3339 
3341 {
3342  AVFormatContext *s = *ps;
3343  AVIOContext *pb = s->pb;
3344 
3345  if ((s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
3346  (s->flags & AVFMT_FLAG_CUSTOM_IO))
3347  pb = NULL;
3348 
3349  flush_packet_queue(s);
3350 
3351  if (s->iformat) {
3352  if (s->iformat->read_close)
3353  s->iformat->read_close(s);
3354  }
3355 
3357 
3358  *ps = NULL;
3359 
3360  avio_close(pb);
3361 }
3362 
3363 #if FF_API_NEW_STREAM
3364 AVStream *av_new_stream(AVFormatContext *s, int id)
3365 {
3366  AVStream *st = avformat_new_stream(s, NULL);
3367  if (st)
3368  st->id = id;
3369  return st;
3370 }
3371 #endif
3372 
3374 {
3375  AVStream *st;
3376  int i;
3377  AVStream **streams;
3378 
3379  if (s->nb_streams >= INT_MAX/sizeof(*streams))
3380  return NULL;
3381  streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
3382  if (!streams)
3383  return NULL;
3384  s->streams = streams;
3385 
3386  st = av_mallocz(sizeof(AVStream));
3387  if (!st)
3388  return NULL;
3389  if (!(st->info = av_mallocz(sizeof(*st->info)))) {
3390  av_free(st);
3391  return NULL;
3392  }
3393  st->info->last_dts = AV_NOPTS_VALUE;
3394 
3395  st->codec = avcodec_alloc_context3(c);
3396  if (s->iformat) {
3397  /* no default bitrate if decoding */
3398  st->codec->bit_rate = 0;
3399  }
3400  st->index = s->nb_streams;
3401  st->start_time = AV_NOPTS_VALUE;
3402  st->duration = AV_NOPTS_VALUE;
3403  /* we set the current DTS to 0 so that formats without any timestamps
3404  but durations get some timestamps, formats with some unknown
3405  timestamps have their first few packets buffered and the
3406  timestamps corrected before they are returned to the user */
3407  st->cur_dts = s->iformat ? RELATIVE_TS_BASE : 0;
3408  st->first_dts = AV_NOPTS_VALUE;
3412 
3413  /* default pts setting is MPEG-like */
3414  avpriv_set_pts_info(st, 33, 1, 90000);
3416  for(i=0; i<MAX_REORDER_DELAY+1; i++)
3417  st->pts_buffer[i]= AV_NOPTS_VALUE;
3419 
3420  st->sample_aspect_ratio = (AVRational){0,1};
3421 
3422 #if FF_API_R_FRAME_RATE
3423  st->info->last_dts = AV_NOPTS_VALUE;
3424 #endif
3427 
3428  s->streams[s->nb_streams++] = st;
3429  return st;
3430 }
3431 
3433 {
3434  AVProgram *program=NULL;
3435  int i;
3436 
3437  av_dlog(ac, "new_program: id=0x%04x\n", id);
3438 
3439  for(i=0; i<ac->nb_programs; i++)
3440  if(ac->programs[i]->id == id)
3441  program = ac->programs[i];
3442 
3443  if(!program){
3444  program = av_mallocz(sizeof(AVProgram));
3445  if (!program)
3446  return NULL;
3447  dynarray_add(&ac->programs, &ac->nb_programs, program);
3448  program->discard = AVDISCARD_NONE;
3449  }
3450  program->id = id;
3453 
3454  program->start_time =
3455  program->end_time = AV_NOPTS_VALUE;
3456 
3457  return program;
3458 }
3459 
3460 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
3461 {
3462  AVChapter *chapter = NULL;
3463  int i;
3464 
3465  for(i=0; i<s->nb_chapters; i++)
3466  if(s->chapters[i]->id == id)
3467  chapter = s->chapters[i];
3468 
3469  if(!chapter){
3470  chapter= av_mallocz(sizeof(AVChapter));
3471  if(!chapter)
3472  return NULL;
3473  dynarray_add(&s->chapters, &s->nb_chapters, chapter);
3474  }
3475  av_dict_set(&chapter->metadata, "title", title, 0);
3476  chapter->id = id;
3477  chapter->time_base= time_base;
3478  chapter->start = start;
3479  chapter->end = end;
3480 
3481  return chapter;
3482 }
3483 
3484 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3485 {
3486  int i, j;
3487  AVProgram *program=NULL;
3488  void *tmp;
3489 
3490  if (idx >= ac->nb_streams) {
3491  av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3492  return;
3493  }
3494 
3495  for(i=0; i<ac->nb_programs; i++){
3496  if(ac->programs[i]->id != progid)
3497  continue;
3498  program = ac->programs[i];
3499  for(j=0; j<program->nb_stream_indexes; j++)
3500  if(program->stream_index[j] == idx)
3501  return;
3502 
3503  tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3504  if(!tmp)
3505  return;
3506  program->stream_index = tmp;
3507  program->stream_index[program->nb_stream_indexes++] = idx;
3508  return;
3509  }
3510 }
3511 
3512 static void print_fps(double d, const char *postfix){
3513  uint64_t v= lrintf(d*100);
3514  if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3515  else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3516  else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3517 }
3518 
3519 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3520 {
3521  if(m && !(av_dict_count(m) == 1 && av_dict_get(m, "language", NULL, 0))){
3523 
3524  av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3525  while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3526  if(strcmp("language", tag->key)){
3527  const char *p = tag->value;
3528  av_log(ctx, AV_LOG_INFO, "%s %-16s: ", indent, tag->key);
3529  while(*p) {
3530  char tmp[256];
3531  size_t len = strcspn(p, "\x8\xa\xb\xc\xd");
3532  av_strlcpy(tmp, p, FFMIN(sizeof(tmp), len+1));
3533  av_log(ctx, AV_LOG_INFO, "%s", tmp);
3534  p += len;
3535  if (*p == 0xd) av_log(ctx, AV_LOG_INFO, " ");
3536  if (*p == 0xa) av_log(ctx, AV_LOG_INFO, "\n%s %-16s: ", indent, "");
3537  if (*p) p++;
3538  }
3539  av_log(ctx, AV_LOG_INFO, "\n");
3540  }
3541  }
3542  }
3543 }
3544 
3545 /* "user interface" functions */
3546 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3547 {
3548  char buf[256];
3549  int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3550  AVStream *st = ic->streams[i];
3551  int g = av_gcd(st->time_base.num, st->time_base.den);
3552  AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3553  avcodec_string(buf, sizeof(buf), st->codec, is_output);
3554  av_log(NULL, AV_LOG_INFO, " Stream #%d:%d", index, i);
3555  /* the pid is an important information, so we display it */
3556  /* XXX: add a generic system */
3557  if (flags & AVFMT_SHOW_IDS)
3558  av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3559  if (lang)
3560  av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3561  av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3562  av_log(NULL, AV_LOG_INFO, ": %s", buf);
3563  if (st->sample_aspect_ratio.num && // default
3565  AVRational display_aspect_ratio;
3566  av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3569  1024*1024);
3570  av_log(NULL, AV_LOG_INFO, ", SAR %d:%d DAR %d:%d",
3572  display_aspect_ratio.num, display_aspect_ratio.den);
3573  }
3574  if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3575  if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3576  print_fps(av_q2d(st->avg_frame_rate), "fps");
3577 #if FF_API_R_FRAME_RATE
3578  if(st->r_frame_rate.den && st->r_frame_rate.num)
3579  print_fps(av_q2d(st->r_frame_rate), "tbr");
3580 #endif
3581  if(st->time_base.den && st->time_base.num)
3582  print_fps(1/av_q2d(st->time_base), "tbn");
3583  if(st->codec->time_base.den && st->codec->time_base.num)
3584  print_fps(1/av_q2d(st->codec->time_base), "tbc");
3585  }
3587  av_log(NULL, AV_LOG_INFO, " (default)");
3588  if (st->disposition & AV_DISPOSITION_DUB)
3589  av_log(NULL, AV_LOG_INFO, " (dub)");
3591  av_log(NULL, AV_LOG_INFO, " (original)");
3593  av_log(NULL, AV_LOG_INFO, " (comment)");
3595  av_log(NULL, AV_LOG_INFO, " (lyrics)");
3597  av_log(NULL, AV_LOG_INFO, " (karaoke)");
3599  av_log(NULL, AV_LOG_INFO, " (forced)");
3601  av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3603  av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3605  av_log(NULL, AV_LOG_INFO, " (clean effects)");
3606  av_log(NULL, AV_LOG_INFO, "\n");
3607  dump_metadata(NULL, st->metadata, " ");
3608 }
3609 
3611  int index,
3612  const char *url,
3613  int is_output)
3614 {
3615  int i;
3616  uint8_t *printed = ic->nb_streams ? av_mallocz(ic->nb_streams) : NULL;
3617  if (ic->nb_streams && !printed)
3618  return;
3619 
3620  av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3621  is_output ? "Output" : "Input",
3622  index,
3623  is_output ? ic->oformat->name : ic->iformat->name,
3624  is_output ? "to" : "from", url);
3625  dump_metadata(NULL, ic->metadata, " ");
3626  if (!is_output) {
3627  av_log(NULL, AV_LOG_INFO, " Duration: ");
3628  if (ic->duration != AV_NOPTS_VALUE) {
3629  int hours, mins, secs, us;
3630  int64_t duration = ic->duration + 5000;
3631  secs = duration / AV_TIME_BASE;
3632  us = duration % AV_TIME_BASE;
3633  mins = secs / 60;
3634  secs %= 60;
3635  hours = mins / 60;
3636  mins %= 60;
3637  av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3638  (100 * us) / AV_TIME_BASE);
3639  } else {
3640  av_log(NULL, AV_LOG_INFO, "N/A");
3641  }
3642  if (ic->start_time != AV_NOPTS_VALUE) {
3643  int secs, us;
3644  av_log(NULL, AV_LOG_INFO, ", start: ");
3645  secs = ic->start_time / AV_TIME_BASE;
3646  us = abs(ic->start_time % AV_TIME_BASE);
3647  av_log(NULL, AV_LOG_INFO, "%d.%06d",
3648  secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3649  }
3650  av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3651  if (ic->bit_rate) {
3652  av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3653  } else {
3654  av_log(NULL, AV_LOG_INFO, "N/A");
3655  }
3656  av_log(NULL, AV_LOG_INFO, "\n");
3657  }
3658  for (i = 0; i < ic->nb_chapters; i++) {
3659  AVChapter *ch = ic->chapters[i];
3660  av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3661  av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3662  av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3663 
3664  dump_metadata(NULL, ch->metadata, " ");
3665  }
3666  if(ic->nb_programs) {
3667  int j, k, total = 0;
3668  for(j=0; j<ic->nb_programs; j++) {
3670  "name", NULL, 0);
3671  av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3672  name ? name->value : "");
3673  dump_metadata(NULL, ic->programs[j]->metadata, " ");
3674  for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3675  dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3676  printed[ic->programs[j]->stream_index[k]] = 1;
3677  }
3678  total += ic->programs[j]->nb_stream_indexes;
3679  }
3680  if (total < ic->nb_streams)
3681  av_log(NULL, AV_LOG_INFO, " No Program\n");
3682  }
3683  for(i=0;i<ic->nb_streams;i++)
3684  if (!printed[i])
3685  dump_stream_format(ic, i, index, is_output);
3686 
3687  av_free(printed);
3688 }
3689 
3690 uint64_t ff_ntp_time(void)
3691 {
3692  return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3693 }
3694 
3695 int av_get_frame_filename(char *buf, int buf_size,
3696  const char *path, int number)
3697 {
3698  const char *p;
3699  char *q, buf1[20], c;
3700  int nd, len, percentd_found;
3701 
3702  q = buf;
3703  p = path;
3704  percentd_found = 0;
3705  for(;;) {
3706  c = *p++;
3707  if (c == '\0')
3708  break;
3709  if (c == '%') {
3710  do {
3711  nd = 0;
3712  while (av_isdigit(*p)) {
3713  nd = nd * 10 + *p++ - '0';
3714  }
3715  c = *p++;
3716  } while (av_isdigit(c));
3717 
3718  switch(c) {
3719  case '%':
3720  goto addchar;
3721  case 'd':
3722  if (percentd_found)
3723  goto fail;
3724  percentd_found = 1;
3725  snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3726  len = strlen(buf1);
3727  if ((q - buf + len) > buf_size - 1)
3728  goto fail;
3729  memcpy(q, buf1, len);
3730  q += len;
3731  break;
3732  default:
3733  goto fail;
3734  }
3735  } else {
3736  addchar:
3737  if ((q - buf) < buf_size - 1)
3738  *q++ = c;
3739  }
3740  }
3741  if (!percentd_found)
3742  goto fail;
3743  *q = '\0';
3744  return 0;
3745  fail:
3746  *q = '\0';
3747  return -1;
3748 }
3749 
3750 static void hex_dump_internal(void *avcl, FILE *f, int level,
3751  const uint8_t *buf, int size)
3752 {
3753  int len, i, j, c;
3754 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3755 
3756  for(i=0;i<size;i+=16) {
3757  len = size - i;
3758  if (len > 16)
3759  len = 16;
3760  PRINT("%08x ", i);
3761  for(j=0;j<16;j++) {
3762  if (j < len)
3763  PRINT(" %02x", buf[i+j]);
3764  else
3765  PRINT(" ");
3766  }
3767  PRINT(" ");
3768  for(j=0;j<len;j++) {
3769  c = buf[i+j];
3770  if (c < ' ' || c > '~')
3771  c = '.';
3772  PRINT("%c", c);
3773  }
3774  PRINT("\n");
3775  }
3776 #undef PRINT
3777 }
3778 
3779 void av_hex_dump(FILE *f, const uint8_t *buf, int size)
3780 {
3781  hex_dump_internal(NULL, f, 0, buf, size);
3782 }
3783 
3784 void av_hex_dump_log(void *avcl, int level, const uint8_t *buf, int size)
3785 {
3786  hex_dump_internal(avcl, NULL, level, buf, size);
3787 }
3788 
3789 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3790 {
3791 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3792  PRINT("stream #%d:\n", pkt->stream_index);
3793  PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3794  PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3795  /* DTS is _always_ valid after av_read_frame() */
3796  PRINT(" dts=");
3797  if (pkt->dts == AV_NOPTS_VALUE)
3798  PRINT("N/A");
3799  else
3800  PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3801  /* PTS may not be known if B-frames are present. */
3802  PRINT(" pts=");
3803  if (pkt->pts == AV_NOPTS_VALUE)
3804  PRINT("N/A");
3805  else
3806  PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3807  PRINT("\n");
3808  PRINT(" size=%d\n", pkt->size);
3809 #undef PRINT
3810  if (dump_payload)
3811  av_hex_dump(f, pkt->data, pkt->size);
3812 }
3813 
3814 #if FF_API_PKT_DUMP
3815 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3816 {
3817  AVRational tb = { 1, AV_TIME_BASE };
3818  pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3819 }
3820 #endif
3821 
3822 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3823 {
3824  pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3825 }
3826 
3827 #if FF_API_PKT_DUMP
3828 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3829 {
3830  AVRational tb = { 1, AV_TIME_BASE };
3831  pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3832 }
3833 #endif
3834 
3835 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3836  AVStream *st)
3837 {
3838  pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3839 }
3840 
3841 void av_url_split(char *proto, int proto_size,
3842  char *authorization, int authorization_size,
3843  char *hostname, int hostname_size,
3844  int *port_ptr,
3845  char *path, int path_size,
3846  const char *url)
3847 {
3848  const char *p, *ls, *ls2, *at, *at2, *col, *brk;
3849 
3850  if (port_ptr) *port_ptr = -1;
3851  if (proto_size > 0) proto[0] = 0;
3852  if (authorization_size > 0) authorization[0] = 0;
3853  if (hostname_size > 0) hostname[0] = 0;
3854  if (path_size > 0) path[0] = 0;
3855 
3856  /* parse protocol */
3857  if ((p = strchr(url, ':'))) {
3858  av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3859  p++; /* skip ':' */
3860  if (*p == '/') p++;
3861  if (*p == '/') p++;
3862  } else {
3863  /* no protocol means plain filename */
3864  av_strlcpy(path, url, path_size);
3865  return;
3866  }
3867 
3868  /* separate path from hostname */
3869  ls = strchr(p, '/');
3870  ls2 = strchr(p, '?');
3871  if(!ls)
3872  ls = ls2;
3873  else if (ls && ls2)
3874  ls = FFMIN(ls, ls2);
3875  if(ls)
3876  av_strlcpy(path, ls, path_size);
3877  else
3878  ls = &p[strlen(p)]; // XXX
3879 
3880  /* the rest is hostname, use that to parse auth/port */
3881  if (ls != p) {
3882  /* authorization (user[:pass]@hostname) */
3883  at2 = p;
3884  while ((at = strchr(p, '@')) && at < ls) {
3885  av_strlcpy(authorization, at2,
3886  FFMIN(authorization_size, at + 1 - at2));
3887  p = at + 1; /* skip '@' */
3888  }
3889 
3890  if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3891  /* [host]:port */
3892  av_strlcpy(hostname, p + 1,
3893  FFMIN(hostname_size, brk - p));
3894  if (brk[1] == ':' && port_ptr)
3895  *port_ptr = atoi(brk + 2);
3896  } else if ((col = strchr(p, ':')) && col < ls) {
3897  av_strlcpy(hostname, p,
3898  FFMIN(col + 1 - p, hostname_size));
3899  if (port_ptr) *port_ptr = atoi(col + 1);
3900  } else
3901  av_strlcpy(hostname, p,
3902  FFMIN(ls + 1 - p, hostname_size));
3903  }
3904 }
3905 
3906 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3907 {
3908  int i;
3909  static const char hex_table_uc[16] = { '0', '1', '2', '3',
3910  '4', '5', '6', '7',
3911  '8', '9', 'A', 'B',
3912  'C', 'D', 'E', 'F' };
3913  static const char hex_table_lc[16] = { '0', '1', '2', '3',
3914  '4', '5', '6', '7',
3915  '8', '9', 'a', 'b',
3916  'c', 'd', 'e', 'f' };
3917  const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3918 
3919  for(i = 0; i < s; i++) {
3920  buff[i * 2] = hex_table[src[i] >> 4];
3921  buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3922  }
3923 
3924  return buff;
3925 }
3926 
3927 int ff_hex_to_data(uint8_t *data, const char *p)
3928 {
3929  int c, len, v;
3930 
3931  len = 0;
3932  v = 1;
3933  for (;;) {
3934  p += strspn(p, SPACE_CHARS);
3935  if (*p == '\0')
3936  break;
3937  c = av_toupper((unsigned char) *p++);
3938  if (c >= '0' && c <= '9')
3939  c = c - '0';
3940  else if (c >= 'A' && c <= 'F')
3941  c = c - 'A' + 10;
3942  else
3943  break;
3944  v = (v << 4) | c;
3945  if (v & 0x100) {
3946  if (data)
3947  data[len] = v;
3948  len++;
3949  v = 1;
3950  }
3951  }
3952  return len;
3953 }
3954 
3955 #if FF_API_SET_PTS_INFO
3956 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3957  unsigned int pts_num, unsigned int pts_den)
3958 {
3959  avpriv_set_pts_info(s, pts_wrap_bits, pts_num, pts_den);
3960 }
3961 #endif
3962 
3963 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
3964  unsigned int pts_num, unsigned int pts_den)
3965 {
3966  AVRational new_tb;
3967  if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
3968  if(new_tb.num != pts_num)
3969  av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
3970  }else
3971  av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3972 
3973  if(new_tb.num <= 0 || new_tb.den <= 0) {
3974  av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase %d/%d for st:%d\n", new_tb.num, new_tb.den, s->index);
3975  return;
3976  }
3977  s->time_base = new_tb;
3978  av_codec_set_pkt_timebase(s->codec, new_tb);
3979  s->pts_wrap_bits = pts_wrap_bits;
3980 }
3981 
3982 int ff_url_join(char *str, int size, const char *proto,
3983  const char *authorization, const char *hostname,
3984  int port, const char *fmt, ...)
3985 {
3986 #if CONFIG_NETWORK
3987  struct addrinfo hints = { 0 }, *ai;
3988 #endif
3989 
3990  str[0] = '\0';
3991  if (proto)
3992  av_strlcatf(str, size, "%s://", proto);
3993  if (authorization && authorization[0])
3994  av_strlcatf(str, size, "%s@", authorization);
3995 #if CONFIG_NETWORK && defined(AF_INET6)
3996  /* Determine if hostname is a numerical IPv6 address,
3997  * properly escape it within [] in that case. */
3998  hints.ai_flags = AI_NUMERICHOST;
3999  if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
4000  if (ai->ai_family == AF_INET6) {
4001  av_strlcat(str, "[", size);
4002  av_strlcat(str, hostname, size);
4003  av_strlcat(str, "]", size);
4004  } else {
4005  av_strlcat(str, hostname, size);
4006  }
4007  freeaddrinfo(ai);
4008  } else
4009 #endif
4010  /* Not an IPv6 address, just output the plain string. */
4011  av_strlcat(str, hostname, size);
4012 
4013  if (port >= 0)
4014  av_strlcatf(str, size, ":%d", port);
4015  if (fmt) {
4016  va_list vl;
4017  int len = strlen(str);
4018 
4019  va_start(vl, fmt);
4020  vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
4021  va_end(vl);
4022  }
4023  return strlen(str);
4024 }
4025 
4028 {
4029  AVPacket local_pkt;
4030 
4031  local_pkt = *pkt;
4032  local_pkt.stream_index = dst_stream;
4033  if (pkt->pts != AV_NOPTS_VALUE)
4034  local_pkt.