FFmpeg
avidec.c
Go to the documentation of this file.
1 /*
2  * AVI demuxer
3  * Copyright (c) 2001 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 <inttypes.h>
23 
24 #include "libavutil/avassert.h"
25 #include "libavutil/avstring.h"
26 #include "libavutil/opt.h"
27 #include "libavutil/dict.h"
28 #include "libavutil/internal.h"
29 #include "libavutil/intreadwrite.h"
30 #include "libavutil/mathematics.h"
31 #include "avformat.h"
32 #include "avi.h"
33 #include "dv.h"
34 #include "internal.h"
35 #include "isom.h"
36 #include "riff.h"
37 #include "libavcodec/bytestream.h"
38 #include "libavcodec/exif.h"
39 #include "libavcodec/internal.h"
40 
41 typedef struct AVIStream {
42  int64_t frame_offset; /* current frame (video) or byte (audio) counter
43  * (used to compute the pts) */
44  int remaining;
46 
47  uint32_t handler;
48  uint32_t scale;
49  uint32_t rate;
50  int sample_size; /* size of one sample (or packet)
51  * (in the rate/scale sense) in bytes */
52 
53  int64_t cum_len; /* temporary storage (used during seek) */
54  int prefix; /* normally 'd'<<8 + 'c' or 'w'<<8 + 'b' */
56  uint32_t pal[256];
57  int has_pal;
58  int dshow_block_align; /* block align variable used to emulate bugs in
59  * the MS dshow demuxer */
60 
64 
65  int64_t seek_pos;
66 } AVIStream;
67 
68 typedef struct AVIContext {
69  const AVClass *class;
70  int64_t riff_end;
71  int64_t movi_end;
72  int64_t fsize;
73  int64_t io_fsize;
74  int64_t movi_list;
75  int64_t last_pkt_pos;
77  int is_odml;
82  int use_odml;
83 #define MAX_ODML_DEPTH 1000
84  int64_t dts_max;
85 } AVIContext;
86 
87 
88 static const AVOption options[] = {
89  { "use_odml", "use odml index", offsetof(AVIContext, use_odml), AV_OPT_TYPE_BOOL, {.i64 = 1}, -1, 1, AV_OPT_FLAG_DECODING_PARAM},
90  { NULL },
91 };
92 
93 static const AVClass demuxer_class = {
94  .class_name = "avi",
95  .item_name = av_default_item_name,
96  .option = options,
97  .version = LIBAVUTIL_VERSION_INT,
98  .category = AV_CLASS_CATEGORY_DEMUXER,
99 };
100 
101 
102 static const char avi_headers[][8] = {
103  { 'R', 'I', 'F', 'F', 'A', 'V', 'I', ' ' },
104  { 'R', 'I', 'F', 'F', 'A', 'V', 'I', 'X' },
105  { 'R', 'I', 'F', 'F', 'A', 'V', 'I', 0x19 },
106  { 'O', 'N', '2', ' ', 'O', 'N', '2', 'f' },
107  { 'R', 'I', 'F', 'F', 'A', 'M', 'V', ' ' },
108  { 0 }
109 };
110 
112  { "strn", "title" },
113  { 0 },
114 };
115 
116 static int avi_read_close(AVFormatContext *s);
117 static int avi_load_index(AVFormatContext *s);
118 static int guess_ni_flag(AVFormatContext *s);
119 
120 #define print_tag(s, str, tag, size) \
121  av_log(s, AV_LOG_TRACE, "pos:%"PRIX64" %s: tag=%s size=0x%x\n", \
122  avio_tell(pb), str, av_fourcc2str(tag), size) \
123 
124 static inline int get_duration(AVIStream *ast, int len)
125 {
126  if (ast->sample_size)
127  return len;
128  else if (ast->dshow_block_align)
129  return (len + (int64_t)ast->dshow_block_align - 1) / ast->dshow_block_align;
130  else
131  return 1;
132 }
133 
135 {
136  AVIContext *avi = s->priv_data;
137  char header[8] = {0};
138  int i;
139 
140  /* check RIFF header */
141  avio_read(pb, header, 4);
142  avi->riff_end = avio_rl32(pb); /* RIFF chunk size */
143  avi->riff_end += avio_tell(pb); /* RIFF chunk end */
144  avio_read(pb, header + 4, 4);
145 
146  for (i = 0; avi_headers[i][0]; i++)
147  if (!memcmp(header, avi_headers[i], 8))
148  break;
149  if (!avi_headers[i][0])
150  return AVERROR_INVALIDDATA;
151 
152  if (header[7] == 0x19)
154  "This file has been generated by a totally broken muxer.\n");
155 
156  return 0;
157 }
158 
159 static int read_odml_index(AVFormatContext *s, int64_t frame_num)
160 {
161  AVIContext *avi = s->priv_data;
162  AVIOContext *pb = s->pb;
163  int longs_per_entry = avio_rl16(pb);
164  int index_sub_type = avio_r8(pb);
165  int index_type = avio_r8(pb);
166  int entries_in_use = avio_rl32(pb);
167  int chunk_id = avio_rl32(pb);
168  int64_t base = avio_rl64(pb);
169  int stream_id = ((chunk_id & 0xFF) - '0') * 10 +
170  ((chunk_id >> 8 & 0xFF) - '0');
171  AVStream *st;
172  AVIStream *ast;
173  int i;
174  int64_t last_pos = -1;
175  int64_t filesize = avi->fsize;
176 
178  "longs_per_entry:%d index_type:%d entries_in_use:%d "
179  "chunk_id:%X base:%16"PRIX64" frame_num:%"PRId64"\n",
180  longs_per_entry,
181  index_type,
182  entries_in_use,
183  chunk_id,
184  base,
185  frame_num);
186 
187  if (stream_id >= s->nb_streams || stream_id < 0)
188  return AVERROR_INVALIDDATA;
189  st = s->streams[stream_id];
190  ast = st->priv_data;
191 
192  if (index_sub_type)
193  return AVERROR_INVALIDDATA;
194 
195  avio_rl32(pb);
196 
197  if (index_type && longs_per_entry != 2)
198  return AVERROR_INVALIDDATA;
199  if (index_type > 1)
200  return AVERROR_INVALIDDATA;
201 
202  if (filesize > 0 && base >= filesize) {
203  av_log(s, AV_LOG_ERROR, "ODML index invalid\n");
204  if (base >> 32 == (base & 0xFFFFFFFF) &&
205  (base & 0xFFFFFFFF) < filesize &&
206  filesize <= 0xFFFFFFFF)
207  base &= 0xFFFFFFFF;
208  else
209  return AVERROR_INVALIDDATA;
210  }
211 
212  for (i = 0; i < entries_in_use; i++) {
213  if (index_type) {
214  int64_t pos = avio_rl32(pb) + base - 8;
215  int len = avio_rl32(pb);
216  int key = len >= 0;
217  len &= 0x7FFFFFFF;
218 
219  av_log(s, AV_LOG_TRACE, "pos:%"PRId64", len:%X\n", pos, len);
220 
221  if (avio_feof(pb))
222  return AVERROR_INVALIDDATA;
223 
224  if (last_pos == pos || pos == base - 8)
225  avi->non_interleaved = 1;
226  if (last_pos != pos && len)
227  av_add_index_entry(st, pos, ast->cum_len, len, 0,
228  key ? AVINDEX_KEYFRAME : 0);
229 
230  ast->cum_len += get_duration(ast, len);
231  last_pos = pos;
232  } else {
233  int64_t offset, pos;
234  int duration;
235  int ret;
236 
237  offset = avio_rl64(pb);
238  avio_rl32(pb); /* size */
239  duration = avio_rl32(pb);
240 
241  if (avio_feof(pb) || offset > INT64_MAX - 8)
242  return AVERROR_INVALIDDATA;
243 
244  pos = avio_tell(pb);
245 
246  if (avi->odml_depth > MAX_ODML_DEPTH) {
247  av_log(s, AV_LOG_ERROR, "Too deeply nested ODML indexes\n");
248  return AVERROR_INVALIDDATA;
249  }
250 
251  if (avio_seek(pb, offset + 8, SEEK_SET) < 0)
252  return -1;
253  avi->odml_depth++;
254  ret = read_odml_index(s, frame_num);
255  avi->odml_depth--;
256  frame_num += duration;
257 
258  if (avio_seek(pb, pos, SEEK_SET) < 0) {
259  av_log(s, AV_LOG_ERROR, "Failed to restore position after reading index\n");
260  return -1;
261  }
262  if (ret < 0)
263  return ret;
264  }
265  }
266  avi->index_loaded = 2;
267  return 0;
268 }
269 
271 {
272  int i;
273  int64_t j;
274 
275  for (i = 0; i < s->nb_streams; i++) {
276  AVStream *st = s->streams[i];
277  AVIStream *ast = st->priv_data;
278  int n = st->nb_index_entries;
279  int max = ast->sample_size;
280  int64_t pos, size, ts;
281 
282  if (n != 1 || ast->sample_size == 0)
283  continue;
284 
285  while (max < 1024)
286  max += max;
287 
288  pos = st->index_entries[0].pos;
289  size = st->index_entries[0].size;
290  ts = st->index_entries[0].timestamp;
291 
292  for (j = 0; j < size; j += max)
293  av_add_index_entry(st, pos + j, ts + j, FFMIN(max, size - j), 0,
295  }
296 }
297 
298 static int avi_read_tag(AVFormatContext *s, AVStream *st, uint32_t tag,
299  uint32_t size)
300 {
301  AVIOContext *pb = s->pb;
302  char key[5] = { 0 };
303  char *value;
304 
305  size += (size & 1);
306 
307  if (size == UINT_MAX)
308  return AVERROR(EINVAL);
309  value = av_malloc(size + 1);
310  if (!value)
311  return AVERROR(ENOMEM);
312  if (avio_read(pb, value, size) != size) {
313  av_freep(&value);
314  return AVERROR_INVALIDDATA;
315  }
316  value[size] = 0;
317 
318  AV_WL32(key, tag);
319 
320  return av_dict_set(st ? &st->metadata : &s->metadata, key, value,
322 }
323 
324 static const char months[12][4] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
325  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
326 
327 static void avi_metadata_creation_time(AVDictionary **metadata, char *date)
328 {
329  char month[4], time[9], buffer[64];
330  int i, day, year;
331  /* parse standard AVI date format (ie. "Mon Mar 10 15:04:43 2003") */
332  if (sscanf(date, "%*3s%*[ ]%3s%*[ ]%2d%*[ ]%8s%*[ ]%4d",
333  month, &day, time, &year) == 4) {
334  for (i = 0; i < 12; i++)
335  if (!av_strcasecmp(month, months[i])) {
336  snprintf(buffer, sizeof(buffer), "%.4d-%.2d-%.2d %s",
337  year, i + 1, day, time);
338  av_dict_set(metadata, "creation_time", buffer, 0);
339  }
340  } else if (date[4] == '/' && date[7] == '/') {
341  date[4] = date[7] = '-';
342  av_dict_set(metadata, "creation_time", date, 0);
343  }
344 }
345 
346 static void avi_read_nikon(AVFormatContext *s, uint64_t end)
347 {
348  while (avio_tell(s->pb) < end && !avio_feof(s->pb)) {
349  uint32_t tag = avio_rl32(s->pb);
350  uint32_t size = avio_rl32(s->pb);
351  switch (tag) {
352  case MKTAG('n', 'c', 't', 'g'): /* Nikon Tags */
353  {
354  uint64_t tag_end = avio_tell(s->pb) + size;
355  while (avio_tell(s->pb) < tag_end && !avio_feof(s->pb)) {
356  uint16_t tag = avio_rl16(s->pb);
357  uint16_t size = avio_rl16(s->pb);
358  const char *name = NULL;
359  char buffer[64] = { 0 };
360  size = FFMIN(size, tag_end - avio_tell(s->pb));
361  size -= avio_read(s->pb, buffer,
362  FFMIN(size, sizeof(buffer) - 1));
363  switch (tag) {
364  case 0x03:
365  name = "maker";
366  break;
367  case 0x04:
368  name = "model";
369  break;
370  case 0x13:
371  name = "creation_time";
372  if (buffer[4] == ':' && buffer[7] == ':')
373  buffer[4] = buffer[7] = '-';
374  break;
375  }
376  if (name)
377  av_dict_set(&s->metadata, name, buffer, 0);
378  avio_skip(s->pb, size);
379  }
380  break;
381  }
382  default:
383  avio_skip(s->pb, size);
384  break;
385  }
386  }
387 }
388 
390 {
391  GetByteContext gb;
392  uint8_t *data = st->codecpar->extradata;
393  int data_size = st->codecpar->extradata_size;
394  int tag, offset;
395 
396  if (!data || data_size < 8) {
397  return AVERROR_INVALIDDATA;
398  }
399 
400  bytestream2_init(&gb, data, data_size);
401 
402  tag = bytestream2_get_le32(&gb);
403 
404  switch (tag) {
405  case MKTAG('A', 'V', 'I', 'F'):
406  // skip 4 byte padding
407  bytestream2_skip(&gb, 4);
408  offset = bytestream2_tell(&gb);
409 
410  // decode EXIF tags from IFD, AVI is always little-endian
411  return avpriv_exif_decode_ifd(s, data + offset, data_size - offset,
412  1, 0, &st->metadata);
413  break;
414  case MKTAG('C', 'A', 'S', 'I'):
415  avpriv_request_sample(s, "RIFF stream data tag type CASI (%u)", tag);
416  break;
417  case MKTAG('Z', 'o', 'r', 'a'):
418  avpriv_request_sample(s, "RIFF stream data tag type Zora (%u)", tag);
419  break;
420  default:
421  break;
422  }
423 
424  return 0;
425 }
426 
428 {
429  AVIContext *avi = s->priv_data;
430  int i, j;
431  int64_t lensum = 0;
432  int64_t maxpos = 0;
433 
434  for (i = 0; i<s->nb_streams; i++) {
435  int64_t len = 0;
436  AVStream *st = s->streams[i];
437 
438  if (!st->nb_index_entries)
439  continue;
440 
441  for (j = 0; j < st->nb_index_entries; j++)
442  len += st->index_entries[j].size;
443  maxpos = FFMAX(maxpos, st->index_entries[j-1].pos);
444  lensum += len;
445  }
446  if (maxpos < av_rescale(avi->io_fsize, 9, 10)) // index does not cover the whole file
447  return 0;
448  if (lensum*9/10 > maxpos || lensum < maxpos*9/10) // frame sum and filesize mismatch
449  return 0;
450 
451  for (i = 0; i<s->nb_streams; i++) {
452  int64_t len = 0;
453  AVStream *st = s->streams[i];
454  int64_t duration;
455  int64_t bitrate;
456 
457  for (j = 0; j < st->nb_index_entries; j++)
458  len += st->index_entries[j].size;
459 
460  if (st->nb_index_entries < 2 || st->codecpar->bit_rate > 0)
461  continue;
464  if (bitrate > 0) {
465  st->codecpar->bit_rate = bitrate;
466  }
467  }
468  return 1;
469 }
470 
471 #define RETURN_ERROR(code) do { ret = (code); goto fail; } while (0)
473 {
474  AVIContext *avi = s->priv_data;
475  AVIOContext *pb = s->pb;
476  unsigned int tag, tag1, handler;
477  int codec_type, stream_index, frame_period;
478  unsigned int size;
479  int i;
480  AVStream *st;
481  AVIStream *ast = NULL;
482  int avih_width = 0, avih_height = 0;
483  int amv_file_format = 0;
484  uint64_t list_end = 0;
485  int64_t pos;
486  int ret;
487  AVDictionaryEntry *dict_entry;
488 
489  avi->stream_index = -1;
490 
491  ret = get_riff(s, pb);
492  if (ret < 0)
493  return ret;
494 
495  av_log(avi, AV_LOG_DEBUG, "use odml:%d\n", avi->use_odml);
496 
497  avi->io_fsize = avi->fsize = avio_size(pb);
498  if (avi->fsize <= 0 || avi->fsize < avi->riff_end)
499  avi->fsize = avi->riff_end == 8 ? INT64_MAX : avi->riff_end;
500 
501  /* first list tag */
502  stream_index = -1;
503  codec_type = -1;
504  frame_period = 0;
505  for (;;) {
506  if (avio_feof(pb))
508  tag = avio_rl32(pb);
509  size = avio_rl32(pb);
510 
511  print_tag(s, "tag", tag, size);
512 
513  switch (tag) {
514  case MKTAG('L', 'I', 'S', 'T'):
515  list_end = avio_tell(pb) + size;
516  /* Ignored, except at start of video packets. */
517  tag1 = avio_rl32(pb);
518 
519  print_tag(s, "list", tag1, 0);
520 
521  if (tag1 == MKTAG('m', 'o', 'v', 'i')) {
522  avi->movi_list = avio_tell(pb) - 4;
523  if (size)
524  avi->movi_end = avi->movi_list + size + (size & 1);
525  else
526  avi->movi_end = avi->fsize;
527  av_log(s, AV_LOG_TRACE, "movi end=%"PRIx64"\n", avi->movi_end);
528  goto end_of_header;
529  } else if (tag1 == MKTAG('I', 'N', 'F', 'O'))
530  ff_read_riff_info(s, size - 4);
531  else if (tag1 == MKTAG('n', 'c', 'd', 't'))
532  avi_read_nikon(s, list_end);
533 
534  break;
535  case MKTAG('I', 'D', 'I', 'T'):
536  {
537  unsigned char date[64] = { 0 };
538  size += (size & 1);
539  size -= avio_read(pb, date, FFMIN(size, sizeof(date) - 1));
540  avio_skip(pb, size);
541  avi_metadata_creation_time(&s->metadata, date);
542  break;
543  }
544  case MKTAG('d', 'm', 'l', 'h'):
545  avi->is_odml = 1;
546  avio_skip(pb, size + (size & 1));
547  break;
548  case MKTAG('a', 'm', 'v', 'h'):
549  amv_file_format = 1;
550  case MKTAG('a', 'v', 'i', 'h'):
551  /* AVI header */
552  /* using frame_period is bad idea */
553  frame_period = avio_rl32(pb);
554  avio_rl32(pb); /* max. bytes per second */
555  avio_rl32(pb);
557 
558  avio_skip(pb, 2 * 4);
559  avio_rl32(pb);
560  avio_rl32(pb);
561  avih_width = avio_rl32(pb);
562  avih_height = avio_rl32(pb);
563 
564  avio_skip(pb, size - 10 * 4);
565  break;
566  case MKTAG('s', 't', 'r', 'h'):
567  /* stream header */
568 
569  tag1 = avio_rl32(pb);
570  handler = avio_rl32(pb); /* codec tag */
571 
572  if (tag1 == MKTAG('p', 'a', 'd', 's')) {
573  avio_skip(pb, size - 8);
574  break;
575  } else {
576  stream_index++;
577  st = avformat_new_stream(s, NULL);
578  if (!st)
579  RETURN_ERROR(AVERROR(ENOMEM));
580 
581  st->id = stream_index;
582  ast = av_mallocz(sizeof(AVIStream));
583  if (!ast)
584  RETURN_ERROR(AVERROR(ENOMEM));
585  st->priv_data = ast;
586  }
587  if (amv_file_format)
588  tag1 = stream_index ? MKTAG('a', 'u', 'd', 's')
589  : MKTAG('v', 'i', 'd', 's');
590 
591  print_tag(s, "strh", tag1, -1);
592 
593  if (tag1 == MKTAG('i', 'a', 'v', 's') ||
594  tag1 == MKTAG('i', 'v', 'a', 's')) {
595  int64_t dv_dur;
596 
597  /* After some consideration -- I don't think we
598  * have to support anything but DV in type1 AVIs. */
599  if (s->nb_streams != 1)
601 
602  if (handler != MKTAG('d', 'v', 's', 'd') &&
603  handler != MKTAG('d', 'v', 'h', 'd') &&
604  handler != MKTAG('d', 'v', 's', 'l'))
605  return AVERROR_INVALIDDATA;
606 
607  if (!CONFIG_DV_DEMUXER)
609 
610  ast = s->streams[0]->priv_data;
611  st->priv_data = NULL;
612  ff_free_stream(s, st);
613 
615  if (!avi->dv_demux) {
616  av_free(ast);
617  return AVERROR(ENOMEM);
618  }
619 
620  s->streams[0]->priv_data = ast;
621  avio_skip(pb, 3 * 4);
622  ast->scale = avio_rl32(pb);
623  ast->rate = avio_rl32(pb);
624  avio_skip(pb, 4); /* start time */
625 
626  dv_dur = avio_rl32(pb);
627  if (ast->scale > 0 && ast->rate > 0 && dv_dur > 0) {
628  dv_dur *= AV_TIME_BASE;
629  s->duration = av_rescale(dv_dur, ast->scale, ast->rate);
630  }
631  /* else, leave duration alone; timing estimation in utils.c
632  * will make a guess based on bitrate. */
633 
634  stream_index = s->nb_streams - 1;
635  avio_skip(pb, size - 9 * 4);
636  break;
637  }
638 
639  av_assert0(stream_index < s->nb_streams);
640  ast->handler = handler;
641 
642  avio_rl32(pb); /* flags */
643  avio_rl16(pb); /* priority */
644  avio_rl16(pb); /* language */
645  avio_rl32(pb); /* initial frame */
646  ast->scale = avio_rl32(pb);
647  ast->rate = avio_rl32(pb);
648  if (!(ast->scale && ast->rate)) {
650  "scale/rate is %"PRIu32"/%"PRIu32" which is invalid. "
651  "(This file has been generated by broken software.)\n",
652  ast->scale,
653  ast->rate);
654  if (frame_period) {
655  ast->rate = 1000000;
656  ast->scale = frame_period;
657  } else {
658  ast->rate = 25;
659  ast->scale = 1;
660  }
661  }
662  avpriv_set_pts_info(st, 64, ast->scale, ast->rate);
663 
664  ast->cum_len = avio_rl32(pb); /* start */
665  st->nb_frames = avio_rl32(pb);
666 
667  st->start_time = 0;
668  avio_rl32(pb); /* buffer size */
669  avio_rl32(pb); /* quality */
670  if (ast->cum_len > 3600LL * ast->rate / ast->scale) {
671  av_log(s, AV_LOG_ERROR, "crazy start time, iam scared, giving up\n");
672  ast->cum_len = 0;
673  }
674  ast->sample_size = avio_rl32(pb);
675  ast->cum_len *= FFMAX(1, ast->sample_size);
676  av_log(s, AV_LOG_TRACE, "%"PRIu32" %"PRIu32" %d\n",
677  ast->rate, ast->scale, ast->sample_size);
678 
679  switch (tag1) {
680  case MKTAG('v', 'i', 'd', 's'):
682 
683  ast->sample_size = 0;
684  st->avg_frame_rate = av_inv_q(st->time_base);
685  break;
686  case MKTAG('a', 'u', 'd', 's'):
688  break;
689  case MKTAG('t', 'x', 't', 's'):
691  break;
692  case MKTAG('d', 'a', 't', 's'):
694  break;
695  default:
696  av_log(s, AV_LOG_INFO, "unknown stream type %X\n", tag1);
697  }
698 
699  if (ast->sample_size < 0) {
700  if (s->error_recognition & AV_EF_EXPLODE) {
702  "Invalid sample_size %d at stream %d\n",
703  ast->sample_size,
704  stream_index);
706  }
708  "Invalid sample_size %d at stream %d "
709  "setting it to 0\n",
710  ast->sample_size,
711  stream_index);
712  ast->sample_size = 0;
713  }
714 
715  if (ast->sample_size == 0) {
716  st->duration = st->nb_frames;
717  if (st->duration > 0 && avi->io_fsize > 0 && avi->riff_end > avi->io_fsize) {
718  av_log(s, AV_LOG_DEBUG, "File is truncated adjusting duration\n");
719  st->duration = av_rescale(st->duration, avi->io_fsize, avi->riff_end);
720  }
721  }
722  ast->frame_offset = ast->cum_len;
723  avio_skip(pb, size - 12 * 4);
724  break;
725  case MKTAG('s', 't', 'r', 'f'):
726  /* stream header */
727  if (!size && (codec_type == AVMEDIA_TYPE_AUDIO ||
729  break;
730  if (stream_index >= (unsigned)s->nb_streams || avi->dv_demux) {
731  avio_skip(pb, size);
732  } else {
733  uint64_t cur_pos = avio_tell(pb);
734  unsigned esize;
735  if (cur_pos < list_end)
736  size = FFMIN(size, list_end - cur_pos);
737  st = s->streams[stream_index];
739  avio_skip(pb, size);
740  break;
741  }
742  switch (codec_type) {
743  case AVMEDIA_TYPE_VIDEO:
744  if (amv_file_format) {
745  st->codecpar->width = avih_width;
746  st->codecpar->height = avih_height;
749  avio_skip(pb, size);
750  break;
751  }
752  tag1 = ff_get_bmp_header(pb, st, &esize);
753 
754  if (tag1 == MKTAG('D', 'X', 'S', 'B') ||
755  tag1 == MKTAG('D', 'X', 'S', 'A')) {
757  st->codecpar->codec_tag = tag1;
759  break;
760  }
761 
762  if (size > 10 * 4 && size < (1 << 30) && size < avi->fsize) {
763  if (esize == size-1 && (esize&1)) {
764  st->codecpar->extradata_size = esize - 10 * 4;
765  } else
766  st->codecpar->extradata_size = size - 10 * 4;
767  if (st->codecpar->extradata) {
768  av_log(s, AV_LOG_WARNING, "New extradata in strf chunk, freeing previous one.\n");
769  }
770  ret = ff_get_extradata(s, st->codecpar, pb,
771  st->codecpar->extradata_size);
772  if (ret < 0)
773  return ret;
774  }
775 
776  // FIXME: check if the encoder really did this correctly
777  if (st->codecpar->extradata_size & 1)
778  avio_r8(pb);
779 
780  /* Extract palette from extradata if bpp <= 8.
781  * This code assumes that extradata contains only palette.
782  * This is true for all paletted codecs implemented in
783  * FFmpeg. */
784  if (st->codecpar->extradata_size &&
785  (st->codecpar->bits_per_coded_sample <= 8)) {
786  int pal_size = (1 << st->codecpar->bits_per_coded_sample) << 2;
787  const uint8_t *pal_src;
788 
789  pal_size = FFMIN(pal_size, st->codecpar->extradata_size);
790  pal_src = st->codecpar->extradata +
791  st->codecpar->extradata_size - pal_size;
792  /* Exclude the "BottomUp" field from the palette */
793  if (pal_src - st->codecpar->extradata >= 9 &&
794  !memcmp(st->codecpar->extradata + st->codecpar->extradata_size - 9, "BottomUp", 9))
795  pal_src -= 9;
796  for (i = 0; i < pal_size / 4; i++)
797  ast->pal[i] = 0xFFU<<24 | AV_RL32(pal_src + 4 * i);
798  ast->has_pal = 1;
799  }
800 
801  print_tag(s, "video", tag1, 0);
802 
804  st->codecpar->codec_tag = tag1;
806  tag1);
807  /* If codec is not found yet, try with the mov tags. */
808  if (!st->codecpar->codec_id) {
809  st->codecpar->codec_id =
811  if (st->codecpar->codec_id)
813  "mov tag found in avi (fourcc %s)\n",
814  av_fourcc2str(tag1));
815  }
816  if (!st->codecpar->codec_id)
818 
819  /* This is needed to get the pict type which is necessary
820  * for generating correct pts. */
822 
823  if (st->codecpar->codec_id == AV_CODEC_ID_MPEG4 &&
824  ast->handler == MKTAG('X', 'V', 'I', 'D'))
825  st->codecpar->codec_tag = MKTAG('X', 'V', 'I', 'D');
826 
827  if (st->codecpar->codec_tag == MKTAG('V', 'S', 'S', 'H'))
829  if (st->codecpar->codec_id == AV_CODEC_ID_RV40)
831  if (st->codecpar->codec_id == AV_CODEC_ID_HEVC &&
832  st->codecpar->codec_tag == MKTAG('H', '2', '6', '5'))
834 
835  if (st->codecpar->codec_tag == 0 && st->codecpar->height > 0 &&
836  st->codecpar->extradata_size < 1U << 30) {
837  st->codecpar->extradata_size += 9;
838  if ((ret = av_reallocp(&st->codecpar->extradata,
839  st->codecpar->extradata_size +
841  st->codecpar->extradata_size = 0;
842  return ret;
843  } else
844  memcpy(st->codecpar->extradata + st->codecpar->extradata_size - 9,
845  "BottomUp", 9);
846  }
847  if (st->codecpar->height == INT_MIN)
848  return AVERROR_INVALIDDATA;
849  st->codecpar->height = FFABS(st->codecpar->height);
850 
851 // avio_skip(pb, size - 5 * 4);
852  break;
853  case AVMEDIA_TYPE_AUDIO:
854  ret = ff_get_wav_header(s, pb, st->codecpar, size, 0);
855  if (ret < 0)
856  return ret;
858  if (ast->sample_size && st->codecpar->block_align &&
859  ast->sample_size != st->codecpar->block_align) {
860  av_log(s,
862  "sample size (%d) != block align (%d)\n",
863  ast->sample_size,
864  st->codecpar->block_align);
865  ast->sample_size = st->codecpar->block_align;
866  }
867  /* 2-aligned
868  * (fix for Stargate SG-1 - 3x18 - Shades of Grey.avi) */
869  if (size & 1)
870  avio_skip(pb, 1);
871  /* Force parsing as several audio frames can be in
872  * one packet and timestamps refer to packet start. */
874  /* ADTS header is in extradata, AAC without header must be
875  * stored as exact frames. Parser not needed and it will
876  * fail. */
877  if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
880  // The flac parser does not work with AVSTREAM_PARSE_TIMESTAMPS
881  if (st->codecpar->codec_id == AV_CODEC_ID_FLAC)
883  /* AVI files with Xan DPCM audio (wrongly) declare PCM
884  * audio in the header but have Axan as stream_code_tag. */
885  if (ast->handler == AV_RL32("Axan")) {
887  st->codecpar->codec_tag = 0;
888  ast->dshow_block_align = 0;
889  }
890  if (amv_file_format) {
892  ast->dshow_block_align = 0;
893  }
894  if ((st->codecpar->codec_id == AV_CODEC_ID_AAC ||
896  st->codecpar->codec_id == AV_CODEC_ID_MP2 ) && ast->dshow_block_align <= 4 && ast->dshow_block_align) {
897  av_log(s, AV_LOG_DEBUG, "overriding invalid dshow_block_align of %d\n", ast->dshow_block_align);
898  ast->dshow_block_align = 0;
899  }
900  if (st->codecpar->codec_id == AV_CODEC_ID_AAC && ast->dshow_block_align == 1024 && ast->sample_size == 1024 ||
901  st->codecpar->codec_id == AV_CODEC_ID_AAC && ast->dshow_block_align == 4096 && ast->sample_size == 4096 ||
902  st->codecpar->codec_id == AV_CODEC_ID_MP3 && ast->dshow_block_align == 1152 && ast->sample_size == 1152) {
903  av_log(s, AV_LOG_DEBUG, "overriding sample_size\n");
904  ast->sample_size = 0;
905  }
906  break;
909  st->request_probe= 1;
910  avio_skip(pb, size);
911  break;
912  default:
915  st->codecpar->codec_tag = 0;
916  avio_skip(pb, size);
917  break;
918  }
919  }
920  break;
921  case MKTAG('s', 't', 'r', 'd'):
922  if (stream_index >= (unsigned)s->nb_streams
923  || s->streams[stream_index]->codecpar->extradata_size
924  || s->streams[stream_index]->codecpar->codec_tag == MKTAG('H','2','6','4')) {
925  avio_skip(pb, size);
926  } else {
927  uint64_t cur_pos = avio_tell(pb);
928  if (cur_pos < list_end)
929  size = FFMIN(size, list_end - cur_pos);
930  st = s->streams[stream_index];
931 
932  if (size<(1<<30)) {
933  if (st->codecpar->extradata) {
934  av_log(s, AV_LOG_WARNING, "New extradata in strd chunk, freeing previous one.\n");
935  }
936  if ((ret = ff_get_extradata(s, st->codecpar, pb, size)) < 0)
937  goto fail;
938  }
939 
940  if (st->codecpar->extradata_size & 1) //FIXME check if the encoder really did this correctly
941  avio_r8(pb);
942 
944  if (ret < 0) {
945  av_log(s, AV_LOG_WARNING, "could not decoding EXIF data in stream header.\n");
946  }
947  }
948  break;
949  case MKTAG('i', 'n', 'd', 'x'):
950  pos = avio_tell(pb);
951  if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && !(s->flags & AVFMT_FLAG_IGNIDX) &&
952  avi->use_odml &&
953  read_odml_index(s, 0) < 0 &&
954  (s->error_recognition & AV_EF_EXPLODE))
956  avio_seek(pb, pos + size, SEEK_SET);
957  break;
958  case MKTAG('v', 'p', 'r', 'p'):
959  if (stream_index < (unsigned)s->nb_streams && size > 9 * 4) {
960  AVRational active, active_aspect;
961 
962  st = s->streams[stream_index];
963  avio_rl32(pb);
964  avio_rl32(pb);
965  avio_rl32(pb);
966  avio_rl32(pb);
967  avio_rl32(pb);
968 
969  active_aspect.den = avio_rl16(pb);
970  active_aspect.num = avio_rl16(pb);
971  active.num = avio_rl32(pb);
972  active.den = avio_rl32(pb);
973  avio_rl32(pb); // nbFieldsPerFrame
974 
975  if (active_aspect.num && active_aspect.den &&
976  active.num && active.den) {
977  st->sample_aspect_ratio = av_div_q(active_aspect, active);
978  av_log(s, AV_LOG_TRACE, "vprp %d/%d %d/%d\n",
979  active_aspect.num, active_aspect.den,
980  active.num, active.den);
981  }
982  size -= 9 * 4;
983  }
984  avio_skip(pb, size);
985  break;
986  case MKTAG('s', 't', 'r', 'n'):
987  if (s->nb_streams) {
988  ret = avi_read_tag(s, s->streams[s->nb_streams - 1], tag, size);
989  if (ret < 0)
990  goto fail;
991  break;
992  }
993  default:
994  if (size > 1000000) {
996  "Something went wrong during header parsing, "
997  "tag %s has size %u, "
998  "I will ignore it and try to continue anyway.\n",
1000  if (s->error_recognition & AV_EF_EXPLODE)
1002  avi->movi_list = avio_tell(pb) - 4;
1003  avi->movi_end = avi->fsize;
1004  goto end_of_header;
1005  }
1006  /* Do not fail for very large idx1 tags */
1007  case MKTAG('i', 'd', 'x', '1'):
1008  /* skip tag */
1009  size += (size & 1);
1010  avio_skip(pb, size);
1011  break;
1012  }
1013  }
1014 
1015 end_of_header:
1016  /* check stream number */
1017  if (stream_index != s->nb_streams - 1) {
1019  }
1020 
1021  if (!avi->index_loaded && (pb->seekable & AVIO_SEEKABLE_NORMAL))
1022  avi_load_index(s);
1024  avi->index_loaded |= 1;
1025 
1026  if ((ret = guess_ni_flag(s)) < 0)
1027  goto fail;
1028 
1029  avi->non_interleaved |= ret | (s->flags & AVFMT_FLAG_SORT_DTS);
1030 
1031  dict_entry = av_dict_get(s->metadata, "ISFT", NULL, 0);
1032  if (dict_entry && !strcmp(dict_entry->value, "PotEncoder"))
1033  for (i = 0; i < s->nb_streams; i++) {
1034  AVStream *st = s->streams[i];
1038  }
1039 
1040  for (i = 0; i < s->nb_streams; i++) {
1041  AVStream *st = s->streams[i];
1042  if (st->nb_index_entries)
1043  break;
1044  }
1045  // DV-in-AVI cannot be non-interleaved, if set this must be
1046  // a mis-detection.
1047  if (avi->dv_demux)
1048  avi->non_interleaved = 0;
1049  if (i == s->nb_streams && avi->non_interleaved) {
1051  "Non-interleaved AVI without index, switching to interleaved\n");
1052  avi->non_interleaved = 0;
1053  }
1054 
1055  if (avi->non_interleaved) {
1056  av_log(s, AV_LOG_INFO, "non-interleaved AVI\n");
1057  clean_index(s);
1058  }
1059 
1062 
1063  return 0;
1064 fail:
1065  avi_read_close(s);
1066  return ret;
1067 }
1068 
1070 {
1071  if (pkt->size >= 7 &&
1072  pkt->size < INT_MAX - AVPROBE_PADDING_SIZE &&
1073  !strcmp(pkt->data, "GAB2") && AV_RL16(pkt->data + 5) == 2) {
1074  uint8_t desc[256];
1075  int score = AVPROBE_SCORE_EXTENSION, ret;
1076  AVIStream *ast = st->priv_data;
1077  ff_const59 AVInputFormat *sub_demuxer;
1078  AVRational time_base;
1079  int size;
1081  pkt->size - 7,
1082  0, NULL, NULL, NULL, NULL);
1083  AVProbeData pd;
1084  unsigned int desc_len = avio_rl32(pb);
1085 
1086  if (desc_len > pb->buf_end - pb->buf_ptr)
1087  goto error;
1088 
1089  ret = avio_get_str16le(pb, desc_len, desc, sizeof(desc));
1090  avio_skip(pb, desc_len - ret);
1091  if (*desc)
1092  av_dict_set(&st->metadata, "title", desc, 0);
1093 
1094  avio_rl16(pb); /* flags? */
1095  avio_rl32(pb); /* data size */
1096 
1097  size = pb->buf_end - pb->buf_ptr;
1099  .buf_size = size };
1100  if (!pd.buf)
1101  goto error;
1102  memcpy(pd.buf, pb->buf_ptr, size);
1103  sub_demuxer = av_probe_input_format2(&pd, 1, &score);
1104  av_freep(&pd.buf);
1105  if (!sub_demuxer)
1106  goto error;
1107 
1108  if (strcmp(sub_demuxer->name, "srt") && strcmp(sub_demuxer->name, "ass"))
1109  goto error;
1110 
1111  if (!(ast->sub_ctx = avformat_alloc_context()))
1112  goto error;
1113 
1114  ast->sub_ctx->pb = pb;
1115 
1116  if (ff_copy_whiteblacklists(ast->sub_ctx, s) < 0)
1117  goto error;
1118 
1119  if (!avformat_open_input(&ast->sub_ctx, "", sub_demuxer, NULL)) {
1120  if (ast->sub_ctx->nb_streams != 1)
1121  goto error;
1122  ff_read_packet(ast->sub_ctx, &ast->sub_pkt);
1124  time_base = ast->sub_ctx->streams[0]->time_base;
1125  avpriv_set_pts_info(st, 64, time_base.num, time_base.den);
1126  }
1127  ast->sub_buffer = pkt->buf;
1128  pkt->buf = NULL;
1130  return 1;
1131 
1132 error:
1133  av_freep(&ast->sub_ctx);
1134  avio_context_free(&pb);
1135  }
1136  return 0;
1137 }
1138 
1140  AVPacket *pkt)
1141 {
1142  AVIStream *ast, *next_ast = next_st->priv_data;
1143  int64_t ts, next_ts, ts_min = INT64_MAX;
1144  AVStream *st, *sub_st = NULL;
1145  int i;
1146 
1147  next_ts = av_rescale_q(next_ast->frame_offset, next_st->time_base,
1148  AV_TIME_BASE_Q);
1149 
1150  for (i = 0; i < s->nb_streams; i++) {
1151  st = s->streams[i];
1152  ast = st->priv_data;
1153  if (st->discard < AVDISCARD_ALL && ast && ast->sub_pkt.data) {
1154  ts = av_rescale_q(ast->sub_pkt.dts, st->time_base, AV_TIME_BASE_Q);
1155  if (ts <= next_ts && ts < ts_min) {
1156  ts_min = ts;
1157  sub_st = st;
1158  }
1159  }
1160  }
1161 
1162  if (sub_st) {
1163  ast = sub_st->priv_data;
1164  *pkt = ast->sub_pkt;
1165  pkt->stream_index = sub_st->index;
1166 
1167  if (ff_read_packet(ast->sub_ctx, &ast->sub_pkt) < 0)
1168  ast->sub_pkt.data = NULL;
1169  }
1170  return sub_st;
1171 }
1172 
1173 static int get_stream_idx(const unsigned *d)
1174 {
1175  if (d[0] >= '0' && d[0] <= '9' &&
1176  d[1] >= '0' && d[1] <= '9') {
1177  return (d[0] - '0') * 10 + (d[1] - '0');
1178  } else {
1179  return 100; // invalid stream ID
1180  }
1181 }
1182 
1183 /**
1184  *
1185  * @param exit_early set to 1 to just gather packet position without making the changes needed to actually read & return the packet
1186  */
1187 static int avi_sync(AVFormatContext *s, int exit_early)
1188 {
1189  AVIContext *avi = s->priv_data;
1190  AVIOContext *pb = s->pb;
1191  int n;
1192  unsigned int d[8];
1193  unsigned int size;
1194  int64_t i, sync;
1195 
1196 start_sync:
1197  memset(d, -1, sizeof(d));
1198  for (i = sync = avio_tell(pb); !avio_feof(pb); i++) {
1199  int j;
1200 
1201  for (j = 0; j < 7; j++)
1202  d[j] = d[j + 1];
1203  d[7] = avio_r8(pb);
1204 
1205  size = d[4] + (d[5] << 8) + (d[6] << 16) + (d[7] << 24);
1206 
1207  n = get_stream_idx(d + 2);
1208  ff_tlog(s, "%X %X %X %X %X %X %X %X %"PRId64" %u %d\n",
1209  d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], i, size, n);
1210  if (i*(avi->io_fsize>0) + (uint64_t)size > avi->fsize || d[0] > 127)
1211  continue;
1212 
1213  // parse ix##
1214  if ((d[0] == 'i' && d[1] == 'x' && n < s->nb_streams) ||
1215  // parse JUNK
1216  (d[0] == 'J' && d[1] == 'U' && d[2] == 'N' && d[3] == 'K') ||
1217  (d[0] == 'i' && d[1] == 'd' && d[2] == 'x' && d[3] == '1') ||
1218  (d[0] == 'i' && d[1] == 'n' && d[2] == 'd' && d[3] == 'x')) {
1219  avio_skip(pb, size);
1220  goto start_sync;
1221  }
1222 
1223  // parse stray LIST
1224  if (d[0] == 'L' && d[1] == 'I' && d[2] == 'S' && d[3] == 'T') {
1225  avio_skip(pb, 4);
1226  goto start_sync;
1227  }
1228 
1229  n = get_stream_idx(d);
1230 
1231  if (!((i - avi->last_pkt_pos) & 1) &&
1232  get_stream_idx(d + 1) < s->nb_streams)
1233  continue;
1234 
1235  // detect ##ix chunk and skip
1236  if (d[2] == 'i' && d[3] == 'x' && n < s->nb_streams) {
1237  avio_skip(pb, size);
1238  goto start_sync;
1239  }
1240 
1241  if (d[2] == 'w' && d[3] == 'c' && n < s->nb_streams) {
1242  avio_skip(pb, 16 * 3 + 8);
1243  goto start_sync;
1244  }
1245 
1246  if (avi->dv_demux && n != 0)
1247  continue;
1248 
1249  // parse ##dc/##wb
1250  if (n < s->nb_streams) {
1251  AVStream *st;
1252  AVIStream *ast;
1253  st = s->streams[n];
1254  ast = st->priv_data;
1255 
1256  if (!ast) {
1257  av_log(s, AV_LOG_WARNING, "Skipping foreign stream %d packet\n", n);
1258  continue;
1259  }
1260 
1261  if (s->nb_streams >= 2) {
1262  AVStream *st1 = s->streams[1];
1263  AVIStream *ast1 = st1->priv_data;
1264  // workaround for broken small-file-bug402.avi
1265  if (ast1 && d[2] == 'w' && d[3] == 'b'
1266  && n == 0
1267  && st ->codecpar->codec_type == AVMEDIA_TYPE_VIDEO
1269  && ast->prefix == 'd'*256+'c'
1270  && (d[2]*256+d[3] == ast1->prefix || !ast1->prefix_count)
1271  ) {
1272  n = 1;
1273  st = st1;
1274  ast = ast1;
1276  "Invalid stream + prefix combination, assuming audio.\n");
1277  }
1278  }
1279 
1280  if (d[2] == 'p' && d[3] == 'c' && size <= 4 * 256 + 4) {
1281  int k = avio_r8(pb);
1282  int last = (k + avio_r8(pb) - 1) & 0xFF;
1283 
1284  avio_rl16(pb); // flags
1285 
1286  // b + (g << 8) + (r << 16);
1287  for (; k <= last; k++)
1288  ast->pal[k] = 0xFFU<<24 | avio_rb32(pb)>>8;
1289 
1290  ast->has_pal = 1;
1291  goto start_sync;
1292  } else if (((ast->prefix_count < 5 || sync + 9 > i) &&
1293  d[2] < 128 && d[3] < 128) ||
1294  d[2] * 256 + d[3] == ast->prefix /* ||
1295  (d[2] == 'd' && d[3] == 'c') ||
1296  (d[2] == 'w' && d[3] == 'b') */) {
1297  if (exit_early)
1298  return 0;
1299  if (d[2] * 256 + d[3] == ast->prefix)
1300  ast->prefix_count++;
1301  else {
1302  ast->prefix = d[2] * 256 + d[3];
1303  ast->prefix_count = 0;
1304  }
1305 
1306  if (!avi->dv_demux &&
1307  ((st->discard >= AVDISCARD_DEFAULT && size == 0) /* ||
1308  // FIXME: needs a little reordering
1309  (st->discard >= AVDISCARD_NONKEY &&
1310  !(pkt->flags & AV_PKT_FLAG_KEY)) */
1311  || st->discard >= AVDISCARD_ALL)) {
1312 
1313  ast->frame_offset += get_duration(ast, size);
1314  avio_skip(pb, size);
1315  goto start_sync;
1316  }
1317 
1318  avi->stream_index = n;
1319  ast->packet_size = size + 8;
1320  ast->remaining = size;
1321 
1322  if (size) {
1323  uint64_t pos = avio_tell(pb) - 8;
1324  if (!st->index_entries || !st->nb_index_entries ||
1325  st->index_entries[st->nb_index_entries - 1].pos < pos) {
1327  0, AVINDEX_KEYFRAME);
1328  }
1329  }
1330  return 0;
1331  }
1332  }
1333  }
1334 
1335  if (pb->error)
1336  return pb->error;
1337  return AVERROR_EOF;
1338 }
1339 
1341 {
1342  AVIContext *avi = s->priv_data;
1343  int best_stream_index = 0;
1344  AVStream *best_st = NULL;
1345  AVIStream *best_ast;
1346  int64_t best_ts = INT64_MAX;
1347  int i;
1348 
1349  for (i = 0; i < s->nb_streams; i++) {
1350  AVStream *st = s->streams[i];
1351  AVIStream *ast = st->priv_data;
1352  int64_t ts = ast->frame_offset;
1353  int64_t last_ts;
1354 
1355  if (!st->nb_index_entries)
1356  continue;
1357 
1358  last_ts = st->index_entries[st->nb_index_entries - 1].timestamp;
1359  if (!ast->remaining && ts > last_ts)
1360  continue;
1361 
1362  ts = av_rescale_q(ts, st->time_base,
1363  (AVRational) { FFMAX(1, ast->sample_size),
1364  AV_TIME_BASE });
1365 
1366  av_log(s, AV_LOG_TRACE, "%"PRId64" %d/%d %"PRId64"\n", ts,
1367  st->time_base.num, st->time_base.den, ast->frame_offset);
1368  if (ts < best_ts) {
1369  best_ts = ts;
1370  best_st = st;
1371  best_stream_index = i;
1372  }
1373  }
1374  if (!best_st)
1375  return AVERROR_EOF;
1376 
1377  best_ast = best_st->priv_data;
1378  best_ts = best_ast->frame_offset;
1379  if (best_ast->remaining) {
1380  i = av_index_search_timestamp(best_st,
1381  best_ts,
1382  AVSEEK_FLAG_ANY |
1384  } else {
1385  i = av_index_search_timestamp(best_st, best_ts, AVSEEK_FLAG_ANY);
1386  if (i >= 0)
1387  best_ast->frame_offset = best_st->index_entries[i].timestamp;
1388  }
1389 
1390  if (i >= 0) {
1391  int64_t pos = best_st->index_entries[i].pos;
1392  pos += best_ast->packet_size - best_ast->remaining;
1393  if (avio_seek(s->pb, pos + 8, SEEK_SET) < 0)
1394  return AVERROR_EOF;
1395 
1396  av_assert0(best_ast->remaining <= best_ast->packet_size);
1397 
1398  avi->stream_index = best_stream_index;
1399  if (!best_ast->remaining)
1400  best_ast->packet_size =
1401  best_ast->remaining = best_st->index_entries[i].size;
1402  }
1403  else
1404  return AVERROR_EOF;
1405 
1406  return 0;
1407 }
1408 
1410 {
1411  AVIContext *avi = s->priv_data;
1412  AVIOContext *pb = s->pb;
1413  int err;
1414 
1415  if (CONFIG_DV_DEMUXER && avi->dv_demux) {
1416  int size = avpriv_dv_get_packet(avi->dv_demux, pkt);
1417  if (size >= 0)
1418  return size;
1419  else
1420  goto resync;
1421  }
1422 
1423  if (avi->non_interleaved) {
1424  err = ni_prepare_read(s);
1425  if (err < 0)
1426  return err;
1427  }
1428 
1429 resync:
1430  if (avi->stream_index >= 0) {
1431  AVStream *st = s->streams[avi->stream_index];
1432  AVIStream *ast = st->priv_data;
1433  int dv_demux = CONFIG_DV_DEMUXER && avi->dv_demux;
1434  int size, err;
1435 
1436  if (get_subtitle_pkt(s, st, pkt))
1437  return 0;
1438 
1439  // minorityreport.AVI block_align=1024 sample_size=1 IMA-ADPCM
1440  if (ast->sample_size <= 1)
1441  size = INT_MAX;
1442  else if (ast->sample_size < 32)
1443  // arbitrary multiplier to avoid tiny packets for raw PCM data
1444  size = 1024 * ast->sample_size;
1445  else
1446  size = ast->sample_size;
1447 
1448  if (size > ast->remaining)
1449  size = ast->remaining;
1450  avi->last_pkt_pos = avio_tell(pb);
1451  err = av_get_packet(pb, pkt, size);
1452  if (err < 0)
1453  return err;
1454  size = err;
1455 
1456  if (ast->has_pal && pkt->size < (unsigned)INT_MAX / 2 && !dv_demux) {
1457  uint8_t *pal;
1460  AVPALETTE_SIZE);
1461  if (!pal) {
1463  "Failed to allocate data for palette\n");
1464  } else {
1465  memcpy(pal, ast->pal, AVPALETTE_SIZE);
1466  ast->has_pal = 0;
1467  }
1468  }
1469 
1470  if (dv_demux) {
1471  AVBufferRef *avbuf = pkt->buf;
1473  pkt->data, pkt->size, pkt->pos);
1474  pkt->buf = avbuf;
1476  if (size < 0)
1478  } else if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE &&
1479  !st->codecpar->codec_tag && read_gab2_sub(s, st, pkt)) {
1480  ast->frame_offset++;
1481  avi->stream_index = -1;
1482  ast->remaining = 0;
1483  goto resync;
1484  } else {
1485  /* XXX: How to handle B-frames in AVI? */
1486  pkt->dts = ast->frame_offset;
1487 // pkt->dts += ast->start;
1488  if (ast->sample_size)
1489  pkt->dts /= ast->sample_size;
1490  pkt->stream_index = avi->stream_index;
1491 
1492  if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && st->index_entries) {
1493  AVIndexEntry *e;
1494  int index;
1495 
1497  e = &st->index_entries[index];
1498 
1499  if (index >= 0 && e->timestamp == ast->frame_offset) {
1500  if (index == st->nb_index_entries-1) {
1501  int key=1;
1502  uint32_t state=-1;
1503  if (st->codecpar->codec_id == AV_CODEC_ID_MPEG4) {
1504  const uint8_t *ptr = pkt->data, *end = ptr + FFMIN(size, 256);
1505  while (ptr < end) {
1506  ptr = avpriv_find_start_code(ptr, end, &state);
1507  if (state == 0x1B6 && ptr < end) {
1508  key = !(*ptr & 0xC0);
1509  break;
1510  }
1511  }
1512  }
1513  if (!key)
1514  e->flags &= ~AVINDEX_KEYFRAME;
1515  }
1516  if (e->flags & AVINDEX_KEYFRAME)
1518  }
1519  } else {
1521  }
1522  ast->frame_offset += get_duration(ast, pkt->size);
1523  }
1524  ast->remaining -= err;
1525  if (!ast->remaining) {
1526  avi->stream_index = -1;
1527  ast->packet_size = 0;
1528  }
1529 
1530  if (!avi->non_interleaved && pkt->pos >= 0 && ast->seek_pos > pkt->pos) {
1532  goto resync;
1533  }
1534  ast->seek_pos= 0;
1535 
1536  if (!avi->non_interleaved && st->nb_index_entries>1 && avi->index_loaded>1) {
1537  int64_t dts= av_rescale_q(pkt->dts, st->time_base, AV_TIME_BASE_Q);
1538 
1539  if (avi->dts_max < dts) {
1540  avi->dts_max = dts;
1541  } else if (avi->dts_max - (uint64_t)dts > 2*AV_TIME_BASE) {
1542  avi->non_interleaved= 1;
1543  av_log(s, AV_LOG_INFO, "Switching to NI mode, due to poor interleaving\n");
1544  }
1545  }
1546 
1547  return 0;
1548  }
1549 
1550  if ((err = avi_sync(s, 0)) < 0)
1551  return err;
1552  goto resync;
1553 }
1554 
1555 /* XXX: We make the implicit supposition that the positions are sorted
1556  * for each stream. */
1558 {
1559  AVIContext *avi = s->priv_data;
1560  AVIOContext *pb = s->pb;
1561  int nb_index_entries, i;
1562  AVStream *st;
1563  AVIStream *ast;
1564  int64_t pos;
1565  unsigned int index, tag, flags, len, first_packet = 1;
1566  int64_t last_pos = -1;
1567  unsigned last_idx = -1;
1568  int64_t idx1_pos, first_packet_pos = 0, data_offset = 0;
1569  int anykey = 0;
1570 
1571  nb_index_entries = size / 16;
1572  if (nb_index_entries <= 0)
1573  return AVERROR_INVALIDDATA;
1574 
1575  idx1_pos = avio_tell(pb);
1576  avio_seek(pb, avi->movi_list + 4, SEEK_SET);
1577  if (avi_sync(s, 1) == 0)
1578  first_packet_pos = avio_tell(pb) - 8;
1579  avi->stream_index = -1;
1580  avio_seek(pb, idx1_pos, SEEK_SET);
1581 
1582  if (s->nb_streams == 1 && s->streams[0]->codecpar->codec_tag == AV_RL32("MMES")) {
1583  first_packet_pos = 0;
1584  data_offset = avi->movi_list;
1585  }
1586 
1587  /* Read the entries and sort them in each stream component. */
1588  for (i = 0; i < nb_index_entries; i++) {
1589  if (avio_feof(pb))
1590  return -1;
1591 
1592  tag = avio_rl32(pb);
1593  flags = avio_rl32(pb);
1594  pos = avio_rl32(pb);
1595  len = avio_rl32(pb);
1596  av_log(s, AV_LOG_TRACE, "%d: tag=0x%x flags=0x%x pos=0x%"PRIx64" len=%d/",
1597  i, tag, flags, pos, len);
1598 
1599  index = ((tag & 0xff) - '0') * 10;
1600  index += (tag >> 8 & 0xff) - '0';
1601  if (index >= s->nb_streams)
1602  continue;
1603  st = s->streams[index];
1604  ast = st->priv_data;
1605 
1606  /* Skip 'xxpc' palette change entries in the index until a logic
1607  * to process these is properly implemented. */
1608  if ((tag >> 16 & 0xff) == 'p' && (tag >> 24 & 0xff) == 'c')
1609  continue;
1610 
1611  if (first_packet && first_packet_pos) {
1612  if (avi->movi_list + 4 != pos || pos + 500 > first_packet_pos)
1613  data_offset = first_packet_pos - pos;
1614  first_packet = 0;
1615  }
1616  pos += data_offset;
1617 
1618  av_log(s, AV_LOG_TRACE, "%d cum_len=%"PRId64"\n", len, ast->cum_len);
1619 
1620  // even if we have only a single stream, we should
1621  // switch to non-interleaved to get correct timestamps
1622  if (last_pos == pos)
1623  avi->non_interleaved = 1;
1624  if (last_idx != pos && len) {
1625  av_add_index_entry(st, pos, ast->cum_len, len, 0,
1626  (flags & AVIIF_INDEX) ? AVINDEX_KEYFRAME : 0);
1627  last_idx= pos;
1628  }
1629  ast->cum_len += get_duration(ast, len);
1630  last_pos = pos;
1631  anykey |= flags&AVIIF_INDEX;
1632  }
1633  if (!anykey) {
1634  for (index = 0; index < s->nb_streams; index++) {
1635  st = s->streams[index];
1636  if (st->nb_index_entries)
1638  }
1639  }
1640  return 0;
1641 }
1642 
1643 /* Scan the index and consider any file with streams more than
1644  * 2 seconds or 64MB apart non-interleaved. */
1646 {
1647  int64_t min_pos, pos;
1648  int i;
1649  int *idx = av_mallocz_array(s->nb_streams, sizeof(*idx));
1650  if (!idx)
1651  return AVERROR(ENOMEM);
1652  for (min_pos = pos = 0; min_pos != INT64_MAX; pos = min_pos + 1LU) {
1653  int64_t max_dts = INT64_MIN / 2;
1654  int64_t min_dts = INT64_MAX / 2;
1655  int64_t max_buffer = 0;
1656 
1657  min_pos = INT64_MAX;
1658 
1659  for (i = 0; i < s->nb_streams; i++) {
1660  AVStream *st = s->streams[i];
1661  AVIStream *ast = st->priv_data;
1662  int n = st->nb_index_entries;
1663  while (idx[i] < n && st->index_entries[idx[i]].pos < pos)
1664  idx[i]++;
1665  if (idx[i] < n) {
1666  int64_t dts;
1667  dts = av_rescale_q(st->index_entries[idx[i]].timestamp /
1668  FFMAX(ast->sample_size, 1),
1669  st->time_base, AV_TIME_BASE_Q);
1670  min_dts = FFMIN(min_dts, dts);
1671  min_pos = FFMIN(min_pos, st->index_entries[idx[i]].pos);
1672  }
1673  }
1674  for (i = 0; i < s->nb_streams; i++) {
1675  AVStream *st = s->streams[i];
1676  AVIStream *ast = st->priv_data;
1677 
1678  if (idx[i] && min_dts != INT64_MAX / 2) {
1679  int64_t dts;
1680  dts = av_rescale_q(st->index_entries[idx[i] - 1].timestamp /
1681  FFMAX(ast->sample_size, 1),
1682  st->time_base, AV_TIME_BASE_Q);
1683  max_dts = FFMAX(max_dts, dts);
1684  max_buffer = FFMAX(max_buffer,
1685  av_rescale(dts - min_dts,
1686  st->codecpar->bit_rate,
1687  AV_TIME_BASE));
1688  }
1689  }
1690  if (max_dts - min_dts > 2 * AV_TIME_BASE ||
1691  max_buffer > 1024 * 1024 * 8 * 8) {
1692  av_free(idx);
1693  return 1;
1694  }
1695  }
1696  av_free(idx);
1697  return 0;
1698 }
1699 
1701 {
1702  int i;
1703  int64_t last_start = 0;
1704  int64_t first_end = INT64_MAX;
1705  int64_t oldpos = avio_tell(s->pb);
1706 
1707  for (i = 0; i < s->nb_streams; i++) {
1708  AVStream *st = s->streams[i];
1709  int n = st->nb_index_entries;
1710  unsigned int size;
1711 
1712  if (n <= 0)
1713  continue;
1714 
1715  if (n >= 2) {
1716  int64_t pos = st->index_entries[0].pos;
1717  unsigned tag[2];
1718  avio_seek(s->pb, pos, SEEK_SET);
1719  tag[0] = avio_r8(s->pb);
1720  tag[1] = avio_r8(s->pb);
1721  avio_rl16(s->pb);
1722  size = avio_rl32(s->pb);
1723  if (get_stream_idx(tag) == i && pos + size > st->index_entries[1].pos)
1724  last_start = INT64_MAX;
1725  if (get_stream_idx(tag) == i && size == st->index_entries[0].size + 8)
1726  last_start = INT64_MAX;
1727  }
1728 
1729  if (st->index_entries[0].pos > last_start)
1730  last_start = st->index_entries[0].pos;
1731  if (st->index_entries[n - 1].pos < first_end)
1732  first_end = st->index_entries[n - 1].pos;
1733  }
1734  avio_seek(s->pb, oldpos, SEEK_SET);
1735 
1736  if (last_start > first_end)
1737  return 1;
1738 
1739  return check_stream_max_drift(s);
1740 }
1741 
1743 {
1744  AVIContext *avi = s->priv_data;
1745  AVIOContext *pb = s->pb;
1746  uint32_t tag, size;
1747  int64_t pos = avio_tell(pb);
1748  int64_t next;
1749  int ret = -1;
1750 
1751  if (avio_seek(pb, avi->movi_end, SEEK_SET) < 0)
1752  goto the_end; // maybe truncated file
1753  av_log(s, AV_LOG_TRACE, "movi_end=0x%"PRIx64"\n", avi->movi_end);
1754  for (;;) {
1755  tag = avio_rl32(pb);
1756  size = avio_rl32(pb);
1757  if (avio_feof(pb))
1758  break;
1759  next = avio_tell(pb);
1760  if (next < 0 || next > INT64_MAX - size - (size & 1))
1761  break;
1762  next += size + (size & 1LL);
1763 
1764  if (tag == MKTAG('i', 'd', 'x', '1') &&
1765  avi_read_idx1(s, size) >= 0) {
1766  avi->index_loaded=2;
1767  ret = 0;
1768  }else if (tag == MKTAG('L', 'I', 'S', 'T')) {
1769  uint32_t tag1 = avio_rl32(pb);
1770 
1771  if (tag1 == MKTAG('I', 'N', 'F', 'O'))
1772  ff_read_riff_info(s, size - 4);
1773  }else if (!ret)
1774  break;
1775 
1776  if (avio_seek(pb, next, SEEK_SET) < 0)
1777  break; // something is wrong here
1778  }
1779 
1780 the_end:
1781  avio_seek(pb, pos, SEEK_SET);
1782  return ret;
1783 }
1784 
1785 static void seek_subtitle(AVStream *st, AVStream *st2, int64_t timestamp)
1786 {
1787  AVIStream *ast2 = st2->priv_data;
1788  int64_t ts2 = av_rescale_q(timestamp, st->time_base, st2->time_base);
1789  av_packet_unref(&ast2->sub_pkt);
1790  if (avformat_seek_file(ast2->sub_ctx, 0, INT64_MIN, ts2, ts2, 0) >= 0 ||
1791  avformat_seek_file(ast2->sub_ctx, 0, ts2, ts2, INT64_MAX, 0) >= 0)
1792  ff_read_packet(ast2->sub_ctx, &ast2->sub_pkt);
1793 }
1794 
1795 static int avi_read_seek(AVFormatContext *s, int stream_index,
1796  int64_t timestamp, int flags)
1797 {
1798  AVIContext *avi = s->priv_data;
1799  AVStream *st;
1800  int i, index;
1801  int64_t pos, pos_min;
1802  AVIStream *ast;
1803 
1804  /* Does not matter which stream is requested dv in avi has the
1805  * stream information in the first video stream.
1806  */
1807  if (avi->dv_demux)
1808  stream_index = 0;
1809 
1810  if (!avi->index_loaded) {
1811  /* we only load the index on demand */
1812  avi_load_index(s);
1813  avi->index_loaded |= 1;
1814  }
1815  av_assert0(stream_index >= 0);
1816 
1817  st = s->streams[stream_index];
1818  ast = st->priv_data;
1820  timestamp * FFMAX(ast->sample_size, 1),
1821  flags);
1822  if (index < 0) {
1823  if (st->nb_index_entries > 0)
1824  av_log(s, AV_LOG_DEBUG, "Failed to find timestamp %"PRId64 " in index %"PRId64 " .. %"PRId64 "\n",
1825  timestamp * FFMAX(ast->sample_size, 1),
1826  st->index_entries[0].timestamp,
1828  return AVERROR_INVALIDDATA;
1829  }
1830 
1831  /* find the position */
1832  pos = st->index_entries[index].pos;
1833  timestamp = st->index_entries[index].timestamp / FFMAX(ast->sample_size, 1);
1834 
1835  av_log(s, AV_LOG_TRACE, "XX %"PRId64" %d %"PRId64"\n",
1836  timestamp, index, st->index_entries[index].timestamp);
1837 
1838  if (CONFIG_DV_DEMUXER && avi->dv_demux) {
1839  /* One and only one real stream for DV in AVI, and it has video */
1840  /* offsets. Calling with other stream indexes should have failed */
1841  /* the av_index_search_timestamp call above. */
1842 
1843  if (avio_seek(s->pb, pos, SEEK_SET) < 0)
1844  return -1;
1845 
1846  /* Feed the DV video stream version of the timestamp to the */
1847  /* DV demux so it can synthesize correct timestamps. */
1848  ff_dv_offset_reset(avi->dv_demux, timestamp);
1849 
1850  avi->stream_index = -1;
1851  return 0;
1852  }
1853 
1854  pos_min = pos;
1855  for (i = 0; i < s->nb_streams; i++) {
1856  AVStream *st2 = s->streams[i];
1857  AVIStream *ast2 = st2->priv_data;
1858 
1859  ast2->packet_size =
1860  ast2->remaining = 0;
1861 
1862  if (ast2->sub_ctx) {
1863  seek_subtitle(st, st2, timestamp);
1864  continue;
1865  }
1866 
1867  if (st2->nb_index_entries <= 0)
1868  continue;
1869 
1870 // av_assert1(st2->codecpar->block_align);
1872  av_rescale_q(timestamp,
1873  st->time_base,
1874  st2->time_base) *
1875  FFMAX(ast2->sample_size, 1),
1876  flags |
1879  if (index < 0)
1880  index = 0;
1881  ast2->seek_pos = st2->index_entries[index].pos;
1882  pos_min = FFMIN(pos_min,ast2->seek_pos);
1883  }
1884  for (i = 0; i < s->nb_streams; i++) {
1885  AVStream *st2 = s->streams[i];
1886  AVIStream *ast2 = st2->priv_data;
1887 
1888  if (ast2->sub_ctx || st2->nb_index_entries <= 0)
1889  continue;
1890 
1892  st2,
1893  av_rescale_q(timestamp, st->time_base, st2->time_base) * FFMAX(ast2->sample_size, 1),
1895  if (index < 0)
1896  index = 0;
1897  while (!avi->non_interleaved && index>0 && st2->index_entries[index-1].pos >= pos_min)
1898  index--;
1899  ast2->frame_offset = st2->index_entries[index].timestamp;
1900  }
1901 
1902  /* do the seek */
1903  if (avio_seek(s->pb, pos_min, SEEK_SET) < 0) {
1904  av_log(s, AV_LOG_ERROR, "Seek failed\n");
1905  return -1;
1906  }
1907  avi->stream_index = -1;
1908  avi->dts_max = INT_MIN;
1909  return 0;
1910 }
1911 
1913 {
1914  int i;
1915  AVIContext *avi = s->priv_data;
1916 
1917  for (i = 0; i < s->nb_streams; i++) {
1918  AVStream *st = s->streams[i];
1919  AVIStream *ast = st->priv_data;
1920  if (ast) {
1921  if (ast->sub_ctx) {
1922  av_freep(&ast->sub_ctx->pb);
1924  }
1925  av_buffer_unref(&ast->sub_buffer);
1926  av_packet_unref(&ast->sub_pkt);
1927  }
1928  }
1929 
1930  av_freep(&avi->dv_demux);
1931 
1932  return 0;
1933 }
1934 
1935 static int avi_probe(const AVProbeData *p)
1936 {
1937  int i;
1938 
1939  /* check file header */
1940  for (i = 0; avi_headers[i][0]; i++)
1941  if (AV_RL32(p->buf ) == AV_RL32(avi_headers[i] ) &&
1942  AV_RL32(p->buf + 8) == AV_RL32(avi_headers[i] + 4))
1943  return AVPROBE_SCORE_MAX;
1944 
1945  return 0;
1946 }
1947 
1949  .name = "avi",
1950  .long_name = NULL_IF_CONFIG_SMALL("AVI (Audio Video Interleaved)"),
1951  .priv_data_size = sizeof(AVIContext),
1952  .extensions = "avi",
1953  .read_probe = avi_probe,
1958  .priv_class = &demuxer_class,
1959 };
AVStream::index_entries
AVIndexEntry * index_entries
Only used if the format does not support seeking natively.
Definition: avformat.h:1094
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:29
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: avpacket.c:605
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:204
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:182
AVCodecParameters::extradata
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: codec_par.h:74
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
avformat_new_stream
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
Definition: utils.c:4526
options
static const AVOption options[]
Definition: avidec.c:88
ni_prepare_read
static int ni_prepare_read(AVFormatContext *s)
Definition: avidec.c:1340
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:56
AV_WL32
#define AV_WL32(p, v)
Definition: intreadwrite.h:426
ff_get_extradata
int ff_get_extradata(AVFormatContext *s, AVCodecParameters *par, AVIOContext *pb, int size)
Allocate extradata with additional AV_INPUT_BUFFER_PADDING_SIZE at end which is always set to 0 and f...
Definition: utils.c:3346
AVIStream::sub_ctx
AVFormatContext * sub_ctx
Definition: avidec.c:61
avi_read_idx1
static int avi_read_idx1(AVFormatContext *s, int size)
Definition: avidec.c:1557
GetByteContext
Definition: bytestream.h:33
demuxer_class
static const AVClass demuxer_class
Definition: avidec.c:93
AVFMT_FLAG_IGNIDX
#define AVFMT_FLAG_IGNIDX
Ignore index.
Definition: avformat.h:1468
AVStream::priv_data
void * priv_data
Definition: avformat.h:880
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:55
MKTAG
#define MKTAG(a, b, c, d)
Definition: common.h:406
AVStream::discard
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
Definition: avformat.h:920
av_div_q
AVRational av_div_q(AVRational b, AVRational c)
Divide one rational by another.
Definition: rational.c:88
avio_context_free
void avio_context_free(AVIOContext **s)
Free the supplied IO context and everything associated with it.
Definition: aviobuf.c:143
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:260
AVIStream
Definition: avidec.c:41
av_strcasecmp
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
Definition: avstring.c:213
AVIContext::is_odml
int is_odml
Definition: avidec.c:77
ff_free_stream
void ff_free_stream(AVFormatContext *s, AVStream *st)
Definition: utils.c:4447
AV_CODEC_ID_MPEG4
@ AV_CODEC_ID_MPEG4
Definition: codec_id.h:61
end
static av_cold int end(AVCodecContext *avctx)
Definition: avrndec.c:92
AVFormatContext::streams
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1403
RETURN_ERROR
#define RETURN_ERROR(code)
Definition: avidec.c:471
MAX_ODML_DEPTH
#define MAX_ODML_DEPTH
Definition: avidec.c:83
internal.h
AVPacket::data
uint8_t * data
Definition: packet.h:355
AVOption
AVOption.
Definition: opt.h:246
avi_read_close
static int avi_read_close(AVFormatContext *s)
Definition: avidec.c:1912
AV_PKT_DATA_PALETTE
@ AV_PKT_DATA_PALETTE
An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE bytes worth of palette.
Definition: packet.h:46
AVStream::avg_frame_rate
AVRational avg_frame_rate
Average framerate.
Definition: avformat.h:938
data
const char data[16]
Definition: mxf.c:91
AVIOContext::error
int error
contains the error code or 0 if no error happened
Definition: avio.h:245
AVMetadataConv
Definition: metadata.h:34
av_mallocz_array
void * av_mallocz_array(size_t nmemb, size_t size)
Definition: mem.c:190
base
uint8_t base
Definition: vp3data.h:202
avi_read_nikon
static void avi_read_nikon(AVFormatContext *s, uint64_t end)
Definition: avidec.c:346
ff_codec_bmp_tags_unofficial
const AVCodecTag ff_codec_bmp_tags_unofficial[]
Definition: riff.c:500
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: codec_par.h:64
max
#define max(a, b)
Definition: cuda_runtime.h:33
ff_tlog
#define ff_tlog(ctx,...)
Definition: internal.h:86
mathematics.h
avpriv_find_start_code
const uint8_t * avpriv_find_start_code(const uint8_t *p, const uint8_t *end, uint32_t *state)
AVDictionary
Definition: dict.c:30
AV_CODEC_ID_FLAC
@ AV_CODEC_ID_FLAC
Definition: codec_id.h:422
avi_metadata_creation_time
static void avi_metadata_creation_time(AVDictionary **metadata, char *date)
Definition: avidec.c:327
avpriv_exif_decode_ifd
int avpriv_exif_decode_ifd(void *logctx, const uint8_t *buf, int size, int le, int depth, AVDictionary **metadata)
Recursively decodes all IFD's and adds included TAGS into the metadata dictionary.
Definition: exif.c:144
read_gab2_sub
static int read_gab2_sub(AVFormatContext *s, AVStream *st, AVPacket *pkt)
Definition: avidec.c:1069
codec_type
enum AVMediaType codec_type
Definition: rtp.c:37
avio_size
int64_t avio_size(AVIOContext *s)
Get the filesize.
Definition: aviobuf.c:334
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:388
AVIndexEntry
Definition: avformat.h:795
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
ff_const59
#define ff_const59
The ff_const59 define is not part of the public API and will be removed without further warning.
Definition: avformat.h:535
AVINDEX_KEYFRAME
#define AVINDEX_KEYFRAME
Definition: avformat.h:803
AVIContext::riff_end
int64_t riff_end
Definition: avidec.c:70
check_stream_max_drift
static int check_stream_max_drift(AVFormatContext *s)
Definition: avidec.c:1645
AVPROBE_SCORE_MAX
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:453
bytestream2_skip
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
Definition: bytestream.h:164
avformat_close_input
void avformat_close_input(AVFormatContext **s)
Close an opened input AVFormatContext.
Definition: utils.c:4498
AVIF_MUSTUSEINDEX
#define AVIF_MUSTUSEINDEX
Definition: avi.h:25
avpriv_dv_produce_packet
int avpriv_dv_produce_packet(DVDemuxContext *c, AVPacket *pkt, uint8_t *buf, int buf_size, int64_t pos)
Definition: dv.c:364
calculate_bitrate
static int calculate_bitrate(AVFormatContext *s)
Definition: avidec.c:427
ff_get_bmp_header
int ff_get_bmp_header(AVIOContext *pb, AVStream *st, uint32_t *size)
Read BITMAPINFOHEADER structure and set AVStream codec width, height and bits_per_encoded_sample fiel...
Definition: riffdec.c:209
U
#define U(x)
Definition: vp56_arith.h:37
AVIStream::has_pal
int has_pal
Definition: avidec.c:57
fail
#define fail()
Definition: checkasm.h:123
AVSEEK_FLAG_ANY
#define AVSEEK_FLAG_ANY
seek to any frame, even non-keyframes
Definition: avformat.h:2498
read_seek
static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, int flags)
Definition: libcdio.c:153
av_add_index_entry
int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp, int size, int distance, int flags)
Add an index entry into a sorted list.
Definition: utils.c:2052
AV_CODEC_ID_XAN_DPCM
@ AV_CODEC_ID_XAN_DPCM
Definition: codec_id.h:402
clean_index
static void clean_index(AVFormatContext *s)
Definition: avidec.c:270
read_close
static av_cold int read_close(AVFormatContext *ctx)
Definition: libcdio.c:145
avio_tell
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:557
ff_read_packet
int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
Read a transport packet from a media file.
Definition: utils.c:828
dv.h
avi_read_seek
static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
Definition: avidec.c:1795
AVPROBE_PADDING_SIZE
#define AVPROBE_PADDING_SIZE
extra allocated bytes at the end of the probe buffer
Definition: avformat.h:455
AV_CODEC_ID_MP3
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
Definition: codec_id.h:411
AVStream::duration
int64_t duration
Decoding: duration of the stream, in stream time base.
Definition: avformat.h:914
avio_rl16
unsigned int avio_rl16(AVIOContext *s)
Definition: aviobuf.c:731
AVRational::num
int num
Numerator.
Definition: rational.h:59
AVIStream::handler
uint32_t handler
Definition: avidec.c:47
AV_DICT_DONT_STRDUP_VAL
#define AV_DICT_DONT_STRDUP_VAL
Take ownership of a value that's been allocated with av_malloc() or another memory allocation functio...
Definition: dict.h:74
seek_subtitle
static void seek_subtitle(AVStream *st, AVStream *st2, int64_t timestamp)
Definition: avidec.c:1785
AVIStream::pal
uint32_t pal[256]
Definition: avidec.c:56
avassert.h
avi_read_tag
static int avi_read_tag(AVFormatContext *s, AVStream *st, uint32_t tag, uint32_t size)
Definition: avidec.c:298
avio_rb32
unsigned int avio_rb32(AVIOContext *s)
Definition: aviobuf.c:778
AV_LOG_TRACE
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition: log.h:202
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
AVInputFormat
Definition: avformat.h:636
duration
int64_t duration
Definition: movenc.c:63
avi_sync
static int avi_sync(AVFormatContext *s, int exit_early)
Definition: avidec.c:1187
avio_get_str16le
int avio_get_str16le(AVIOContext *pb, int maxlen, char *buf, int buflen)
Read a UTF-16 string from pb and convert it to UTF-8.
av_dict_get
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
Definition: dict.c:40
AVIContext
Definition: avidec.c:68
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:257
print_tag
#define print_tag(s, str, tag, size)
Definition: avidec.c:120
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:641
AVProbeData::buf
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:443
AVIContext::movi_list
int64_t movi_list
Definition: avidec.c:74
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
AVCodecParameters::width
int width
Video only.
Definition: codec_par.h:126
AV_CODEC_ID_MP2
@ AV_CODEC_ID_MP2
Definition: codec_id.h:410
AVIndexEntry::size
int size
Definition: avformat.h:806
AVIStream::dshow_block_align
int dshow_block_align
Definition: avidec.c:58
AVIndexEntry::timestamp
int64_t timestamp
Timestamp in AVStream.time_base units, preferably the time from which on correctly decoded frames are...
Definition: avformat.h:797
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
AVIContext::dts_max
int64_t dts_max
Definition: avidec.c:84
AVIStream::remaining
int remaining
Definition: avidec.c:44
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:197
AVStream::need_parsing
enum AVStreamParseType need_parsing
Definition: avformat.h:1083
AVIStream::cum_len
int64_t cum_len
Definition: avidec.c:53
AV_RL16
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_RL16
Definition: bytestream.h:90
nb_streams
static int nb_streams
Definition: ffprobe.c:282
av_rescale_q
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:142
ff_read_riff_info
int ff_read_riff_info(AVFormatContext *s, int64_t size)
Definition: riffdec.c:228
key
const char * key
Definition: hwcontext_opencl.c:168
AVMEDIA_TYPE_DATA
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
Definition: avutil.h:203
fsize
static int64_t fsize(FILE *f)
Definition: audiomatch.c:28
handler
static void handler(vbi_event *ev, void *user_data)
Definition: libzvbi-teletextdec.c:507
av_packet_new_side_data
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, int size)
Allocate new information of a packet.
Definition: avpacket.c:332
AV_CLASS_CATEGORY_DEMUXER
@ AV_CLASS_CATEGORY_DEMUXER
Definition: log.h:34
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:72
if
if(ret)
Definition: filter_design.txt:179
AVERROR_DEMUXER_NOT_FOUND
#define AVERROR_DEMUXER_NOT_FOUND
Demuxer not found.
Definition: error.h:53
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: avcodec.h:236
AVFormatContext
Format I/O context.
Definition: avformat.h:1335
ff_metadata_conv_ctx
void ff_metadata_conv_ctx(AVFormatContext *ctx, const AVMetadataConv *d_conv, const AVMetadataConv *s_conv)
Definition: metadata.c:59
AVPacket::buf
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
Definition: packet.h:338
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:1012
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVSEEK_FLAG_BACKWARD
#define AVSEEK_FLAG_BACKWARD
Definition: avformat.h:2496
read_header
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:527
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:67
avpriv_dv_get_packet
int avpriv_dv_get_packet(DVDemuxContext *c, AVPacket *pkt)
Definition: dv.c:347
AVIContext::movi_end
int64_t movi_end
Definition: avidec.c:71
AVStream::time_base
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition: avformat.h:894
NULL
#define NULL
Definition: coverity.c:32
av_buffer_unref
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition: buffer.c:125
read_probe
static int read_probe(const AVProbeData *pd)
Definition: jvdec.c:55
AVIIF_INDEX
#define AVIIF_INDEX
Definition: avi.h:38
isom.h
avi_metadata_conv
static const AVMetadataConv avi_metadata_conv[]
Definition: avidec.c:111
get_stream_idx
static int get_stream_idx(const unsigned *d)
Definition: avidec.c:1173
AVIContext::odml_depth
int odml_depth
Definition: avidec.c:81
AVIStream::sub_buffer
AVBufferRef * sub_buffer
Definition: avidec.c:63
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
get_riff
static int get_riff(AVFormatContext *s, AVIOContext *pb)
Definition: avidec.c:134
AVPALETTE_SIZE
#define AVPALETTE_SIZE
Definition: pixfmt.h:32
AVSTREAM_PARSE_NONE
@ AVSTREAM_PARSE_NONE
Definition: avformat.h:785
AVIndexEntry::flags
int flags
Definition: avformat.h:805
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:235
AVFormatContext::pb
AVIOContext * pb
I/O context.
Definition: avformat.h:1377
avi_read_packet
static int avi_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: avidec.c:1409
AVProbeData
This structure contains the data a format has to probe a file.
Definition: avformat.h:441
AVIStream::packet_size
int packet_size
Definition: avidec.c:45
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:929
AV_CODEC_ID_ADPCM_IMA_AMV
@ AV_CODEC_ID_ADPCM_IMA_AMV
Definition: codec_id.h:359
get_duration
static int get_duration(AVIStream *ast, int len)
Definition: avidec.c:124
AV_EF_EXPLODE
#define AV_EF_EXPLODE
abort decoding on minor error detection
Definition: avcodec.h:1666
guess_ni_flag
static int guess_ni_flag(AVFormatContext *s)
Definition: avidec.c:1700
AVIStream::prefix_count
int prefix_count
Definition: avidec.c:55
index
int index
Definition: gxfenc.c:89
AVPROBE_SCORE_EXTENSION
#define AVPROBE_SCORE_EXTENSION
score for file extension
Definition: avformat.h:451
AV_CODEC_ID_MPEG1VIDEO
@ AV_CODEC_ID_MPEG1VIDEO
Definition: codec_id.h:50
ff_avi_demuxer
AVInputFormat ff_avi_demuxer
Definition: avidec.c:1948
AVStream::nb_frames
int64_t nb_frames
number of frames in this stream if known or 0
Definition: avformat.h:916
bytestream2_tell
static av_always_inline int bytestream2_tell(GetByteContext *g)
Definition: bytestream.h:188
avi.h
AVIStream::frame_offset
int64_t frame_offset
Definition: avidec.c:42
AVCodecParameters::extradata_size
int extradata_size
Size of the extradata content in bytes.
Definition: codec_par.h:78
AVFormatContext::nb_streams
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
Definition: avformat.h:1391
AV_CODEC_ID_AAC
@ AV_CODEC_ID_AAC
Definition: codec_id.h:412
ff_codec_movvideo_tags
const AVCodecTag ff_codec_movvideo_tags[]
Definition: isom.c:75
ff_dv_offset_reset
void ff_dv_offset_reset(DVDemuxContext *c, int64_t frame_offset)
Definition: dv.c:436
avio_rl32
unsigned int avio_rl32(AVIOContext *s)
Definition: aviobuf.c:747
desc
const char * desc
Definition: nvenc.c:79
AVIOContext
Bytestream IO Context.
Definition: avio.h:161
AVIContext::last_pkt_pos
int64_t last_pkt_pos
Definition: avidec.c:75
AVPacket::size
int size
Definition: packet.h:356
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:188
ff_codec_get_id
enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
Definition: utils.c:3165
avformat_alloc_context
AVFormatContext * avformat_alloc_context(void)
Allocate an AVFormatContext.
Definition: options.c:144
AVDISCARD_DEFAULT
@ AVDISCARD_DEFAULT
discard useless packets like 0 size packets in avi
Definition: avcodec.h:231
AVIOContext::seekable
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
Definition: avio.h:260
AVIOContext::buf_end
unsigned char * buf_end
End of the data, may be less than buffer+buffer_size if the read function returned less data than req...
Definition: avio.h:229
AVStream::nb_index_entries
int nb_index_entries
Definition: avformat.h:1096
months
static const char months[12][4]
Definition: avidec.c:324
FFMAX
#define FFMAX(a, b)
Definition: common.h:94
avpriv_set_pts_info
void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition: utils.c:4948
ff_copy_whiteblacklists
int ff_copy_whiteblacklists(AVFormatContext *dst, const AVFormatContext *src)
Copies the whilelists from one context to the other.
Definition: utils.c:159
size
int size
Definition: twinvq_data.h:11134
state
static struct @314 state
av_reallocp
int av_reallocp(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory through a pointer to a pointer.
Definition: mem.c:161
avformat_seek_file
int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
Seek to timestamp ts.
Definition: utils.c:2550
ff_riff_info_conv
const AVMetadataConv ff_riff_info_conv[]
Definition: riff.c:591
AVMEDIA_TYPE_UNKNOWN
@ AVMEDIA_TYPE_UNKNOWN
Usually treated as AVMEDIA_TYPE_DATA.
Definition: avutil.h:200
avi_probe
static int avi_probe(const AVProbeData *p)
Definition: avidec.c:1935
AVStream::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
Definition: avformat.h:927
header
static const uint8_t header[24]
Definition: sdr2.c:67
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:354
DVDemuxContext
Definition: dv.c:43
avio_r8
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:616
FFMIN
#define FFMIN(a, b)
Definition: common.h:96
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:361
bitrate
int64_t bitrate
Definition: h264_levels.c:131
read_odml_index
static int read_odml_index(AVFormatContext *s, int64_t frame_num)
Definition: avidec.c:159
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:187
get_subtitle_pkt
static AVStream * get_subtitle_pkt(AVFormatContext *s, AVStream *next_st, AVPacket *pkt)
Definition: avidec.c:1139
avi_extract_stream_metadata
static int avi_extract_stream_metadata(AVFormatContext *s, AVStream *st)
Definition: avidec.c:389
AV_CODEC_ID_RV40
@ AV_CODEC_ID_RV40
Definition: codec_id.h:118
AVIContext::non_interleaved
int non_interleaved
Definition: avidec.c:78
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:47
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
avformat_open_input
int avformat_open_input(AVFormatContext **ps, const char *url, ff_const59 AVInputFormat *fmt, AVDictionary **options)
Open an input stream and read the header.
Definition: utils.c:536
AVIContext::stream_index
int stream_index
Definition: avidec.c:79
internal.h
AVCodecParameters::height
int height
Definition: codec_par.h:127
AV_TIME_BASE
#define AV_TIME_BASE
Internal time base represented as integer.
Definition: avutil.h:254
resync
static int resync(AVFormatContext *s)
Definition: flvdec.c:974
AVCodecParameters::block_align
int block_align
Audio only.
Definition: codec_par.h:177
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:223
AVIStream::sample_size
int sample_size
Definition: avidec.c:50
value
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
Definition: writing_filters.txt:86
AV_OPT_FLAG_DECODING_PARAM
#define AV_OPT_FLAG_DECODING_PARAM
a generic parameter which can be set by the user for demuxing or decoding
Definition: opt.h:277
avio_alloc_context
AVIOContext * avio_alloc_context(unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int(*read_packet)(void *opaque, uint8_t *buf, int buf_size), int(*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t(*seek)(void *opaque, int64_t offset, int whence))
Allocate and initialize an AVIOContext for buffered I/O.
Definition: aviobuf.c:126
uint8_t
uint8_t
Definition: audio_convert.c:194
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:237
av_inv_q
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
Definition: rational.h:159
len
int len
Definition: vorbis_enc_data.h:452
exif.h
ff_get_wav_header
int ff_get_wav_header(AVFormatContext *s, AVIOContext *pb, AVCodecParameters *par, int size, int big_endian)
Definition: riffdec.c:91
av_rescale
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
Definition: mathematics.c:129
avi_load_index
static int avi_load_index(AVFormatContext *s)
Definition: avidec.c:1742
AVIStream::rate
uint32_t rate
Definition: avidec.c:49
av_get_packet
int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
Allocate and read the payload of a packet and initialize its fields with default values.
Definition: utils.c:307
AVIStream::prefix
int prefix
Definition: avidec.c:54
AV_CODEC_ID_XSUB
@ AV_CODEC_ID_XSUB
Definition: codec_id.h:511
tag
uint32_t tag
Definition: movenc.c:1532
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:872
ret
ret
Definition: filter_design.txt:187
read_packet
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
Definition: avio_reading.c:42
AVStream
Stream structure.
Definition: avformat.h:865
AVIContext::dv_demux
DVDemuxContext * dv_demux
Definition: avidec.c:80
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:241
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:72
AVFMT_FLAG_SORT_DTS
#define AVFMT_FLAG_SORT_DTS
try to interleave outputted packets by dts (using this flag can slow demuxing down)
Definition: avformat.h:1487
AVSTREAM_PARSE_HEADERS
@ AVSTREAM_PARSE_HEADERS
Only parse headers, do not repack.
Definition: avformat.h:787
pos
unsigned int pos
Definition: spdifenc.c:412
avformat.h
dict.h
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: avcodec.h:215
AVIStream::sub_pkt
AVPacket sub_pkt
Definition: avidec.c:62
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:88
AVIStream::scale
uint32_t scale
Definition: avidec.c:48
AV_CODEC_ID_AMV
@ AV_CODEC_ID_AMV
Definition: codec_id.h:156
AVIStream::seek_pos
int64_t seek_pos
Definition: avidec.c:65
avcodec_parameters_copy
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
Copy the contents of src to dst.
Definition: utils.c:2109
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:866
avpriv_dv_init_demux
DVDemuxContext * avpriv_dv_init_demux(AVFormatContext *s)
Definition: dv.c:324
ff_codec_bmp_tags
const AVCodecTag ff_codec_bmp_tags[]
Definition: riff.c:32
pkt
static AVPacket pkt
Definition: demuxing_decoding.c:54
AVIO_SEEKABLE_NORMAL
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
Definition: avio.h:40
buffer
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
Definition: filter_design.txt:49
AVIContext::fsize
int64_t fsize
Definition: avidec.c:72
AVRational::den
int den
Denominator.
Definition: rational.h:60
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:625
AVIndexEntry::pos
int64_t pos
Definition: avformat.h:796
AVStream::request_probe
int request_probe
stream probing state -1 -> probing finished 0 -> no probing requested rest -> perform probing with re...
Definition: avformat.h:1122
av_probe_input_format2
ff_const59 AVInputFormat * av_probe_input_format2(ff_const59 AVProbeData *pd, int is_opened, int *score_max)
Guess the file format.
Definition: format.c:205
AVPacket::stream_index
int stream_index
Definition: packet.h:357
avio_skip
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:329
AVIContext::io_fsize
int64_t io_fsize
Definition: avidec.c:73
AVIContext::use_odml
int use_odml
Definition: avidec.c:82
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
AVCodecParameters::bits_per_coded_sample
int bits_per_coded_sample
The number of bits per sample in the codedwords.
Definition: codec_par.h:102
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:81
AVIContext::index_loaded
int index_loaded
Definition: avidec.c:76
avpriv_request_sample
#define avpriv_request_sample(...)
Definition: tableprint_vlc.h:39
avi_read_header
static int avi_read_header(AVFormatContext *s)
Definition: avidec.c:472
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AVDictionaryEntry
Definition: dict.h:81
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:60
AVPacket
This structure stores compressed data.
Definition: packet.h:332
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Definition: opt.h:240
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
av_dict_set
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:70
riff.h
AVPacket::pos
int64_t pos
byte position in stream, -1 if unknown
Definition: packet.h:375
avio_rl64
uint64_t avio_rl64(AVIOContext *s)
Definition: aviobuf.c:755
bytestream.h
AVSTREAM_PARSE_FULL
@ AVSTREAM_PARSE_FULL
full parsing and repack
Definition: avformat.h:786
bytestream2_init
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:133
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:565
AVCodecParameters::bit_rate
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
Definition: codec_par.h:89
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
AVDictionaryEntry::value
char * value
Definition: dict.h:83
AVStream::start_time
int64_t start_time
Decoding: pts of the first frame of the stream in presentation order, in stream time base.
Definition: avformat.h:904
avstring.h
AVSTREAM_PARSE_TIMESTAMPS
@ AVSTREAM_PARSE_TIMESTAMPS
full parsing and interpolation of timestamps for frames not starting on a packet boundary
Definition: avformat.h:788
AVIOContext::buf_ptr
unsigned char * buf_ptr
Current position in the buffer.
Definition: avio.h:228
AV_CODEC_ID_MPEG2VIDEO
@ AV_CODEC_ID_MPEG2VIDEO
preferred ID for MPEG-1/2 video decoding
Definition: codec_id.h:51
snprintf
#define snprintf
Definition: snprintf.h:34
avi_headers
static const char avi_headers[][8]
Definition: avidec.c:102
av_fourcc2str
#define av_fourcc2str(fourcc)
Definition: avutil.h:348
av_index_search_timestamp
int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags)
Get the index for a specific timestamp.
Definition: utils.c:2169
avio_feof
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
Definition: aviobuf.c:356