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/bswap.h"
27 #include "libavutil/opt.h"
28 #include "libavutil/dict.h"
29 #include "libavutil/internal.h"
30 #include "libavutil/intreadwrite.h"
31 #include "libavutil/mathematics.h"
32 #include "avformat.h"
33 #include "avi.h"
34 #include "dv.h"
35 #include "internal.h"
36 #include "isom.h"
37 #include "riff.h"
38 #include "libavcodec/bytestream.h"
39 #include "libavcodec/exif.h"
40 #include "libavcodec/internal.h"
41 
42 typedef struct AVIStream {
43  int64_t frame_offset; /* current frame (video) or byte (audio) counter
44  * (used to compute the pts) */
45  int remaining;
47 
48  uint32_t handler;
49  uint32_t scale;
50  uint32_t rate;
51  int sample_size; /* size of one sample (or packet)
52  * (in the rate/scale sense) in bytes */
53 
54  int64_t cum_len; /* temporary storage (used during seek) */
55  int prefix; /* normally 'd'<<8 + 'c' or 'w'<<8 + 'b' */
57  uint32_t pal[256];
58  int has_pal;
59  int dshow_block_align; /* block align variable used to emulate bugs in
60  * the MS dshow demuxer */
61 
65 
66  int64_t seek_pos;
67 } AVIStream;
68 
69 typedef struct AVIContext {
70  const AVClass *class;
71  int64_t riff_end;
72  int64_t movi_end;
73  int64_t fsize;
74  int64_t io_fsize;
75  int64_t movi_list;
76  int64_t last_pkt_pos;
78  int is_odml;
83  int use_odml;
84 #define MAX_ODML_DEPTH 1000
85  int64_t dts_max;
86 } AVIContext;
87 
88 
89 static const AVOption options[] = {
90  { "use_odml", "use odml index", offsetof(AVIContext, use_odml), AV_OPT_TYPE_BOOL, {.i64 = 1}, -1, 1, AV_OPT_FLAG_DECODING_PARAM},
91  { NULL },
92 };
93 
94 static const AVClass demuxer_class = {
95  .class_name = "avi",
96  .item_name = av_default_item_name,
97  .option = options,
98  .version = LIBAVUTIL_VERSION_INT,
99  .category = AV_CLASS_CATEGORY_DEMUXER,
100 };
101 
102 
103 static const char avi_headers[][8] = {
104  { 'R', 'I', 'F', 'F', 'A', 'V', 'I', ' ' },
105  { 'R', 'I', 'F', 'F', 'A', 'V', 'I', 'X' },
106  { 'R', 'I', 'F', 'F', 'A', 'V', 'I', 0x19 },
107  { 'O', 'N', '2', ' ', 'O', 'N', '2', 'f' },
108  { 'R', 'I', 'F', 'F', 'A', 'M', 'V', ' ' },
109  { 0 }
110 };
111 
113  { "strn", "title" },
114  { 0 },
115 };
116 
117 static int avi_load_index(AVFormatContext *s);
118 static int guess_ni_flag(AVFormatContext *s);
119 
120 #define print_tag(str, tag, size) \
121  av_log(NULL, 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  return AVERROR_INVALIDDATA;
314  value[size] = 0;
315 
316  AV_WL32(key, tag);
317 
318  return av_dict_set(st ? &st->metadata : &s->metadata, key, value,
320 }
321 
322 static const char months[12][4] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
323  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
324 
325 static void avi_metadata_creation_time(AVDictionary **metadata, char *date)
326 {
327  char month[4], time[9], buffer[64];
328  int i, day, year;
329  /* parse standard AVI date format (ie. "Mon Mar 10 15:04:43 2003") */
330  if (sscanf(date, "%*3s%*[ ]%3s%*[ ]%2d%*[ ]%8s%*[ ]%4d",
331  month, &day, time, &year) == 4) {
332  for (i = 0; i < 12; i++)
333  if (!av_strcasecmp(month, months[i])) {
334  snprintf(buffer, sizeof(buffer), "%.4d-%.2d-%.2d %s",
335  year, i + 1, day, time);
336  av_dict_set(metadata, "creation_time", buffer, 0);
337  }
338  } else if (date[4] == '/' && date[7] == '/') {
339  date[4] = date[7] = '-';
340  av_dict_set(metadata, "creation_time", date, 0);
341  }
342 }
343 
344 static void avi_read_nikon(AVFormatContext *s, uint64_t end)
345 {
346  while (avio_tell(s->pb) < end && !avio_feof(s->pb)) {
347  uint32_t tag = avio_rl32(s->pb);
348  uint32_t size = avio_rl32(s->pb);
349  switch (tag) {
350  case MKTAG('n', 'c', 't', 'g'): /* Nikon Tags */
351  {
352  uint64_t tag_end = avio_tell(s->pb) + size;
353  while (avio_tell(s->pb) < tag_end && !avio_feof(s->pb)) {
354  uint16_t tag = avio_rl16(s->pb);
355  uint16_t size = avio_rl16(s->pb);
356  const char *name = NULL;
357  char buffer[64] = { 0 };
358  size = FFMIN(size, tag_end - avio_tell(s->pb));
359  size -= avio_read(s->pb, buffer,
360  FFMIN(size, sizeof(buffer) - 1));
361  switch (tag) {
362  case 0x03:
363  name = "maker";
364  break;
365  case 0x04:
366  name = "model";
367  break;
368  case 0x13:
369  name = "creation_time";
370  if (buffer[4] == ':' && buffer[7] == ':')
371  buffer[4] = buffer[7] = '-';
372  break;
373  }
374  if (name)
375  av_dict_set(&s->metadata, name, buffer, 0);
376  avio_skip(s->pb, size);
377  }
378  break;
379  }
380  default:
381  avio_skip(s->pb, size);
382  break;
383  }
384  }
385 }
386 
388 {
389  GetByteContext gb;
390  uint8_t *data = st->codecpar->extradata;
391  int data_size = st->codecpar->extradata_size;
392  int tag, offset;
393 
394  if (!data || data_size < 8) {
395  return AVERROR_INVALIDDATA;
396  }
397 
398  bytestream2_init(&gb, data, data_size);
399 
400  tag = bytestream2_get_le32(&gb);
401 
402  switch (tag) {
403  case MKTAG('A', 'V', 'I', 'F'):
404  // skip 4 byte padding
405  bytestream2_skip(&gb, 4);
406  offset = bytestream2_tell(&gb);
407 
408  // decode EXIF tags from IFD, AVI is always little-endian
409  return avpriv_exif_decode_ifd(s, data + offset, data_size - offset,
410  1, 0, &st->metadata);
411  break;
412  case MKTAG('C', 'A', 'S', 'I'):
413  avpriv_request_sample(s, "RIFF stream data tag type CASI (%u)", tag);
414  break;
415  case MKTAG('Z', 'o', 'r', 'a'):
416  avpriv_request_sample(s, "RIFF stream data tag type Zora (%u)", tag);
417  break;
418  default:
419  break;
420  }
421 
422  return 0;
423 }
424 
426 {
427  AVIContext *avi = s->priv_data;
428  int i, j;
429  int64_t lensum = 0;
430  int64_t maxpos = 0;
431 
432  for (i = 0; i<s->nb_streams; i++) {
433  int64_t len = 0;
434  AVStream *st = s->streams[i];
435 
436  if (!st->nb_index_entries)
437  continue;
438 
439  for (j = 0; j < st->nb_index_entries; j++)
440  len += st->index_entries[j].size;
441  maxpos = FFMAX(maxpos, st->index_entries[j-1].pos);
442  lensum += len;
443  }
444  if (maxpos < av_rescale(avi->io_fsize, 9, 10)) // index does not cover the whole file
445  return 0;
446  if (lensum*9/10 > maxpos || lensum < maxpos*9/10) // frame sum and filesize mismatch
447  return 0;
448 
449  for (i = 0; i<s->nb_streams; i++) {
450  int64_t len = 0;
451  AVStream *st = s->streams[i];
452  int64_t duration;
453  int64_t bitrate;
454 
455  for (j = 0; j < st->nb_index_entries; j++)
456  len += st->index_entries[j].size;
457 
458  if (st->nb_index_entries < 2 || st->codecpar->bit_rate > 0)
459  continue;
462  if (bitrate > 0) {
463  st->codecpar->bit_rate = bitrate;
464  }
465  }
466  return 1;
467 }
468 
470 {
471  AVIContext *avi = s->priv_data;
472  AVIOContext *pb = s->pb;
473  unsigned int tag, tag1, handler;
474  int codec_type, stream_index, frame_period;
475  unsigned int size;
476  int i;
477  AVStream *st;
478  AVIStream *ast = NULL;
479  int avih_width = 0, avih_height = 0;
480  int amv_file_format = 0;
481  uint64_t list_end = 0;
482  int64_t pos;
483  int ret;
484  AVDictionaryEntry *dict_entry;
485 
486  avi->stream_index = -1;
487 
488  ret = get_riff(s, pb);
489  if (ret < 0)
490  return ret;
491 
492  av_log(avi, AV_LOG_DEBUG, "use odml:%d\n", avi->use_odml);
493 
494  avi->io_fsize = avi->fsize = avio_size(pb);
495  if (avi->fsize <= 0 || avi->fsize < avi->riff_end)
496  avi->fsize = avi->riff_end == 8 ? INT64_MAX : avi->riff_end;
497 
498  /* first list tag */
499  stream_index = -1;
500  codec_type = -1;
501  frame_period = 0;
502  for (;;) {
503  if (avio_feof(pb))
504  goto fail;
505  tag = avio_rl32(pb);
506  size = avio_rl32(pb);
507 
508  print_tag("tag", tag, size);
509 
510  switch (tag) {
511  case MKTAG('L', 'I', 'S', 'T'):
512  list_end = avio_tell(pb) + size;
513  /* Ignored, except at start of video packets. */
514  tag1 = avio_rl32(pb);
515 
516  print_tag("list", tag1, 0);
517 
518  if (tag1 == MKTAG('m', 'o', 'v', 'i')) {
519  avi->movi_list = avio_tell(pb) - 4;
520  if (size)
521  avi->movi_end = avi->movi_list + size + (size & 1);
522  else
523  avi->movi_end = avi->fsize;
524  av_log(NULL, AV_LOG_TRACE, "movi end=%"PRIx64"\n", avi->movi_end);
525  goto end_of_header;
526  } else if (tag1 == MKTAG('I', 'N', 'F', 'O'))
527  ff_read_riff_info(s, size - 4);
528  else if (tag1 == MKTAG('n', 'c', 'd', 't'))
529  avi_read_nikon(s, list_end);
530 
531  break;
532  case MKTAG('I', 'D', 'I', 'T'):
533  {
534  unsigned char date[64] = { 0 };
535  size += (size & 1);
536  size -= avio_read(pb, date, FFMIN(size, sizeof(date) - 1));
537  avio_skip(pb, size);
538  avi_metadata_creation_time(&s->metadata, date);
539  break;
540  }
541  case MKTAG('d', 'm', 'l', 'h'):
542  avi->is_odml = 1;
543  avio_skip(pb, size + (size & 1));
544  break;
545  case MKTAG('a', 'm', 'v', 'h'):
546  amv_file_format = 1;
547  case MKTAG('a', 'v', 'i', 'h'):
548  /* AVI header */
549  /* using frame_period is bad idea */
550  frame_period = avio_rl32(pb);
551  avio_rl32(pb); /* max. bytes per second */
552  avio_rl32(pb);
554 
555  avio_skip(pb, 2 * 4);
556  avio_rl32(pb);
557  avio_rl32(pb);
558  avih_width = avio_rl32(pb);
559  avih_height = avio_rl32(pb);
560 
561  avio_skip(pb, size - 10 * 4);
562  break;
563  case MKTAG('s', 't', 'r', 'h'):
564  /* stream header */
565 
566  tag1 = avio_rl32(pb);
567  handler = avio_rl32(pb); /* codec tag */
568 
569  if (tag1 == MKTAG('p', 'a', 'd', 's')) {
570  avio_skip(pb, size - 8);
571  break;
572  } else {
573  stream_index++;
574  st = avformat_new_stream(s, NULL);
575  if (!st)
576  goto fail;
577 
578  st->id = stream_index;
579  ast = av_mallocz(sizeof(AVIStream));
580  if (!ast)
581  goto fail;
582  st->priv_data = ast;
583  }
584  if (amv_file_format)
585  tag1 = stream_index ? MKTAG('a', 'u', 'd', 's')
586  : MKTAG('v', 'i', 'd', 's');
587 
588  print_tag("strh", tag1, -1);
589 
590  if (tag1 == MKTAG('i', 'a', 'v', 's') ||
591  tag1 == MKTAG('i', 'v', 'a', 's')) {
592  int64_t dv_dur;
593 
594  /* After some consideration -- I don't think we
595  * have to support anything but DV in type1 AVIs. */
596  if (s->nb_streams != 1)
597  goto fail;
598 
599  if (handler != MKTAG('d', 'v', 's', 'd') &&
600  handler != MKTAG('d', 'v', 'h', 'd') &&
601  handler != MKTAG('d', 'v', 's', 'l'))
602  goto fail;
603 
604  ast = s->streams[0]->priv_data;
605  av_freep(&s->streams[0]->codecpar->extradata);
606  av_freep(&s->streams[0]->codecpar);
607 #if FF_API_LAVF_AVCTX
609  av_freep(&s->streams[0]->codec);
611 #endif
612  if (s->streams[0]->info)
613  av_freep(&s->streams[0]->info->duration_error);
614  av_freep(&s->streams[0]->info);
615  if (s->streams[0]->internal)
616  av_freep(&s->streams[0]->internal->avctx);
617  av_freep(&s->streams[0]->internal);
618  av_freep(&s->streams[0]);
619  s->nb_streams = 0;
620  if (CONFIG_DV_DEMUXER) {
622  if (!avi->dv_demux)
623  goto fail;
624  } else
625  goto fail;
626  s->streams[0]->priv_data = ast;
627  avio_skip(pb, 3 * 4);
628  ast->scale = avio_rl32(pb);
629  ast->rate = avio_rl32(pb);
630  avio_skip(pb, 4); /* start time */
631 
632  dv_dur = avio_rl32(pb);
633  if (ast->scale > 0 && ast->rate > 0 && dv_dur > 0) {
634  dv_dur *= AV_TIME_BASE;
635  s->duration = av_rescale(dv_dur, ast->scale, ast->rate);
636  }
637  /* else, leave duration alone; timing estimation in utils.c
638  * will make a guess based on bitrate. */
639 
640  stream_index = s->nb_streams - 1;
641  avio_skip(pb, size - 9 * 4);
642  break;
643  }
644 
645  av_assert0(stream_index < s->nb_streams);
646  ast->handler = handler;
647 
648  avio_rl32(pb); /* flags */
649  avio_rl16(pb); /* priority */
650  avio_rl16(pb); /* language */
651  avio_rl32(pb); /* initial frame */
652  ast->scale = avio_rl32(pb);
653  ast->rate = avio_rl32(pb);
654  if (!(ast->scale && ast->rate)) {
656  "scale/rate is %"PRIu32"/%"PRIu32" which is invalid. "
657  "(This file has been generated by broken software.)\n",
658  ast->scale,
659  ast->rate);
660  if (frame_period) {
661  ast->rate = 1000000;
662  ast->scale = frame_period;
663  } else {
664  ast->rate = 25;
665  ast->scale = 1;
666  }
667  }
668  avpriv_set_pts_info(st, 64, ast->scale, ast->rate);
669 
670  ast->cum_len = avio_rl32(pb); /* start */
671  st->nb_frames = avio_rl32(pb);
672 
673  st->start_time = 0;
674  avio_rl32(pb); /* buffer size */
675  avio_rl32(pb); /* quality */
676  if (ast->cum_len > 3600LL * ast->rate / ast->scale) {
677  av_log(s, AV_LOG_ERROR, "crazy start time, iam scared, giving up\n");
678  ast->cum_len = 0;
679  }
680  ast->sample_size = avio_rl32(pb);
681  ast->cum_len *= FFMAX(1, ast->sample_size);
682  av_log(s, AV_LOG_TRACE, "%"PRIu32" %"PRIu32" %d\n",
683  ast->rate, ast->scale, ast->sample_size);
684 
685  switch (tag1) {
686  case MKTAG('v', 'i', 'd', 's'):
688 
689  ast->sample_size = 0;
690  st->avg_frame_rate = av_inv_q(st->time_base);
691  break;
692  case MKTAG('a', 'u', 'd', 's'):
694  break;
695  case MKTAG('t', 'x', 't', 's'):
697  break;
698  case MKTAG('d', 'a', 't', 's'):
700  break;
701  default:
702  av_log(s, AV_LOG_INFO, "unknown stream type %X\n", tag1);
703  }
704 
705  if (ast->sample_size < 0) {
706  if (s->error_recognition & AV_EF_EXPLODE) {
708  "Invalid sample_size %d at stream %d\n",
709  ast->sample_size,
710  stream_index);
711  goto fail;
712  }
714  "Invalid sample_size %d at stream %d "
715  "setting it to 0\n",
716  ast->sample_size,
717  stream_index);
718  ast->sample_size = 0;
719  }
720 
721  if (ast->sample_size == 0) {
722  st->duration = st->nb_frames;
723  if (st->duration > 0 && avi->io_fsize > 0 && avi->riff_end > avi->io_fsize) {
724  av_log(s, AV_LOG_DEBUG, "File is truncated adjusting duration\n");
725  st->duration = av_rescale(st->duration, avi->io_fsize, avi->riff_end);
726  }
727  }
728  ast->frame_offset = ast->cum_len;
729  avio_skip(pb, size - 12 * 4);
730  break;
731  case MKTAG('s', 't', 'r', 'f'):
732  /* stream header */
733  if (!size && (codec_type == AVMEDIA_TYPE_AUDIO ||
735  break;
736  if (stream_index >= (unsigned)s->nb_streams || avi->dv_demux) {
737  avio_skip(pb, size);
738  } else {
739  uint64_t cur_pos = avio_tell(pb);
740  unsigned esize;
741  if (cur_pos < list_end)
742  size = FFMIN(size, list_end - cur_pos);
743  st = s->streams[stream_index];
745  avio_skip(pb, size);
746  break;
747  }
748  switch (codec_type) {
749  case AVMEDIA_TYPE_VIDEO:
750  if (amv_file_format) {
751  st->codecpar->width = avih_width;
752  st->codecpar->height = avih_height;
755  avio_skip(pb, size);
756  break;
757  }
758  tag1 = ff_get_bmp_header(pb, st, &esize);
759 
760  if (tag1 == MKTAG('D', 'X', 'S', 'B') ||
761  tag1 == MKTAG('D', 'X', 'S', 'A')) {
763  st->codecpar->codec_tag = tag1;
765  break;
766  }
767 
768  if (size > 10 * 4 && size < (1 << 30) && size < avi->fsize) {
769  if (esize == size-1 && (esize&1)) {
770  st->codecpar->extradata_size = esize - 10 * 4;
771  } else
772  st->codecpar->extradata_size = size - 10 * 4;
773  if (st->codecpar->extradata) {
774  av_log(s, AV_LOG_WARNING, "New extradata in strf chunk, freeing previous one.\n");
775  av_freep(&st->codecpar->extradata);
776  }
777  if (ff_get_extradata(s, st->codecpar, pb, st->codecpar->extradata_size) < 0)
778  return AVERROR(ENOMEM);
779  }
780 
781  // FIXME: check if the encoder really did this correctly
782  if (st->codecpar->extradata_size & 1)
783  avio_r8(pb);
784 
785  /* Extract palette from extradata if bpp <= 8.
786  * This code assumes that extradata contains only palette.
787  * This is true for all paletted codecs implemented in
788  * FFmpeg. */
789  if (st->codecpar->extradata_size &&
790  (st->codecpar->bits_per_coded_sample <= 8)) {
791  int pal_size = (1 << st->codecpar->bits_per_coded_sample) << 2;
792  const uint8_t *pal_src;
793 
794  pal_size = FFMIN(pal_size, st->codecpar->extradata_size);
795  pal_src = st->codecpar->extradata +
796  st->codecpar->extradata_size - pal_size;
797  /* Exclude the "BottomUp" field from the palette */
798  if (pal_src - st->codecpar->extradata >= 9 &&
799  !memcmp(st->codecpar->extradata + st->codecpar->extradata_size - 9, "BottomUp", 9))
800  pal_src -= 9;
801  for (i = 0; i < pal_size / 4; i++)
802  ast->pal[i] = 0xFFU<<24 | AV_RL32(pal_src + 4 * i);
803  ast->has_pal = 1;
804  }
805 
806  print_tag("video", tag1, 0);
807 
809  st->codecpar->codec_tag = tag1;
811  tag1);
812  /* If codec is not found yet, try with the mov tags. */
813  if (!st->codecpar->codec_id) {
814  st->codecpar->codec_id =
816  if (st->codecpar->codec_id)
818  "mov tag found in avi (fourcc %s)\n",
819  av_fourcc2str(tag1));
820  }
821  if (!st->codecpar->codec_id)
823 
824  /* This is needed to get the pict type which is necessary
825  * for generating correct pts. */
827 
828  if (st->codecpar->codec_id == AV_CODEC_ID_MPEG4 &&
829  ast->handler == MKTAG('X', 'V', 'I', 'D'))
830  st->codecpar->codec_tag = MKTAG('X', 'V', 'I', 'D');
831 
832  if (st->codecpar->codec_tag == MKTAG('V', 'S', 'S', 'H'))
834  if (st->codecpar->codec_id == AV_CODEC_ID_RV40)
836 
837  if (st->codecpar->codec_tag == 0 && st->codecpar->height > 0 &&
838  st->codecpar->extradata_size < 1U << 30) {
839  st->codecpar->extradata_size += 9;
840  if ((ret = av_reallocp(&st->codecpar->extradata,
841  st->codecpar->extradata_size +
843  st->codecpar->extradata_size = 0;
844  return ret;
845  } else
846  memcpy(st->codecpar->extradata + st->codecpar->extradata_size - 9,
847  "BottomUp", 9);
848  }
849  if (st->codecpar->height == INT_MIN)
850  return AVERROR_INVALIDDATA;
851  st->codecpar->height = FFABS(st->codecpar->height);
852 
853 // avio_skip(pb, size - 5 * 4);
854  break;
855  case AVMEDIA_TYPE_AUDIO:
856  ret = ff_get_wav_header(s, pb, st->codecpar, size, 0);
857  if (ret < 0)
858  return ret;
860  if (ast->sample_size && st->codecpar->block_align &&
861  ast->sample_size != st->codecpar->block_align) {
862  av_log(s,
864  "sample size (%d) != block align (%d)\n",
865  ast->sample_size,
866  st->codecpar->block_align);
867  ast->sample_size = st->codecpar->block_align;
868  }
869  /* 2-aligned
870  * (fix for Stargate SG-1 - 3x18 - Shades of Grey.avi) */
871  if (size & 1)
872  avio_skip(pb, 1);
873  /* Force parsing as several audio frames can be in
874  * one packet and timestamps refer to packet start. */
876  /* ADTS header is in extradata, AAC without header must be
877  * stored as exact frames. Parser not needed and it will
878  * fail. */
879  if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
882  // The flac parser does not work with AVSTREAM_PARSE_TIMESTAMPS
883  if (st->codecpar->codec_id == AV_CODEC_ID_FLAC)
885  /* AVI files with Xan DPCM audio (wrongly) declare PCM
886  * audio in the header but have Axan as stream_code_tag. */
887  if (ast->handler == AV_RL32("Axan")) {
889  st->codecpar->codec_tag = 0;
890  ast->dshow_block_align = 0;
891  }
892  if (amv_file_format) {
894  ast->dshow_block_align = 0;
895  }
896  if ((st->codecpar->codec_id == AV_CODEC_ID_AAC ||
898  st->codecpar->codec_id == AV_CODEC_ID_MP2 ) && ast->dshow_block_align <= 4 && ast->dshow_block_align) {
899  av_log(s, AV_LOG_DEBUG, "overriding invalid dshow_block_align of %d\n", ast->dshow_block_align);
900  ast->dshow_block_align = 0;
901  }
902  if (st->codecpar->codec_id == AV_CODEC_ID_AAC && ast->dshow_block_align == 1024 && ast->sample_size == 1024 ||
903  st->codecpar->codec_id == AV_CODEC_ID_AAC && ast->dshow_block_align == 4096 && ast->sample_size == 4096 ||
904  st->codecpar->codec_id == AV_CODEC_ID_MP3 && ast->dshow_block_align == 1152 && ast->sample_size == 1152) {
905  av_log(s, AV_LOG_DEBUG, "overriding sample_size\n");
906  ast->sample_size = 0;
907  }
908  break;
911  st->request_probe= 1;
912  avio_skip(pb, size);
913  break;
914  default:
917  st->codecpar->codec_tag = 0;
918  avio_skip(pb, size);
919  break;
920  }
921  }
922  break;
923  case MKTAG('s', 't', 'r', 'd'):
924  if (stream_index >= (unsigned)s->nb_streams
925  || s->streams[stream_index]->codecpar->extradata_size
926  || s->streams[stream_index]->codecpar->codec_tag == MKTAG('H','2','6','4')) {
927  avio_skip(pb, size);
928  } else {
929  uint64_t cur_pos = avio_tell(pb);
930  if (cur_pos < list_end)
931  size = FFMIN(size, list_end - cur_pos);
932  st = s->streams[stream_index];
933 
934  if (size<(1<<30)) {
935  if (st->codecpar->extradata) {
936  av_log(s, AV_LOG_WARNING, "New extradata in strd chunk, freeing previous one.\n");
937  av_freep(&st->codecpar->extradata);
938  }
939  if (ff_get_extradata(s, st->codecpar, pb, size) < 0)
940  return AVERROR(ENOMEM);
941  }
942 
943  if (st->codecpar->extradata_size & 1) //FIXME check if the encoder really did this correctly
944  avio_r8(pb);
945 
947  if (ret < 0) {
948  av_log(s, AV_LOG_WARNING, "could not decoding EXIF data in stream header.\n");
949  }
950  }
951  break;
952  case MKTAG('i', 'n', 'd', 'x'):
953  pos = avio_tell(pb);
954  if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && !(s->flags & AVFMT_FLAG_IGNIDX) &&
955  avi->use_odml &&
956  read_odml_index(s, 0) < 0 &&
957  (s->error_recognition & AV_EF_EXPLODE))
958  goto fail;
959  avio_seek(pb, pos + size, SEEK_SET);
960  break;
961  case MKTAG('v', 'p', 'r', 'p'):
962  if (stream_index < (unsigned)s->nb_streams && size > 9 * 4) {
963  AVRational active, active_aspect;
964 
965  st = s->streams[stream_index];
966  avio_rl32(pb);
967  avio_rl32(pb);
968  avio_rl32(pb);
969  avio_rl32(pb);
970  avio_rl32(pb);
971 
972  active_aspect.den = avio_rl16(pb);
973  active_aspect.num = avio_rl16(pb);
974  active.num = avio_rl32(pb);
975  active.den = avio_rl32(pb);
976  avio_rl32(pb); // nbFieldsPerFrame
977 
978  if (active_aspect.num && active_aspect.den &&
979  active.num && active.den) {
980  st->sample_aspect_ratio = av_div_q(active_aspect, active);
981  av_log(s, AV_LOG_TRACE, "vprp %d/%d %d/%d\n",
982  active_aspect.num, active_aspect.den,
983  active.num, active.den);
984  }
985  size -= 9 * 4;
986  }
987  avio_skip(pb, size);
988  break;
989  case MKTAG('s', 't', 'r', 'n'):
990  if (s->nb_streams) {
991  ret = avi_read_tag(s, s->streams[s->nb_streams - 1], tag, size);
992  if (ret < 0)
993  return ret;
994  break;
995  }
996  default:
997  if (size > 1000000) {
999  "Something went wrong during header parsing, "
1000  "tag %s has size %u, "
1001  "I will ignore it and try to continue anyway.\n",
1002  av_fourcc2str(tag), size);
1003  if (s->error_recognition & AV_EF_EXPLODE)
1004  goto fail;
1005  avi->movi_list = avio_tell(pb) - 4;
1006  avi->movi_end = avi->fsize;
1007  goto end_of_header;
1008  }
1009  /* Do not fail for very large idx1 tags */
1010  case MKTAG('i', 'd', 'x', '1'):
1011  /* skip tag */
1012  size += (size & 1);
1013  avio_skip(pb, size);
1014  break;
1015  }
1016  }
1017 
1018 end_of_header:
1019  /* check stream number */
1020  if (stream_index != s->nb_streams - 1) {
1021 
1022 fail:
1023  return AVERROR_INVALIDDATA;
1024  }
1025 
1026  if (!avi->index_loaded && (pb->seekable & AVIO_SEEKABLE_NORMAL))
1027  avi_load_index(s);
1029  avi->index_loaded |= 1;
1030 
1031  if ((ret = guess_ni_flag(s)) < 0)
1032  return ret;
1033 
1034  avi->non_interleaved |= ret | (s->flags & AVFMT_FLAG_SORT_DTS);
1035 
1036  dict_entry = av_dict_get(s->metadata, "ISFT", NULL, 0);
1037  if (dict_entry && !strcmp(dict_entry->value, "PotEncoder"))
1038  for (i = 0; i < s->nb_streams; i++) {
1039  AVStream *st = s->streams[i];
1043  }
1044 
1045  for (i = 0; i < s->nb_streams; i++) {
1046  AVStream *st = s->streams[i];
1047  if (st->nb_index_entries)
1048  break;
1049  }
1050  // DV-in-AVI cannot be non-interleaved, if set this must be
1051  // a mis-detection.
1052  if (avi->dv_demux)
1053  avi->non_interleaved = 0;
1054  if (i == s->nb_streams && avi->non_interleaved) {
1056  "Non-interleaved AVI without index, switching to interleaved\n");
1057  avi->non_interleaved = 0;
1058  }
1059 
1060  if (avi->non_interleaved) {
1061  av_log(s, AV_LOG_INFO, "non-interleaved AVI\n");
1062  clean_index(s);
1063  }
1064 
1067 
1068  return 0;
1069 }
1070 
1072 {
1073  if (pkt->size >= 7 &&
1074  pkt->size < INT_MAX - AVPROBE_PADDING_SIZE &&
1075  !strcmp(pkt->data, "GAB2") && AV_RL16(pkt->data + 5) == 2) {
1076  uint8_t desc[256];
1077  int score = AVPROBE_SCORE_EXTENSION, ret;
1078  AVIStream *ast = st->priv_data;
1079  ff_const59 AVInputFormat *sub_demuxer;
1080  AVRational time_base;
1081  int size;
1083  pkt->size - 7,
1084  0, NULL, NULL, NULL, NULL);
1085  AVProbeData pd;
1086  unsigned int desc_len = avio_rl32(pb);
1087 
1088  if (desc_len > pb->buf_end - pb->buf_ptr)
1089  goto error;
1090 
1091  ret = avio_get_str16le(pb, desc_len, desc, sizeof(desc));
1092  avio_skip(pb, desc_len - ret);
1093  if (*desc)
1094  av_dict_set(&st->metadata, "title", desc, 0);
1095 
1096  avio_rl16(pb); /* flags? */
1097  avio_rl32(pb); /* data size */
1098 
1099  size = pb->buf_end - pb->buf_ptr;
1101  .buf_size = size };
1102  if (!pd.buf)
1103  goto error;
1104  memcpy(pd.buf, pb->buf_ptr, size);
1105  sub_demuxer = av_probe_input_format2(&pd, 1, &score);
1106  av_freep(&pd.buf);
1107  if (!sub_demuxer)
1108  goto error;
1109 
1110  if (strcmp(sub_demuxer->name, "srt") && strcmp(sub_demuxer->name, "ass"))
1111  goto error;
1112 
1113  if (!(ast->sub_ctx = avformat_alloc_context()))
1114  goto error;
1115 
1116  ast->sub_ctx->pb = pb;
1117 
1118  if (ff_copy_whiteblacklists(ast->sub_ctx, s) < 0)
1119  goto error;
1120 
1121  if (!avformat_open_input(&ast->sub_ctx, "", sub_demuxer, NULL)) {
1122  if (ast->sub_ctx->nb_streams != 1)
1123  goto error;
1124  ff_read_packet(ast->sub_ctx, &ast->sub_pkt);
1126  time_base = ast->sub_ctx->streams[0]->time_base;
1127  avpriv_set_pts_info(st, 64, time_base.num, time_base.den);
1128  }
1129  ast->sub_buffer = pkt->buf;
1130  pkt->buf = NULL;
1132  return 1;
1133 
1134 error:
1135  av_freep(&ast->sub_ctx);
1136  avio_context_free(&pb);
1137  }
1138  return 0;
1139 }
1140 
1142  AVPacket *pkt)
1143 {
1144  AVIStream *ast, *next_ast = next_st->priv_data;
1145  int64_t ts, next_ts, ts_min = INT64_MAX;
1146  AVStream *st, *sub_st = NULL;
1147  int i;
1148 
1149  next_ts = av_rescale_q(next_ast->frame_offset, next_st->time_base,
1150  AV_TIME_BASE_Q);
1151 
1152  for (i = 0; i < s->nb_streams; i++) {
1153  st = s->streams[i];
1154  ast = st->priv_data;
1155  if (st->discard < AVDISCARD_ALL && ast && ast->sub_pkt.data) {
1156  ts = av_rescale_q(ast->sub_pkt.dts, st->time_base, AV_TIME_BASE_Q);
1157  if (ts <= next_ts && ts < ts_min) {
1158  ts_min = ts;
1159  sub_st = st;
1160  }
1161  }
1162  }
1163 
1164  if (sub_st) {
1165  ast = sub_st->priv_data;
1166  *pkt = ast->sub_pkt;
1167  pkt->stream_index = sub_st->index;
1168 
1169  if (ff_read_packet(ast->sub_ctx, &ast->sub_pkt) < 0)
1170  ast->sub_pkt.data = NULL;
1171  }
1172  return sub_st;
1173 }
1174 
1175 static int get_stream_idx(const unsigned *d)
1176 {
1177  if (d[0] >= '0' && d[0] <= '9' &&
1178  d[1] >= '0' && d[1] <= '9') {
1179  return (d[0] - '0') * 10 + (d[1] - '0');
1180  } else {
1181  return 100; // invalid stream ID
1182  }
1183 }
1184 
1185 /**
1186  *
1187  * @param exit_early set to 1 to just gather packet position without making the changes needed to actually read & return the packet
1188  */
1189 static int avi_sync(AVFormatContext *s, int exit_early)
1190 {
1191  AVIContext *avi = s->priv_data;
1192  AVIOContext *pb = s->pb;
1193  int n;
1194  unsigned int d[8];
1195  unsigned int size;
1196  int64_t i, sync;
1197 
1198 start_sync:
1199  memset(d, -1, sizeof(d));
1200  for (i = sync = avio_tell(pb); !avio_feof(pb); i++) {
1201  int j;
1202 
1203  for (j = 0; j < 7; j++)
1204  d[j] = d[j + 1];
1205  d[7] = avio_r8(pb);
1206 
1207  size = d[4] + (d[5] << 8) + (d[6] << 16) + (d[7] << 24);
1208 
1209  n = get_stream_idx(d + 2);
1210  ff_tlog(s, "%X %X %X %X %X %X %X %X %"PRId64" %u %d\n",
1211  d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], i, size, n);
1212  if (i*(avi->io_fsize>0) + (uint64_t)size > avi->fsize || d[0] > 127)
1213  continue;
1214 
1215  // parse ix##
1216  if ((d[0] == 'i' && d[1] == 'x' && n < s->nb_streams) ||
1217  // parse JUNK
1218  (d[0] == 'J' && d[1] == 'U' && d[2] == 'N' && d[3] == 'K') ||
1219  (d[0] == 'i' && d[1] == 'd' && d[2] == 'x' && d[3] == '1') ||
1220  (d[0] == 'i' && d[1] == 'n' && d[2] == 'd' && d[3] == 'x')) {
1221  avio_skip(pb, size);
1222  goto start_sync;
1223  }
1224 
1225  // parse stray LIST
1226  if (d[0] == 'L' && d[1] == 'I' && d[2] == 'S' && d[3] == 'T') {
1227  avio_skip(pb, 4);
1228  goto start_sync;
1229  }
1230 
1231  n = get_stream_idx(d);
1232 
1233  if (!((i - avi->last_pkt_pos) & 1) &&
1234  get_stream_idx(d + 1) < s->nb_streams)
1235  continue;
1236 
1237  // detect ##ix chunk and skip
1238  if (d[2] == 'i' && d[3] == 'x' && n < s->nb_streams) {
1239  avio_skip(pb, size);
1240  goto start_sync;
1241  }
1242 
1243  if (d[2] == 'w' && d[3] == 'c' && n < s->nb_streams) {
1244  avio_skip(pb, 16 * 3 + 8);
1245  goto start_sync;
1246  }
1247 
1248  if (avi->dv_demux && n != 0)
1249  continue;
1250 
1251  // parse ##dc/##wb
1252  if (n < s->nb_streams) {
1253  AVStream *st;
1254  AVIStream *ast;
1255  st = s->streams[n];
1256  ast = st->priv_data;
1257 
1258  if (!ast) {
1259  av_log(s, AV_LOG_WARNING, "Skipping foreign stream %d packet\n", n);
1260  continue;
1261  }
1262 
1263  if (s->nb_streams >= 2) {
1264  AVStream *st1 = s->streams[1];
1265  AVIStream *ast1 = st1->priv_data;
1266  // workaround for broken small-file-bug402.avi
1267  if (ast1 && d[2] == 'w' && d[3] == 'b'
1268  && n == 0
1269  && st ->codecpar->codec_type == AVMEDIA_TYPE_VIDEO
1271  && ast->prefix == 'd'*256+'c'
1272  && (d[2]*256+d[3] == ast1->prefix || !ast1->prefix_count)
1273  ) {
1274  n = 1;
1275  st = st1;
1276  ast = ast1;
1278  "Invalid stream + prefix combination, assuming audio.\n");
1279  }
1280  }
1281 
1282  if (d[2] == 'p' && d[3] == 'c' && size <= 4 * 256 + 4) {
1283  int k = avio_r8(pb);
1284  int last = (k + avio_r8(pb) - 1) & 0xFF;
1285 
1286  avio_rl16(pb); // flags
1287 
1288  // b + (g << 8) + (r << 16);
1289  for (; k <= last; k++)
1290  ast->pal[k] = 0xFFU<<24 | avio_rb32(pb)>>8;
1291 
1292  ast->has_pal = 1;
1293  goto start_sync;
1294  } else if (((ast->prefix_count < 5 || sync + 9 > i) &&
1295  d[2] < 128 && d[3] < 128) ||
1296  d[2] * 256 + d[3] == ast->prefix /* ||
1297  (d[2] == 'd' && d[3] == 'c') ||
1298  (d[2] == 'w' && d[3] == 'b') */) {
1299  if (exit_early)
1300  return 0;
1301  if (d[2] * 256 + d[3] == ast->prefix)
1302  ast->prefix_count++;
1303  else {
1304  ast->prefix = d[2] * 256 + d[3];
1305  ast->prefix_count = 0;
1306  }
1307 
1308  if (!avi->dv_demux &&
1309  ((st->discard >= AVDISCARD_DEFAULT && size == 0) /* ||
1310  // FIXME: needs a little reordering
1311  (st->discard >= AVDISCARD_NONKEY &&
1312  !(pkt->flags & AV_PKT_FLAG_KEY)) */
1313  || st->discard >= AVDISCARD_ALL)) {
1314 
1315  ast->frame_offset += get_duration(ast, size);
1316  avio_skip(pb, size);
1317  goto start_sync;
1318  }
1319 
1320  avi->stream_index = n;
1321  ast->packet_size = size + 8;
1322  ast->remaining = size;
1323 
1324  if (size) {
1325  uint64_t pos = avio_tell(pb) - 8;
1326  if (!st->index_entries || !st->nb_index_entries ||
1327  st->index_entries[st->nb_index_entries - 1].pos < pos) {
1328  av_add_index_entry(st, pos, ast->frame_offset, size,
1329  0, AVINDEX_KEYFRAME);
1330  }
1331  }
1332  return 0;
1333  }
1334  }
1335  }
1336 
1337  if (pb->error)
1338  return pb->error;
1339  return AVERROR_EOF;
1340 }
1341 
1343 {
1344  AVIContext *avi = s->priv_data;
1345  int best_stream_index = 0;
1346  AVStream *best_st = NULL;
1347  AVIStream *best_ast;
1348  int64_t best_ts = INT64_MAX;
1349  int i;
1350 
1351  for (i = 0; i < s->nb_streams; i++) {
1352  AVStream *st = s->streams[i];
1353  AVIStream *ast = st->priv_data;
1354  int64_t ts = ast->frame_offset;
1355  int64_t last_ts;
1356 
1357  if (!st->nb_index_entries)
1358  continue;
1359 
1360  last_ts = st->index_entries[st->nb_index_entries - 1].timestamp;
1361  if (!ast->remaining && ts > last_ts)
1362  continue;
1363 
1364  ts = av_rescale_q(ts, st->time_base,
1365  (AVRational) { FFMAX(1, ast->sample_size),
1366  AV_TIME_BASE });
1367 
1368  av_log(s, AV_LOG_TRACE, "%"PRId64" %d/%d %"PRId64"\n", ts,
1369  st->time_base.num, st->time_base.den, ast->frame_offset);
1370  if (ts < best_ts) {
1371  best_ts = ts;
1372  best_st = st;
1373  best_stream_index = i;
1374  }
1375  }
1376  if (!best_st)
1377  return AVERROR_EOF;
1378 
1379  best_ast = best_st->priv_data;
1380  best_ts = best_ast->frame_offset;
1381  if (best_ast->remaining) {
1382  i = av_index_search_timestamp(best_st,
1383  best_ts,
1384  AVSEEK_FLAG_ANY |
1386  } else {
1387  i = av_index_search_timestamp(best_st, best_ts, AVSEEK_FLAG_ANY);
1388  if (i >= 0)
1389  best_ast->frame_offset = best_st->index_entries[i].timestamp;
1390  }
1391 
1392  if (i >= 0) {
1393  int64_t pos = best_st->index_entries[i].pos;
1394  pos += best_ast->packet_size - best_ast->remaining;
1395  if (avio_seek(s->pb, pos + 8, SEEK_SET) < 0)
1396  return AVERROR_EOF;
1397 
1398  av_assert0(best_ast->remaining <= best_ast->packet_size);
1399 
1400  avi->stream_index = best_stream_index;
1401  if (!best_ast->remaining)
1402  best_ast->packet_size =
1403  best_ast->remaining = best_st->index_entries[i].size;
1404  }
1405  else
1406  return AVERROR_EOF;
1407 
1408  return 0;
1409 }
1410 
1412 {
1413  AVIContext *avi = s->priv_data;
1414  AVIOContext *pb = s->pb;
1415  int err;
1416 
1417  if (CONFIG_DV_DEMUXER && avi->dv_demux) {
1418  int size = avpriv_dv_get_packet(avi->dv_demux, pkt);
1419  if (size >= 0)
1420  return size;
1421  else
1422  goto resync;
1423  }
1424 
1425  if (avi->non_interleaved) {
1426  err = ni_prepare_read(s);
1427  if (err < 0)
1428  return err;
1429  }
1430 
1431 resync:
1432  if (avi->stream_index >= 0) {
1433  AVStream *st = s->streams[avi->stream_index];
1434  AVIStream *ast = st->priv_data;
1435  int dv_demux = CONFIG_DV_DEMUXER && avi->dv_demux;
1436  int size, err;
1437 
1438  if (get_subtitle_pkt(s, st, pkt))
1439  return 0;
1440 
1441  // minorityreport.AVI block_align=1024 sample_size=1 IMA-ADPCM
1442  if (ast->sample_size <= 1)
1443  size = INT_MAX;
1444  else if (ast->sample_size < 32)
1445  // arbitrary multiplier to avoid tiny packets for raw PCM data
1446  size = 1024 * ast->sample_size;
1447  else
1448  size = ast->sample_size;
1449 
1450  if (size > ast->remaining)
1451  size = ast->remaining;
1452  avi->last_pkt_pos = avio_tell(pb);
1453  err = av_get_packet(pb, pkt, size);
1454  if (err < 0)
1455  return err;
1456  size = err;
1457 
1458  if (ast->has_pal && pkt->size < (unsigned)INT_MAX / 2 && !dv_demux) {
1459  uint8_t *pal;
1462  AVPALETTE_SIZE);
1463  if (!pal) {
1465  "Failed to allocate data for palette\n");
1466  } else {
1467  memcpy(pal, ast->pal, AVPALETTE_SIZE);
1468  ast->has_pal = 0;
1469  }
1470  }
1471 
1472  if (dv_demux) {
1473  AVBufferRef *avbuf = pkt->buf;
1475  pkt->data, pkt->size, pkt->pos);
1476  pkt->buf = avbuf;
1478  if (size < 0)
1480  } else if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE &&
1481  !st->codecpar->codec_tag && read_gab2_sub(s, st, pkt)) {
1482  ast->frame_offset++;
1483  avi->stream_index = -1;
1484  ast->remaining = 0;
1485  goto resync;
1486  } else {
1487  /* XXX: How to handle B-frames in AVI? */
1488  pkt->dts = ast->frame_offset;
1489 // pkt->dts += ast->start;
1490  if (ast->sample_size)
1491  pkt->dts /= ast->sample_size;
1492  pkt->stream_index = avi->stream_index;
1493 
1494  if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && st->index_entries) {
1495  AVIndexEntry *e;
1496  int index;
1497 
1499  e = &st->index_entries[index];
1500 
1501  if (index >= 0 && e->timestamp == ast->frame_offset) {
1502  if (index == st->nb_index_entries-1) {
1503  int key=1;
1504  uint32_t state=-1;
1505  if (st->codecpar->codec_id == AV_CODEC_ID_MPEG4) {
1506  const uint8_t *ptr = pkt->data, *end = ptr + FFMIN(size, 256);
1507  while (ptr < end) {
1508  ptr = avpriv_find_start_code(ptr, end, &state);
1509  if (state == 0x1B6 && ptr < end) {
1510  key = !(*ptr & 0xC0);
1511  break;
1512  }
1513  }
1514  }
1515  if (!key)
1516  e->flags &= ~AVINDEX_KEYFRAME;
1517  }
1518  if (e->flags & AVINDEX_KEYFRAME)
1520  }
1521  } else {
1523  }
1524  ast->frame_offset += get_duration(ast, pkt->size);
1525  }
1526  ast->remaining -= err;
1527  if (!ast->remaining) {
1528  avi->stream_index = -1;
1529  ast->packet_size = 0;
1530  }
1531 
1532  if (!avi->non_interleaved && pkt->pos >= 0 && ast->seek_pos > pkt->pos) {
1534  goto resync;
1535  }
1536  ast->seek_pos= 0;
1537 
1538  if (!avi->non_interleaved && st->nb_index_entries>1 && avi->index_loaded>1) {
1539  int64_t dts= av_rescale_q(pkt->dts, st->time_base, AV_TIME_BASE_Q);
1540 
1541  if (avi->dts_max < dts) {
1542  avi->dts_max = dts;
1543  } else if (avi->dts_max - (uint64_t)dts > 2*AV_TIME_BASE) {
1544  avi->non_interleaved= 1;
1545  av_log(s, AV_LOG_INFO, "Switching to NI mode, due to poor interleaving\n");
1546  }
1547  }
1548 
1549  return 0;
1550  }
1551 
1552  if ((err = avi_sync(s, 0)) < 0)
1553  return err;
1554  goto resync;
1555 }
1556 
1557 /* XXX: We make the implicit supposition that the positions are sorted
1558  * for each stream. */
1560 {
1561  AVIContext *avi = s->priv_data;
1562  AVIOContext *pb = s->pb;
1563  int nb_index_entries, i;
1564  AVStream *st;
1565  AVIStream *ast;
1566  int64_t pos;
1567  unsigned int index, tag, flags, len, first_packet = 1;
1568  int64_t last_pos = -1;
1569  unsigned last_idx = -1;
1570  int64_t idx1_pos, first_packet_pos = 0, data_offset = 0;
1571  int anykey = 0;
1572 
1573  nb_index_entries = size / 16;
1574  if (nb_index_entries <= 0)
1575  return AVERROR_INVALIDDATA;
1576 
1577  idx1_pos = avio_tell(pb);
1578  avio_seek(pb, avi->movi_list + 4, SEEK_SET);
1579  if (avi_sync(s, 1) == 0)
1580  first_packet_pos = avio_tell(pb) - 8;
1581  avi->stream_index = -1;
1582  avio_seek(pb, idx1_pos, SEEK_SET);
1583 
1584  if (s->nb_streams == 1 && s->streams[0]->codecpar->codec_tag == AV_RL32("MMES")) {
1585  first_packet_pos = 0;
1586  data_offset = avi->movi_list;
1587  }
1588 
1589  /* Read the entries and sort them in each stream component. */
1590  for (i = 0; i < nb_index_entries; i++) {
1591  if (avio_feof(pb))
1592  return -1;
1593 
1594  tag = avio_rl32(pb);
1595  flags = avio_rl32(pb);
1596  pos = avio_rl32(pb);
1597  len = avio_rl32(pb);
1598  av_log(s, AV_LOG_TRACE, "%d: tag=0x%x flags=0x%x pos=0x%"PRIx64" len=%d/",
1599  i, tag, flags, pos, len);
1600 
1601  index = ((tag & 0xff) - '0') * 10;
1602  index += (tag >> 8 & 0xff) - '0';
1603  if (index >= s->nb_streams)
1604  continue;
1605  st = s->streams[index];
1606  ast = st->priv_data;
1607 
1608  /* Skip 'xxpc' palette change entries in the index until a logic
1609  * to process these is properly implemented. */
1610  if ((tag >> 16 & 0xff) == 'p' && (tag >> 24 & 0xff) == 'c')
1611  continue;
1612 
1613  if (first_packet && first_packet_pos) {
1614  if (avi->movi_list + 4 != pos || pos + 500 > first_packet_pos)
1615  data_offset = first_packet_pos - pos;
1616  first_packet = 0;
1617  }
1618  pos += data_offset;
1619 
1620  av_log(s, AV_LOG_TRACE, "%d cum_len=%"PRId64"\n", len, ast->cum_len);
1621 
1622  // even if we have only a single stream, we should
1623  // switch to non-interleaved to get correct timestamps
1624  if (last_pos == pos)
1625  avi->non_interleaved = 1;
1626  if (last_idx != pos && len) {
1627  av_add_index_entry(st, pos, ast->cum_len, len, 0,
1628  (flags & AVIIF_INDEX) ? AVINDEX_KEYFRAME : 0);
1629  last_idx= pos;
1630  }
1631  ast->cum_len += get_duration(ast, len);
1632  last_pos = pos;
1633  anykey |= flags&AVIIF_INDEX;
1634  }
1635  if (!anykey) {
1636  for (index = 0; index < s->nb_streams; index++) {
1637  st = s->streams[index];
1638  if (st->nb_index_entries)
1640  }
1641  }
1642  return 0;
1643 }
1644 
1645 /* Scan the index and consider any file with streams more than
1646  * 2 seconds or 64MB apart non-interleaved. */
1648 {
1649  int64_t min_pos, pos;
1650  int i;
1651  int *idx = av_mallocz_array(s->nb_streams, sizeof(*idx));
1652  if (!idx)
1653  return AVERROR(ENOMEM);
1654  for (min_pos = pos = 0; min_pos != INT64_MAX; pos = min_pos + 1LU) {
1655  int64_t max_dts = INT64_MIN / 2;
1656  int64_t min_dts = INT64_MAX / 2;
1657  int64_t max_buffer = 0;
1658 
1659  min_pos = INT64_MAX;
1660 
1661  for (i = 0; i < s->nb_streams; i++) {
1662  AVStream *st = s->streams[i];
1663  AVIStream *ast = st->priv_data;
1664  int n = st->nb_index_entries;
1665  while (idx[i] < n && st->index_entries[idx[i]].pos < pos)
1666  idx[i]++;
1667  if (idx[i] < n) {
1668  int64_t dts;
1669  dts = av_rescale_q(st->index_entries[idx[i]].timestamp /
1670  FFMAX(ast->sample_size, 1),
1671  st->time_base, AV_TIME_BASE_Q);
1672  min_dts = FFMIN(min_dts, dts);
1673  min_pos = FFMIN(min_pos, st->index_entries[idx[i]].pos);
1674  }
1675  }
1676  for (i = 0; i < s->nb_streams; i++) {
1677  AVStream *st = s->streams[i];
1678  AVIStream *ast = st->priv_data;
1679 
1680  if (idx[i] && min_dts != INT64_MAX / 2) {
1681  int64_t dts;
1682  dts = av_rescale_q(st->index_entries[idx[i] - 1].timestamp /
1683  FFMAX(ast->sample_size, 1),
1684  st->time_base, AV_TIME_BASE_Q);
1685  max_dts = FFMAX(max_dts, dts);
1686  max_buffer = FFMAX(max_buffer,
1687  av_rescale(dts - min_dts,
1688  st->codecpar->bit_rate,
1689  AV_TIME_BASE));
1690  }
1691  }
1692  if (max_dts - min_dts > 2 * AV_TIME_BASE ||
1693  max_buffer > 1024 * 1024 * 8 * 8) {
1694  av_free(idx);
1695  return 1;
1696  }
1697  }
1698  av_free(idx);
1699  return 0;
1700 }
1701 
1703 {
1704  int i;
1705  int64_t last_start = 0;
1706  int64_t first_end = INT64_MAX;
1707  int64_t oldpos = avio_tell(s->pb);
1708 
1709  for (i = 0; i < s->nb_streams; i++) {
1710  AVStream *st = s->streams[i];
1711  int n = st->nb_index_entries;
1712  unsigned int size;
1713 
1714  if (n <= 0)
1715  continue;
1716 
1717  if (n >= 2) {
1718  int64_t pos = st->index_entries[0].pos;
1719  unsigned tag[2];
1720  avio_seek(s->pb, pos, SEEK_SET);
1721  tag[0] = avio_r8(s->pb);
1722  tag[1] = avio_r8(s->pb);
1723  avio_rl16(s->pb);
1724  size = avio_rl32(s->pb);
1725  if (get_stream_idx(tag) == i && pos + size > st->index_entries[1].pos)
1726  last_start = INT64_MAX;
1727  if (get_stream_idx(tag) == i && size == st->index_entries[0].size + 8)
1728  last_start = INT64_MAX;
1729  }
1730 
1731  if (st->index_entries[0].pos > last_start)
1732  last_start = st->index_entries[0].pos;
1733  if (st->index_entries[n - 1].pos < first_end)
1734  first_end = st->index_entries[n - 1].pos;
1735  }
1736  avio_seek(s->pb, oldpos, SEEK_SET);
1737 
1738  if (last_start > first_end)
1739  return 1;
1740 
1741  return check_stream_max_drift(s);
1742 }
1743 
1745 {
1746  AVIContext *avi = s->priv_data;
1747  AVIOContext *pb = s->pb;
1748  uint32_t tag, size;
1749  int64_t pos = avio_tell(pb);
1750  int64_t next;
1751  int ret = -1;
1752 
1753  if (avio_seek(pb, avi->movi_end, SEEK_SET) < 0)
1754  goto the_end; // maybe truncated file
1755  av_log(s, AV_LOG_TRACE, "movi_end=0x%"PRIx64"\n", avi->movi_end);
1756  for (;;) {
1757  tag = avio_rl32(pb);
1758  size = avio_rl32(pb);
1759  if (avio_feof(pb))
1760  break;
1761  next = avio_tell(pb);
1762  if (next < 0 || next > INT64_MAX - size - (size & 1))
1763  break;
1764  next += size + (size & 1LL);
1765 
1766  if (tag == MKTAG('i', 'd', 'x', '1') &&
1767  avi_read_idx1(s, size) >= 0) {
1768  avi->index_loaded=2;
1769  ret = 0;
1770  }else if (tag == MKTAG('L', 'I', 'S', 'T')) {
1771  uint32_t tag1 = avio_rl32(pb);
1772 
1773  if (tag1 == MKTAG('I', 'N', 'F', 'O'))
1774  ff_read_riff_info(s, size - 4);
1775  }else if (!ret)
1776  break;
1777 
1778  if (avio_seek(pb, next, SEEK_SET) < 0)
1779  break; // something is wrong here
1780  }
1781 
1782 the_end:
1783  avio_seek(pb, pos, SEEK_SET);
1784  return ret;
1785 }
1786 
1787 static void seek_subtitle(AVStream *st, AVStream *st2, int64_t timestamp)
1788 {
1789  AVIStream *ast2 = st2->priv_data;
1790  int64_t ts2 = av_rescale_q(timestamp, st->time_base, st2->time_base);
1791  av_packet_unref(&ast2->sub_pkt);
1792  if (avformat_seek_file(ast2->sub_ctx, 0, INT64_MIN, ts2, ts2, 0) >= 0 ||
1793  avformat_seek_file(ast2->sub_ctx, 0, ts2, ts2, INT64_MAX, 0) >= 0)
1794  ff_read_packet(ast2->sub_ctx, &ast2->sub_pkt);
1795 }
1796 
1797 static int avi_read_seek(AVFormatContext *s, int stream_index,
1798  int64_t timestamp, int flags)
1799 {
1800  AVIContext *avi = s->priv_data;
1801  AVStream *st;
1802  int i, index;
1803  int64_t pos, pos_min;
1804  AVIStream *ast;
1805 
1806  /* Does not matter which stream is requested dv in avi has the
1807  * stream information in the first video stream.
1808  */
1809  if (avi->dv_demux)
1810  stream_index = 0;
1811 
1812  if (!avi->index_loaded) {
1813  /* we only load the index on demand */
1814  avi_load_index(s);
1815  avi->index_loaded |= 1;
1816  }
1817  av_assert0(stream_index >= 0);
1818 
1819  st = s->streams[stream_index];
1820  ast = st->priv_data;
1822  timestamp * FFMAX(ast->sample_size, 1),
1823  flags);
1824  if (index < 0) {
1825  if (st->nb_index_entries > 0)
1826  av_log(s, AV_LOG_DEBUG, "Failed to find timestamp %"PRId64 " in index %"PRId64 " .. %"PRId64 "\n",
1827  timestamp * FFMAX(ast->sample_size, 1),
1828  st->index_entries[0].timestamp,
1830  return AVERROR_INVALIDDATA;
1831  }
1832 
1833  /* find the position */
1834  pos = st->index_entries[index].pos;
1835  timestamp = st->index_entries[index].timestamp / FFMAX(ast->sample_size, 1);
1836 
1837  av_log(s, AV_LOG_TRACE, "XX %"PRId64" %d %"PRId64"\n",
1838  timestamp, index, st->index_entries[index].timestamp);
1839 
1840  if (CONFIG_DV_DEMUXER && avi->dv_demux) {
1841  /* One and only one real stream for DV in AVI, and it has video */
1842  /* offsets. Calling with other stream indexes should have failed */
1843  /* the av_index_search_timestamp call above. */
1844 
1845  if (avio_seek(s->pb, pos, SEEK_SET) < 0)
1846  return -1;
1847 
1848  /* Feed the DV video stream version of the timestamp to the */
1849  /* DV demux so it can synthesize correct timestamps. */
1850  ff_dv_offset_reset(avi->dv_demux, timestamp);
1851 
1852  avi->stream_index = -1;
1853  return 0;
1854  }
1855 
1856  pos_min = pos;
1857  for (i = 0; i < s->nb_streams; i++) {
1858  AVStream *st2 = s->streams[i];
1859  AVIStream *ast2 = st2->priv_data;
1860 
1861  ast2->packet_size =
1862  ast2->remaining = 0;
1863 
1864  if (ast2->sub_ctx) {
1865  seek_subtitle(st, st2, timestamp);
1866  continue;
1867  }
1868 
1869  if (st2->nb_index_entries <= 0)
1870  continue;
1871 
1872 // av_assert1(st2->codecpar->block_align);
1874  av_rescale_q(timestamp,
1875  st->time_base,
1876  st2->time_base) *
1877  FFMAX(ast2->sample_size, 1),
1878  flags |
1881  if (index < 0)
1882  index = 0;
1883  ast2->seek_pos = st2->index_entries[index].pos;
1884  pos_min = FFMIN(pos_min,ast2->seek_pos);
1885  }
1886  for (i = 0; i < s->nb_streams; i++) {
1887  AVStream *st2 = s->streams[i];
1888  AVIStream *ast2 = st2->priv_data;
1889 
1890  if (ast2->sub_ctx || st2->nb_index_entries <= 0)
1891  continue;
1892 
1894  st2,
1895  av_rescale_q(timestamp, st->time_base, st2->time_base) * FFMAX(ast2->sample_size, 1),
1897  if (index < 0)
1898  index = 0;
1899  while (!avi->non_interleaved && index>0 && st2->index_entries[index-1].pos >= pos_min)
1900  index--;
1901  ast2->frame_offset = st2->index_entries[index].timestamp;
1902  }
1903 
1904  /* do the seek */
1905  if (avio_seek(s->pb, pos_min, SEEK_SET) < 0) {
1906  av_log(s, AV_LOG_ERROR, "Seek failed\n");
1907  return -1;
1908  }
1909  avi->stream_index = -1;
1910  avi->dts_max = INT_MIN;
1911  return 0;
1912 }
1913 
1915 {
1916  int i;
1917  AVIContext *avi = s->priv_data;
1918 
1919  for (i = 0; i < s->nb_streams; i++) {
1920  AVStream *st = s->streams[i];
1921  AVIStream *ast = st->priv_data;
1922  if (ast) {
1923  if (ast->sub_ctx) {
1924  av_freep(&ast->sub_ctx->pb);
1926  }
1927  av_buffer_unref(&ast->sub_buffer);
1928  av_packet_unref(&ast->sub_pkt);
1929  }
1930  }
1931 
1932  av_freep(&avi->dv_demux);
1933 
1934  return 0;
1935 }
1936 
1937 static int avi_probe(const AVProbeData *p)
1938 {
1939  int i;
1940 
1941  /* check file header */
1942  for (i = 0; avi_headers[i][0]; i++)
1943  if (AV_RL32(p->buf ) == AV_RL32(avi_headers[i] ) &&
1944  AV_RL32(p->buf + 8) == AV_RL32(avi_headers[i] + 4))
1945  return AVPROBE_SCORE_MAX;
1946 
1947  return 0;
1948 }
1949 
1951  .name = "avi",
1952  .long_name = NULL_IF_CONFIG_SMALL("AVI (Audio Video Interleaved)"),
1953  .priv_data_size = sizeof(AVIContext),
1954  .extensions = "avi",
1955  .read_probe = avi_probe,
1960  .priv_class = &demuxer_class,
1961 };
AVStream::index_entries
AVIndexEntry * index_entries
Only used if the format does not support seeking natively.
Definition: avformat.h:1099
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: avpacket.c:599
FF_ENABLE_DEPRECATION_WARNINGS
#define FF_ENABLE_DEPRECATION_WARNINGS
Definition: internal.h:85
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: avcodec.h:3971
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:4480
options
static const AVOption options[]
Definition: avidec.c:89
ni_prepare_read
static int ni_prepare_read(AVFormatContext *s)
Definition: avidec.c:1342
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: avcodec.h:3953
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:3327
AVIStream::sub_ctx
AVFormatContext * sub_ctx
Definition: avidec.c:62
avi_read_idx1
static int avi_read_idx1(AVFormatContext *s, int size)
Definition: avidec.c:1559
GetByteContext
Definition: bytestream.h:33
demuxer_class
static const AVClass demuxer_class
Definition: avidec.c:94
n
int n
Definition: avisynth_c.h:760
AVFMT_FLAG_IGNIDX
#define AVFMT_FLAG_IGNIDX
Ignore index.
Definition: avformat.h:1475
AVStream::priv_data
void * priv_data
Definition: avformat.h:885
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:55
MKTAG
#define MKTAG(a, b, c, d)
Definition: common.h:366
AVStream::discard
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
Definition: avformat.h:925
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:148
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:260
AVIStream
Definition: avidec.c:42
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:78
AV_CODEC_ID_MPEG4
@ AV_CODEC_ID_MPEG4
Definition: avcodec.h:230
end
static av_cold int end(AVCodecContext *avctx)
Definition: avrndec.c:90
AVFormatContext::streams
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1410
MAX_ODML_DEPTH
#define MAX_ODML_DEPTH
Definition: avidec.c:84
internal.h
name
const char * name
Definition: avisynth_c.h:867
AVPacket::data
uint8_t * data
Definition: avcodec.h:1477
AVOption
AVOption.
Definition: opt.h:246
avi_read_close
static int avi_read_close(AVFormatContext *s)
Definition: avidec.c:1914
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: avcodec.h:1190
AVStream::avg_frame_rate
AVRational avg_frame_rate
Average framerate.
Definition: avformat.h:943
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:191
base
uint8_t base
Definition: vp3data.h:202
avi_read_nikon
static void avi_read_nikon(AVFormatContext *s, uint64_t end)
Definition: avidec.c:344
ff_codec_bmp_tags_unofficial
const AVCodecTag ff_codec_bmp_tags_unofficial[]
Definition: riff.c:494
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: avcodec.h:3961
max
#define max(a, b)
Definition: cuda_runtime.h:33
ff_tlog
#define ff_tlog(ctx,...)
Definition: internal.h:75
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: avcodec.h:576
avi_metadata_creation_time
static void avi_metadata_creation_time(AVDictionary **metadata, char *date)
Definition: avidec.c:325
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:1071
codec_type
enum AVMediaType codec_type
Definition: rtp.c:37
avio_size
int64_t avio_size(AVIOContext *s)
Get the filesize.
Definition: aviobuf.c:336
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: avcodec.h:1509
AVIndexEntry
Definition: avformat.h:800
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:540
AVINDEX_KEYFRAME
#define AVINDEX_KEYFRAME
Definition: avformat.h:808
AVIContext::riff_end
int64_t riff_end
Definition: avidec.c:71
check_stream_max_drift
static int check_stream_max_drift(AVFormatContext *s)
Definition: avidec.c:1647
AVPROBE_SCORE_MAX
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:458
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:4452
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:425
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:211
U
#define U(x)
Definition: vp56_arith.h:37
AVIStream::has_pal
int has_pal
Definition: avidec.c:58
fail
#define fail()
Definition: checkasm.h:120
AVSEEK_FLAG_ANY
#define AVSEEK_FLAG_ANY
seek to any frame, even non-keyframes
Definition: avformat.h:2497
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:2056
AV_CODEC_ID_XAN_DPCM
@ AV_CODEC_ID_XAN_DPCM
Definition: avcodec.h:557
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:839
dv.h
avi_read_seek
static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
Definition: avidec.c:1797
AVPROBE_PADDING_SIZE
#define AVPROBE_PADDING_SIZE
extra allocated bytes at the end of the probe buffer
Definition: avformat.h:460
AV_CODEC_ID_MP3
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
Definition: avcodec.h:565
AVStream::duration
int64_t duration
Decoding: duration of the stream, in stream time base.
Definition: avformat.h:919
avio_rl16
unsigned int avio_rl16(AVIOContext *s)
Definition: aviobuf.c:753
AVRational::num
int num
Numerator.
Definition: rational.h:59
AVIStream::handler
uint32_t handler
Definition: avidec.c:48
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:1787
AVIStream::pal
uint32_t pal[256]
Definition: avidec.c:57
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:800
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
state
static struct @313 state
AVInputFormat
Definition: avformat.h:640
duration
int64_t duration
Definition: movenc.c:63
avi_sync
static int avi_sync(AVFormatContext *s, int exit_early)
Definition: avidec.c:1189
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:69
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:257
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:645
AVProbeData::buf
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:448
AVIContext::movi_list
int64_t movi_list
Definition: avidec.c:75
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
AVCodecParameters::width
int width
Video only.
Definition: avcodec.h:4023
AV_CODEC_ID_MP2
@ AV_CODEC_ID_MP2
Definition: avcodec.h:564
AVIndexEntry::size
int size
Definition: avformat.h:811
AVIStream::dshow_block_align
int dshow_block_align
Definition: avidec.c:59
AVIndexEntry::timestamp
int64_t timestamp
Timestamp in AVStream.time_base units, preferably the time from which on correctly decoded frames are...
Definition: avformat.h:802
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:85
AVIStream::remaining
int remaining
Definition: avidec.c:45
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:1088
AVIStream::cum_len
int64_t cum_len
Definition: avidec.c:54
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:280
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:230
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:506
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:329
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
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: avcodec.h:811
AVFormatContext
Format I/O context.
Definition: avformat.h:1342
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: avcodec.h:1460
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:1017
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVSEEK_FLAG_BACKWARD
#define AVSEEK_FLAG_BACKWARD
Definition: avformat.h:2495
read_header
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:530
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:72
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:899
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:112
get_stream_idx
static int get_stream_idx(const unsigned *d)
Definition: avidec.c:1175
AVIContext::odml_depth
int odml_depth
Definition: avidec.c:82
AVIStream::sub_buffer
AVBufferRef * sub_buffer
Definition: avidec.c:64
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:790
AVIndexEntry::flags
int flags
Definition: avformat.h:810
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:191
AVFormatContext::pb
AVIOContext * pb
I/O context.
Definition: avformat.h:1384
avi_read_packet
static int avi_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: avidec.c:1411
AVProbeData
This structure contains the data a format has to probe a file.
Definition: avformat.h:446
AVIStream::packet_size
int packet_size
Definition: avidec.c:46
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:934
AV_CODEC_ID_ADPCM_IMA_AMV
@ AV_CODEC_ID_ADPCM_IMA_AMV
Definition: avcodec.h:521
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:2705
guess_ni_flag
static int guess_ni_flag(AVFormatContext *s)
Definition: avidec.c:1702
AVIStream::prefix_count
int prefix_count
Definition: avidec.c:56
index
int index
Definition: gxfenc.c:89
AVPROBE_SCORE_EXTENSION
#define AVPROBE_SCORE_EXTENSION
score for file extension
Definition: avformat.h:456
AV_CODEC_ID_MPEG1VIDEO
@ AV_CODEC_ID_MPEG1VIDEO
Definition: avcodec.h:219
ff_avi_demuxer
AVInputFormat ff_avi_demuxer
Definition: avidec.c:1950
error
static void error(const char *err)
Definition: target_dec_fuzzer.c:61
AVStream::nb_frames
int64_t nb_frames
number of frames in this stream if known or 0
Definition: avformat.h:921
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:43
AVCodecParameters::extradata_size
int extradata_size
Size of the extradata content in bytes.
Definition: avcodec.h:3975
AVFormatContext::nb_streams
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
Definition: avformat.h:1398
AV_CODEC_ID_AAC
@ AV_CODEC_ID_AAC
Definition: avcodec.h:566
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:769
desc
const char * desc
Definition: nvenc.c:68
AVIOContext
Bytestream IO Context.
Definition: avio.h:161
AVIContext::last_pkt_pos
int64_t last_pkt_pos
Definition: avidec.c:76
AVPacket::size
int size
Definition: avcodec.h:1478
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:3146
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:806
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:1101
months
static const char months[12][4]
Definition: avidec.c:322
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:4910
ff_copy_whiteblacklists
int ff_copy_whiteblacklists(AVFormatContext *dst, const AVFormatContext *src)
Copies the whilelists from one context to the other.
Definition: utils.c:164
size
int size
Definition: twinvq_data.h:11134
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:163
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:2548
ff_riff_info_conv
const AVMetadataConv ff_riff_info_conv[]
Definition: riff.c:583
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:1937
AVStream::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
Definition: avformat.h:932
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: avcodec.h:1476
DVDemuxContext
Definition: dv.c:43
avio_r8
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:638
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: avcodec.h:1483
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:1141
avi_extract_stream_metadata
static int avi_extract_stream_metadata(AVFormatContext *s, AVStream *st)
Definition: avidec.c:387
AV_CODEC_ID_RV40
@ AV_CODEC_ID_RV40
Definition: avcodec.h:287
AVIContext::non_interleaved
int non_interleaved
Definition: avidec.c:79
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: avcodec.h:216
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
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:540
AVIContext::stream_index
int stream_index
Definition: avidec.c:80
internal.h
AVCodecParameters::height
int height
Definition: avcodec.h:4024
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:975
AVCodecParameters::block_align
int block_align
Audio only.
Definition: avcodec.h:4074
AVIStream::sample_size
int sample_size
Definition: avidec.c:51
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:131
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:236
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:1744
AVIStream::rate
uint32_t rate
Definition: avidec.c:50
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:313
AVIStream::prefix
int prefix
Definition: avidec.c:55
AV_CODEC_ID_XSUB
@ AV_CODEC_ID_XSUB
Definition: avcodec.h:661
tag
uint32_t tag
Definition: movenc.c:1496
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:877
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:870
bswap.h
AVIContext::dv_demux
DVDemuxContext * dv_demux
Definition: avidec.c:81
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:246
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:1494
AVSTREAM_PARSE_HEADERS
@ AVSTREAM_PARSE_HEADERS
Only parse headers, do not repack.
Definition: avformat.h:792
avformat.h
dict.h
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: avcodec.h:790
AVIStream::sub_pkt
AVPacket sub_pkt
Definition: avidec.c:63
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:88
AVIStream::scale
uint32_t scale
Definition: avidec.c:49
AV_CODEC_ID_AMV
@ AV_CODEC_ID_AMV
Definition: avcodec.h:325
AVIStream::seek_pos
int64_t seek_pos
Definition: avidec.c:66
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:871
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:73
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:647
AVIndexEntry::pos
int64_t pos
Definition: avformat.h:801
AVStream::request_probe
int request_probe
stream probing state -1 -> probing finished 0 -> no probing requested rest -> perform probing with re...
Definition: avformat.h:1128
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: avcodec.h:1479
avio_skip
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:331
print_tag
#define print_tag(str, tag, size)
Definition: avidec.c:120
AVIContext::io_fsize
int64_t io_fsize
Definition: avidec.c:74
FF_DISABLE_DEPRECATION_WARNINGS
#define FF_DISABLE_DEPRECATION_WARNINGS
Definition: internal.h:84
AVIContext::use_odml
int use_odml
Definition: avidec.c:83
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: avcodec.h:3999
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:81
AVIContext::index_loaded
int index_loaded
Definition: avidec.c:77
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:469
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: avcodec.h:3957
AVPacket
This structure stores compressed data.
Definition: avcodec.h:1454
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: avcodec.h:1497
avio_rl64
uint64_t avio_rl64(AVIOContext *s)
Definition: aviobuf.c:777
bytestream.h
AVSTREAM_PARSE_FULL
@ AVSTREAM_PARSE_FULL
full parsing and repack
Definition: avformat.h:791
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: avcodec.h:3986
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:909
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:793
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: avcodec.h:220
snprintf
#define snprintf
Definition: snprintf.h:34
avi_headers
static const char avi_headers[][8]
Definition: avidec.c:103
avcodec_parameters_copy
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
Copy the contents of src to dst.
Definition: utils.c:2080
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:2167
avio_feof
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
Definition: aviobuf.c:358