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