FFmpeg
nutdec.c
Go to the documentation of this file.
1 /*
2  * "NUT" Container Format demuxer
3  * Copyright (c) 2004-2006 Michael Niedermayer
4  * Copyright (c) 2003 Alex Beregszaszi
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #include "libavutil/avstring.h"
24 #include "libavutil/avassert.h"
25 #include "libavutil/bswap.h"
26 #include "libavutil/dict.h"
27 #include "libavutil/intreadwrite.h"
28 #include "libavutil/mathematics.h"
29 #include "libavutil/tree.h"
30 #include "libavcodec/bytestream.h"
31 #include "avio_internal.h"
32 #include "isom.h"
33 #include "nut.h"
34 #include "riff.h"
35 
36 #define NUT_MAX_STREAMS 256 /* arbitrary sanity check value */
37 
38 static int64_t nut_read_timestamp(AVFormatContext *s, int stream_index,
39  int64_t *pos_arg, int64_t pos_limit);
40 
41 static int get_str(AVIOContext *bc, char *string, unsigned int maxlen)
42 {
43  unsigned int len = ffio_read_varlen(bc);
44 
45  if (len && maxlen)
46  avio_read(bc, string, FFMIN(len, maxlen));
47  while (len > maxlen) {
48  avio_r8(bc);
49  len--;
50  if (bc->eof_reached)
51  len = maxlen;
52  }
53 
54  if (maxlen)
55  string[FFMIN(len, maxlen - 1)] = 0;
56 
57  if (bc->eof_reached)
58  return AVERROR_EOF;
59  if (maxlen == len)
60  return -1;
61  else
62  return 0;
63 }
64 
65 static int64_t get_s(AVIOContext *bc)
66 {
67  int64_t v = ffio_read_varlen(bc) + 1;
68 
69  if (v & 1)
70  return -(v >> 1);
71  else
72  return (v >> 1);
73 }
74 
75 static uint64_t get_fourcc(AVIOContext *bc)
76 {
77  unsigned int len = ffio_read_varlen(bc);
78 
79  if (len == 2)
80  return avio_rl16(bc);
81  else if (len == 4)
82  return avio_rl32(bc);
83  else {
84  av_log(NULL, AV_LOG_ERROR, "Unsupported fourcc length %d\n", len);
85  return -1;
86  }
87 }
88 
90  int calculate_checksum, uint64_t startcode)
91 {
92  int64_t size;
93 
94  startcode = av_be2ne64(startcode);
95  startcode = ff_crc04C11DB7_update(0, (uint8_t*) &startcode, 8);
96 
98  size = ffio_read_varlen(bc);
99  if (size > 4096)
100  avio_rb32(bc);
101  if (ffio_get_checksum(bc) && size > 4096)
102  return -1;
103 
104  ffio_init_checksum(bc, calculate_checksum ? ff_crc04C11DB7_update : NULL, 0);
105 
106  return size;
107 }
108 
109 static uint64_t find_any_startcode(AVIOContext *bc, int64_t pos)
110 {
111  uint64_t state = 0;
112 
113  if (pos >= 0)
114  /* Note, this may fail if the stream is not seekable, but that should
115  * not matter, as in this case we simply start where we currently are */
116  avio_seek(bc, pos, SEEK_SET);
117  while (!avio_feof(bc)) {
118  state = (state << 8) | avio_r8(bc);
119  if ((state >> 56) != 'N')
120  continue;
121  switch (state) {
122  case MAIN_STARTCODE:
123  case STREAM_STARTCODE:
124  case SYNCPOINT_STARTCODE:
125  case INFO_STARTCODE:
126  case INDEX_STARTCODE:
127  return state;
128  }
129  }
130 
131  return 0;
132 }
133 
134 /**
135  * Find the given startcode.
136  * @param code the startcode
137  * @param pos the start position of the search, or -1 if the current position
138  * @return the position of the startcode or -1 if not found
139  */
140 static int64_t find_startcode(AVIOContext *bc, uint64_t code, int64_t pos)
141 {
142  for (;;) {
143  uint64_t startcode = find_any_startcode(bc, pos);
144  if (startcode == code)
145  return avio_tell(bc) - 8;
146  else if (startcode == 0)
147  return -1;
148  pos = -1;
149  }
150 }
151 
152 static int nut_probe(const AVProbeData *p)
153 {
154  int i;
155 
156  for (i = 0; i < p->buf_size-8; i++) {
157  if (AV_RB32(p->buf+i) != MAIN_STARTCODE>>32)
158  continue;
159  if (AV_RB32(p->buf+i+4) == (MAIN_STARTCODE & 0xFFFFFFFF))
160  return AVPROBE_SCORE_MAX;
161  }
162  return 0;
163 }
164 
165 #define GET_V(dst, check) \
166  do { \
167  tmp = ffio_read_varlen(bc); \
168  if (!(check)) { \
169  av_log(s, AV_LOG_ERROR, "Error " #dst " is (%"PRId64")\n", tmp); \
170  ret = AVERROR_INVALIDDATA; \
171  goto fail; \
172  } \
173  dst = tmp; \
174  } while (0)
175 
176 static int skip_reserved(AVIOContext *bc, int64_t pos)
177 {
178  pos -= avio_tell(bc);
179  if (pos < 0) {
180  avio_seek(bc, pos, SEEK_CUR);
181  return AVERROR_INVALIDDATA;
182  } else {
183  while (pos--) {
184  if (bc->eof_reached)
185  return AVERROR_INVALIDDATA;
186  avio_r8(bc);
187  }
188  return 0;
189  }
190 }
191 
193 {
194  AVFormatContext *s = nut->avf;
195  AVIOContext *bc = s->pb;
196  uint64_t tmp, end, length;
197  unsigned int stream_count;
198  int i, j, count, ret;
199  int tmp_stream, tmp_mul, tmp_pts, tmp_size, tmp_res, tmp_head_idx;
200 
201  length = get_packetheader(nut, bc, 1, MAIN_STARTCODE);
202  end = length + avio_tell(bc);
203 
204  nut->version = ffio_read_varlen(bc);
205  if (nut->version < NUT_MIN_VERSION ||
206  nut->version > NUT_MAX_VERSION) {
207  av_log(s, AV_LOG_ERROR, "Version %d not supported.\n",
208  nut->version);
209  return AVERROR(ENOSYS);
210  }
211  if (nut->version > 3)
212  nut->minor_version = ffio_read_varlen(bc);
213 
214  GET_V(stream_count, tmp > 0 && tmp <= NUT_MAX_STREAMS);
215 
216  nut->max_distance = ffio_read_varlen(bc);
217  if (nut->max_distance > 65536) {
218  av_log(s, AV_LOG_DEBUG, "max_distance %d\n", nut->max_distance);
219  nut->max_distance = 65536;
220  }
221 
222  GET_V(nut->time_base_count, tmp > 0 && tmp < INT_MAX / sizeof(AVRational) && tmp < length/2);
223  nut->time_base = av_malloc_array(nut->time_base_count, sizeof(AVRational));
224  if (!nut->time_base)
225  return AVERROR(ENOMEM);
226 
227  for (i = 0; i < nut->time_base_count; i++) {
228  GET_V(nut->time_base[i].num, tmp > 0 && tmp < (1ULL << 31));
229  GET_V(nut->time_base[i].den, tmp > 0 && tmp < (1ULL << 31));
230  if (av_gcd(nut->time_base[i].num, nut->time_base[i].den) != 1) {
231  av_log(s, AV_LOG_ERROR, "invalid time base %d/%d\n",
232  nut->time_base[i].num,
233  nut->time_base[i].den);
235  goto fail;
236  }
237  }
238  tmp_pts = 0;
239  tmp_mul = 1;
240  tmp_stream = 0;
241  tmp_head_idx = 0;
242  for (i = 0; i < 256;) {
243  int tmp_flags = ffio_read_varlen(bc);
244  int tmp_fields = ffio_read_varlen(bc);
245 
246  if (tmp_fields > 0)
247  tmp_pts = get_s(bc);
248  if (tmp_fields > 1)
249  tmp_mul = ffio_read_varlen(bc);
250  if (tmp_fields > 2)
251  tmp_stream = ffio_read_varlen(bc);
252  if (tmp_fields > 3)
253  tmp_size = ffio_read_varlen(bc);
254  else
255  tmp_size = 0;
256  if (tmp_fields > 4)
257  tmp_res = ffio_read_varlen(bc);
258  else
259  tmp_res = 0;
260  if (tmp_fields > 5)
261  count = ffio_read_varlen(bc);
262  else
263  count = tmp_mul - (unsigned)tmp_size;
264  if (tmp_fields > 6)
265  get_s(bc);
266  if (tmp_fields > 7)
267  tmp_head_idx = ffio_read_varlen(bc);
268 
269  while (tmp_fields-- > 8) {
270  if (bc->eof_reached) {
271  av_log(s, AV_LOG_ERROR, "reached EOF while decoding main header\n");
273  goto fail;
274  }
275  ffio_read_varlen(bc);
276  }
277 
278  if (count <= 0 || count > 256 - (i <= 'N') - i) {
279  av_log(s, AV_LOG_ERROR, "illegal count %d at %d\n", count, i);
281  goto fail;
282  }
283  if (tmp_stream >= stream_count) {
284  av_log(s, AV_LOG_ERROR, "illegal stream number %d >= %d\n",
285  tmp_stream, stream_count);
287  goto fail;
288  }
289  if (tmp_size < 0 || tmp_size > INT_MAX - count) {
290  av_log(s, AV_LOG_ERROR, "illegal size\n");
292  goto fail;
293  }
294 
295  for (j = 0; j < count; j++, i++) {
296  if (i == 'N') {
297  nut->frame_code[i].flags = FLAG_INVALID;
298  j--;
299  continue;
300  }
301  nut->frame_code[i].flags = tmp_flags;
302  nut->frame_code[i].pts_delta = tmp_pts;
303  nut->frame_code[i].stream_id = tmp_stream;
304  nut->frame_code[i].size_mul = tmp_mul;
305  nut->frame_code[i].size_lsb = tmp_size + j;
306  nut->frame_code[i].reserved_count = tmp_res;
307  nut->frame_code[i].header_idx = tmp_head_idx;
308  }
309  }
310  av_assert0(nut->frame_code['N'].flags == FLAG_INVALID);
311 
312  if (end > avio_tell(bc) + 4) {
313  int rem = 1024;
314  GET_V(nut->header_count, tmp < 128U);
315  nut->header_count++;
316  for (i = 1; i < nut->header_count; i++) {
317  uint8_t *hdr;
318  GET_V(nut->header_len[i], tmp > 0 && tmp < 256);
319  if (rem < nut->header_len[i]) {
321  "invalid elision header %d : %d > %d\n",
322  i, nut->header_len[i], rem);
324  goto fail;
325  }
326  rem -= nut->header_len[i];
327  hdr = av_malloc(nut->header_len[i]);
328  if (!hdr) {
329  ret = AVERROR(ENOMEM);
330  goto fail;
331  }
332  avio_read(bc, hdr, nut->header_len[i]);
333  nut->header[i] = hdr;
334  }
335  av_assert0(nut->header_len[0] == 0);
336  }
337 
338  // flags had been effectively introduced in version 4
339  if (nut->version > 3 && end > avio_tell(bc) + 4) {
340  nut->flags = ffio_read_varlen(bc);
341  }
342 
343  if (skip_reserved(bc, end) || ffio_get_checksum(bc)) {
344  av_log(s, AV_LOG_ERROR, "main header checksum mismatch\n");
346  goto fail;
347  }
348 
349  nut->stream = av_calloc(stream_count, sizeof(StreamContext));
350  if (!nut->stream) {
351  ret = AVERROR(ENOMEM);
352  goto fail;
353  }
354  for (i = 0; i < stream_count; i++)
356 
357  return 0;
358 fail:
359  av_freep(&nut->time_base);
360  for (i = 1; i < nut->header_count; i++) {
361  av_freep(&nut->header[i]);
362  }
363  nut->header_count = 0;
364  return ret;
365 }
366 
368 {
369  AVFormatContext *s = nut->avf;
370  AVIOContext *bc = s->pb;
371  StreamContext *stc;
372  int class, stream_id, ret;
373  uint64_t tmp, end;
374  AVStream *st = NULL;
375 
376  end = get_packetheader(nut, bc, 1, STREAM_STARTCODE);
377  end += avio_tell(bc);
378 
379  GET_V(stream_id, tmp < s->nb_streams && !nut->stream[tmp].time_base);
380  stc = &nut->stream[stream_id];
381  st = s->streams[stream_id];
382  if (!st)
383  return AVERROR(ENOMEM);
384 
385  class = ffio_read_varlen(bc);
386  tmp = get_fourcc(bc);
387  st->codecpar->codec_tag = tmp;
388  switch (class) {
389  case 0:
391  st->codecpar->codec_id = av_codec_get_id((const AVCodecTag * const []) {
395  0
396  },
397  tmp);
398  break;
399  case 1:
401  st->codecpar->codec_id = av_codec_get_id((const AVCodecTag * const []) {
405  0
406  },
407  tmp);
408  break;
409  case 2:
412  break;
413  case 3:
416  break;
417  default:
418  av_log(s, AV_LOG_ERROR, "unknown stream class (%d)\n", class);
419  return AVERROR(ENOSYS);
420  }
421  if (class < 3 && st->codecpar->codec_id == AV_CODEC_ID_NONE)
423  "Unknown codec tag '0x%04x' for stream number %d\n",
424  (unsigned int) tmp, stream_id);
425 
426  GET_V(stc->time_base_id, tmp < nut->time_base_count);
427  GET_V(stc->msb_pts_shift, tmp < 16);
429  GET_V(stc->decode_delay, tmp < 1000); // sanity limit, raise this if Moore's law is true
430  st->codecpar->video_delay = stc->decode_delay;
431  ffio_read_varlen(bc); // stream flags
432 
433  GET_V(st->codecpar->extradata_size, tmp < (1 << 30));
434  if (st->codecpar->extradata_size) {
435  ret = ff_get_extradata(s, st->codecpar, bc,
436  st->codecpar->extradata_size);
437  if (ret < 0)
438  return ret;
439  }
440 
441  if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
442  GET_V(st->codecpar->width, tmp > 0);
443  GET_V(st->codecpar->height, tmp > 0);
446  if ((!st->sample_aspect_ratio.num) != (!st->sample_aspect_ratio.den)) {
447  av_log(s, AV_LOG_ERROR, "invalid aspect ratio %d/%d\n",
450  goto fail;
451  }
452  ffio_read_varlen(bc); /* csp type */
453  } else if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
454  GET_V(st->codecpar->sample_rate, tmp > 0);
455  ffio_read_varlen(bc); // samplerate_den
456  GET_V(st->codecpar->channels, tmp > 0);
457  }
458  if (skip_reserved(bc, end) || ffio_get_checksum(bc)) {
460  "stream header %d checksum mismatch\n", stream_id);
462  goto fail;
463  }
464  stc->time_base = &nut->time_base[stc->time_base_id];
465  avpriv_set_pts_info(s->streams[stream_id], 63, stc->time_base->num,
466  stc->time_base->den);
467  return 0;
468 fail:
469  if (st && st->codecpar) {
470  av_freep(&st->codecpar->extradata);
471  st->codecpar->extradata_size = 0;
472  }
473  return ret;
474 }
475 
477  int stream_id)
478 {
479  int flag = 0, i;
480 
481  for (i = 0; ff_nut_dispositions[i].flag; ++i)
482  if (!strcmp(ff_nut_dispositions[i].str, value))
484  if (!flag)
485  av_log(avf, AV_LOG_INFO, "unknown disposition type '%s'\n", value);
486  for (i = 0; i < avf->nb_streams; ++i)
487  if (stream_id == i || stream_id == -1)
488  avf->streams[i]->disposition |= flag;
489 }
490 
492 {
493  AVFormatContext *s = nut->avf;
494  AVIOContext *bc = s->pb;
495  uint64_t tmp, chapter_start, chapter_len;
496  unsigned int stream_id_plus1, count;
497  int i, ret = 0;
498  int64_t chapter_id, value, end;
499  char name[256], str_value[1024], type_str[256];
500  const char *type;
501  int *event_flags = NULL;
502  AVChapter *chapter = NULL;
503  AVStream *st = NULL;
504  AVDictionary **metadata = NULL;
505  int metadata_flag = 0;
506 
507  end = get_packetheader(nut, bc, 1, INFO_STARTCODE);
508  end += avio_tell(bc);
509 
510  GET_V(stream_id_plus1, tmp <= s->nb_streams);
511  chapter_id = get_s(bc);
512  chapter_start = ffio_read_varlen(bc);
513  chapter_len = ffio_read_varlen(bc);
514  count = ffio_read_varlen(bc);
515 
516  if (chapter_id && !stream_id_plus1) {
517  int64_t start = chapter_start / nut->time_base_count;
518  chapter = avpriv_new_chapter(s, chapter_id,
519  nut->time_base[chapter_start %
520  nut->time_base_count],
521  start, start + chapter_len, NULL);
522  if (!chapter) {
523  av_log(s, AV_LOG_ERROR, "Could not create chapter.\n");
524  return AVERROR(ENOMEM);
525  }
526  metadata = &chapter->metadata;
527  } else if (stream_id_plus1) {
528  st = s->streams[stream_id_plus1 - 1];
529  metadata = &st->metadata;
530  event_flags = &st->event_flags;
531  metadata_flag = AVSTREAM_EVENT_FLAG_METADATA_UPDATED;
532  } else {
533  metadata = &s->metadata;
534  event_flags = &s->event_flags;
535  metadata_flag = AVFMT_EVENT_FLAG_METADATA_UPDATED;
536  }
537 
538  for (i = 0; i < count; i++) {
539  ret = get_str(bc, name, sizeof(name));
540  if (ret < 0) {
541  av_log(s, AV_LOG_ERROR, "get_str failed while decoding info header\n");
542  return ret;
543  }
544  value = get_s(bc);
545  str_value[0] = 0;
546 
547  if (value == -1) {
548  type = "UTF-8";
549  ret = get_str(bc, str_value, sizeof(str_value));
550  } else if (value == -2) {
551  ret = get_str(bc, type_str, sizeof(type_str));
552  if (ret < 0) {
553  av_log(s, AV_LOG_ERROR, "get_str failed while decoding info header\n");
554  return ret;
555  }
556  type = type_str;
557  ret = get_str(bc, str_value, sizeof(str_value));
558  } else if (value == -3) {
559  type = "s";
560  value = get_s(bc);
561  } else if (value == -4) {
562  type = "t";
563  value = ffio_read_varlen(bc);
564  } else if (value < -4) {
565  type = "r";
566  get_s(bc);
567  } else {
568  type = "v";
569  }
570 
571  if (ret < 0) {
572  av_log(s, AV_LOG_ERROR, "get_str failed while decoding info header\n");
573  return ret;
574  }
575 
576  if (stream_id_plus1 > s->nb_streams) {
578  "invalid stream id %d for info packet\n",
579  stream_id_plus1);
580  continue;
581  }
582 
583  if (!strcmp(type, "UTF-8")) {
584  if (chapter_id == 0 && !strcmp(name, "Disposition")) {
585  set_disposition_bits(s, str_value, stream_id_plus1 - 1);
586  continue;
587  }
588 
589  if (stream_id_plus1 && !strcmp(name, "r_frame_rate")) {
590  sscanf(str_value, "%d/%d", &st->r_frame_rate.num, &st->r_frame_rate.den);
591  if (st->r_frame_rate.num >= 1000LL*st->r_frame_rate.den ||
592  st->r_frame_rate.num < 0 || st->r_frame_rate.den < 0)
593  st->r_frame_rate.num = st->r_frame_rate.den = 0;
594  continue;
595  }
596 
597  if (metadata && av_strcasecmp(name, "Uses") &&
598  av_strcasecmp(name, "Depends") && av_strcasecmp(name, "Replaces")) {
599  if (event_flags)
600  *event_flags |= metadata_flag;
601  av_dict_set(metadata, name, str_value, 0);
602  }
603  }
604  }
605 
606  if (skip_reserved(bc, end) || ffio_get_checksum(bc)) {
607  av_log(s, AV_LOG_ERROR, "info header checksum mismatch\n");
608  return AVERROR_INVALIDDATA;
609  }
610 fail:
611  return FFMIN(ret, 0);
612 }
613 
614 static int decode_syncpoint(NUTContext *nut, int64_t *ts, int64_t *back_ptr)
615 {
616  AVFormatContext *s = nut->avf;
617  AVIOContext *bc = s->pb;
618  int64_t end;
619  uint64_t tmp;
620  int ret;
621 
622  nut->last_syncpoint_pos = avio_tell(bc) - 8;
623 
624  end = get_packetheader(nut, bc, 1, SYNCPOINT_STARTCODE);
625  end += avio_tell(bc);
626 
627  tmp = ffio_read_varlen(bc);
628  *back_ptr = nut->last_syncpoint_pos - 16 * ffio_read_varlen(bc);
629  if (*back_ptr < 0)
630  return AVERROR_INVALIDDATA;
631 
632  ff_nut_reset_ts(nut, nut->time_base[tmp % nut->time_base_count],
633  tmp / nut->time_base_count);
634 
635  if (nut->flags & NUT_BROADCAST) {
636  tmp = ffio_read_varlen(bc);
637  av_log(s, AV_LOG_VERBOSE, "Syncpoint wallclock %"PRId64"\n",
639  nut->time_base[tmp % nut->time_base_count],
640  AV_TIME_BASE_Q));
641  }
642 
643  if (skip_reserved(bc, end) || ffio_get_checksum(bc)) {
644  av_log(s, AV_LOG_ERROR, "sync point checksum mismatch\n");
645  return AVERROR_INVALIDDATA;
646  }
647 
648  *ts = tmp / nut->time_base_count *
650 
651  if ((ret = ff_nut_add_sp(nut, nut->last_syncpoint_pos, *back_ptr, *ts)) < 0)
652  return ret;
653 
654  return 0;
655 }
656 
657 //FIXME calculate exactly, this is just a good approximation.
658 static int64_t find_duration(NUTContext *nut, int64_t filesize)
659 {
660  AVFormatContext *s = nut->avf;
661  int64_t duration = 0;
662 
664 
665  if(duration > 0)
666  s->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
667  return duration;
668 }
669 
671 {
672  AVFormatContext *s = nut->avf;
673  AVIOContext *bc = s->pb;
674  uint64_t tmp, end;
675  int i, j, syncpoint_count;
676  int64_t filesize = avio_size(bc);
677  int64_t *syncpoints = NULL;
678  uint64_t max_pts;
679  int8_t *has_keyframe = NULL;
680  int ret = AVERROR_INVALIDDATA;
681 
682  if(filesize <= 0)
683  return -1;
684 
685  avio_seek(bc, filesize - 12, SEEK_SET);
686  avio_seek(bc, filesize - avio_rb64(bc), SEEK_SET);
687  if (avio_rb64(bc) != INDEX_STARTCODE) {
688  av_log(s, AV_LOG_WARNING, "no index at the end\n");
689 
690  if(s->duration<=0)
691  s->duration = find_duration(nut, filesize);
692  return ret;
693  }
694 
695  end = get_packetheader(nut, bc, 1, INDEX_STARTCODE);
696  end += avio_tell(bc);
697 
698  max_pts = ffio_read_varlen(bc);
699  s->duration = av_rescale_q(max_pts / nut->time_base_count,
700  nut->time_base[max_pts % nut->time_base_count],
702  s->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
703 
704  GET_V(syncpoint_count, tmp < INT_MAX / 8 && tmp > 0);
705  syncpoints = av_malloc_array(syncpoint_count, sizeof(int64_t));
706  has_keyframe = av_malloc_array(syncpoint_count + 1, sizeof(int8_t));
707  if (!syncpoints || !has_keyframe) {
708  ret = AVERROR(ENOMEM);
709  goto fail;
710  }
711  for (i = 0; i < syncpoint_count; i++) {
712  syncpoints[i] = ffio_read_varlen(bc);
713  if (syncpoints[i] <= 0)
714  goto fail;
715  if (i)
716  syncpoints[i] += syncpoints[i - 1];
717  }
718 
719  for (i = 0; i < s->nb_streams; i++) {
720  int64_t last_pts = -1;
721  for (j = 0; j < syncpoint_count;) {
722  uint64_t x = ffio_read_varlen(bc);
723  int type = x & 1;
724  int n = j;
725  x >>= 1;
726  if (type) {
727  int flag = x & 1;
728  x >>= 1;
729  if (n + x >= syncpoint_count + 1) {
730  av_log(s, AV_LOG_ERROR, "index overflow A %d + %"PRIu64" >= %d\n", n, x, syncpoint_count + 1);
731  goto fail;
732  }
733  while (x--)
734  has_keyframe[n++] = flag;
735  has_keyframe[n++] = !flag;
736  } else {
737  if (x <= 1) {
738  av_log(s, AV_LOG_ERROR, "index: x %"PRIu64" is invalid\n", x);
739  goto fail;
740  }
741  while (x != 1) {
742  if (n >= syncpoint_count + 1) {
743  av_log(s, AV_LOG_ERROR, "index overflow B\n");
744  goto fail;
745  }
746  has_keyframe[n++] = x & 1;
747  x >>= 1;
748  }
749  }
750  if (has_keyframe[0]) {
751  av_log(s, AV_LOG_ERROR, "keyframe before first syncpoint in index\n");
752  goto fail;
753  }
754  av_assert0(n <= syncpoint_count + 1);
755  for (; j < n && j < syncpoint_count; j++) {
756  if (has_keyframe[j]) {
757  uint64_t B, A = ffio_read_varlen(bc);
758  if (!A) {
759  A = ffio_read_varlen(bc);
760  B = ffio_read_varlen(bc);
761  // eor_pts[j][i] = last_pts + A + B
762  } else
763  B = 0;
764  av_add_index_entry(s->streams[i], 16 * syncpoints[j - 1],
765  last_pts + A, 0, 0, AVINDEX_KEYFRAME);
766  last_pts += A + B;
767  }
768  }
769  }
770  }
771 
772  if (skip_reserved(bc, end) || ffio_get_checksum(bc)) {
773  av_log(s, AV_LOG_ERROR, "index checksum mismatch\n");
774  goto fail;
775  }
776  ret = 0;
777 
778 fail:
779  av_free(syncpoints);
780  av_free(has_keyframe);
781  return ret;
782 }
783 
785 {
786  NUTContext *nut = s->priv_data;
787  int i;
788 
789  av_freep(&nut->time_base);
790  av_freep(&nut->stream);
791  ff_nut_free_sp(nut);
792  for (i = 1; i < nut->header_count; i++)
793  av_freep(&nut->header[i]);
794 
795  return 0;
796 }
797 
799 {
800  NUTContext *nut = s->priv_data;
801  AVIOContext *bc = s->pb;
802  int64_t pos;
803  int initialized_stream_count;
804 
805  nut->avf = s;
806 
807  /* main header */
808  pos = 0;
809  do {
810  pos = find_startcode(bc, MAIN_STARTCODE, pos) + 1;
811  if (pos < 0 + 1) {
812  av_log(s, AV_LOG_ERROR, "No main startcode found.\n");
813  return AVERROR_INVALIDDATA;
814  }
815  } while (decode_main_header(nut) < 0);
816 
817  /* stream headers */
818  pos = 0;
819  for (initialized_stream_count = 0; initialized_stream_count < s->nb_streams;) {
821  if (pos < 0 + 1) {
822  av_log(s, AV_LOG_ERROR, "Not all stream headers found.\n");
823  return AVERROR_INVALIDDATA;
824  }
825  if (decode_stream_header(nut) >= 0)
826  initialized_stream_count++;
827  }
828 
829  /* info headers */
830  pos = 0;
831  for (;;) {
832  uint64_t startcode = find_any_startcode(bc, pos);
833  pos = avio_tell(bc);
834 
835  if (startcode == 0) {
836  av_log(s, AV_LOG_ERROR, "EOF before video frames\n");
837  return AVERROR_INVALIDDATA;
838  } else if (startcode == SYNCPOINT_STARTCODE) {
839  nut->next_startcode = startcode;
840  break;
841  } else if (startcode != INFO_STARTCODE) {
842  continue;
843  }
844 
845  decode_info_header(nut);
846  }
847 
849 
850  if (bc->seekable & AVIO_SEEKABLE_NORMAL) {
851  int64_t orig_pos = avio_tell(bc);
853  avio_seek(bc, orig_pos, SEEK_SET);
854  }
856 
858 
859  return 0;
860 }
861 
862 static int read_sm_data(AVFormatContext *s, AVIOContext *bc, AVPacket *pkt, int is_meta, int64_t maxpos)
863 {
864  int count = ffio_read_varlen(bc);
865  int skip_start = 0;
866  int skip_end = 0;
867  int channels = 0;
868  int64_t channel_layout = 0;
869  int sample_rate = 0;
870  int width = 0;
871  int height = 0;
872  int i, ret;
873 
874  for (i=0; i<count; i++) {
875  uint8_t name[256], str_value[256], type_str[256];
876  int value;
877  if (avio_tell(bc) >= maxpos)
878  return AVERROR_INVALIDDATA;
879  ret = get_str(bc, name, sizeof(name));
880  if (ret < 0) {
881  av_log(s, AV_LOG_ERROR, "get_str failed while reading sm data\n");
882  return ret;
883  }
884  value = get_s(bc);
885 
886  if (value == -1) {
887  ret = get_str(bc, str_value, sizeof(str_value));
888  if (ret < 0) {
889  av_log(s, AV_LOG_ERROR, "get_str failed while reading sm data\n");
890  return ret;
891  }
892  av_log(s, AV_LOG_WARNING, "Unknown string %s / %s\n", name, str_value);
893  } else if (value == -2) {
894  uint8_t *dst = NULL;
895  int64_t v64, value_len;
896 
897  ret = get_str(bc, type_str, sizeof(type_str));
898  if (ret < 0) {
899  av_log(s, AV_LOG_ERROR, "get_str failed while reading sm data\n");
900  return ret;
901  }
902  value_len = ffio_read_varlen(bc);
903  if (value_len < 0 || value_len >= maxpos - avio_tell(bc))
904  return AVERROR_INVALIDDATA;
905  if (!strcmp(name, "Palette")) {
907  } else if (!strcmp(name, "Extradata")) {
909  } else if (sscanf(name, "CodecSpecificSide%"SCNd64"", &v64) == 1) {
911  if(!dst)
912  return AVERROR(ENOMEM);
913  AV_WB64(dst, v64);
914  dst += 8;
915  } else if (!strcmp(name, "ChannelLayout") && value_len == 8) {
916  channel_layout = avio_rl64(bc);
917  continue;
918  } else {
919  av_log(s, AV_LOG_WARNING, "Unknown data %s / %s\n", name, type_str);
920  avio_skip(bc, value_len);
921  continue;
922  }
923  if(!dst)
924  return AVERROR(ENOMEM);
925  avio_read(bc, dst, value_len);
926  } else if (value == -3) {
927  value = get_s(bc);
928  } else if (value == -4) {
929  value = ffio_read_varlen(bc);
930  } else if (value < -4) {
931  get_s(bc);
932  } else {
933  if (!strcmp(name, "SkipStart")) {
934  skip_start = value;
935  } else if (!strcmp(name, "SkipEnd")) {
936  skip_end = value;
937  } else if (!strcmp(name, "Channels")) {
938  channels = value;
939  } else if (!strcmp(name, "SampleRate")) {
940  sample_rate = value;
941  } else if (!strcmp(name, "Width")) {
942  width = value;
943  } else if (!strcmp(name, "Height")) {
944  height = value;
945  } else {
946  av_log(s, AV_LOG_WARNING, "Unknown integer %s\n", name);
947  }
948  }
949  }
950 
951  if (channels || channel_layout || sample_rate || width || height) {
953  if (!dst)
954  return AVERROR(ENOMEM);
955  bytestream_put_le32(&dst,
957  AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT*(!!channel_layout) +
960  );
961  if (channels)
962  bytestream_put_le32(&dst, channels);
963  if (channel_layout)
964  bytestream_put_le64(&dst, channel_layout);
965  if (sample_rate)
966  bytestream_put_le32(&dst, sample_rate);
967  if (width || height){
968  bytestream_put_le32(&dst, width);
969  bytestream_put_le32(&dst, height);
970  }
971  }
972 
973  if (skip_start || skip_end) {
975  if (!dst)
976  return AVERROR(ENOMEM);
977  AV_WL32(dst, skip_start);
978  AV_WL32(dst+4, skip_end);
979  }
980 
981  if (avio_tell(bc) >= maxpos)
982  return AVERROR_INVALIDDATA;
983 
984  return 0;
985 }
986 
987 static int decode_frame_header(NUTContext *nut, int64_t *pts, int *stream_id,
988  uint8_t *header_idx, int frame_code)
989 {
990  AVFormatContext *s = nut->avf;
991  AVIOContext *bc = s->pb;
992  StreamContext *stc;
993  int size, flags, size_mul, pts_delta, i, reserved_count, ret;
994  uint64_t tmp;
995 
996  if (!(nut->flags & NUT_PIPE) &&
997  avio_tell(bc) > nut->last_syncpoint_pos + nut->max_distance) {
999  "Last frame must have been damaged %"PRId64" > %"PRId64" + %d\n",
1000  avio_tell(bc), nut->last_syncpoint_pos, nut->max_distance);
1001  return AVERROR_INVALIDDATA;
1002  }
1003 
1004  flags = nut->frame_code[frame_code].flags;
1005  size_mul = nut->frame_code[frame_code].size_mul;
1006  size = nut->frame_code[frame_code].size_lsb;
1007  *stream_id = nut->frame_code[frame_code].stream_id;
1008  pts_delta = nut->frame_code[frame_code].pts_delta;
1009  reserved_count = nut->frame_code[frame_code].reserved_count;
1010  *header_idx = nut->frame_code[frame_code].header_idx;
1011 
1012  if (flags & FLAG_INVALID)
1013  return AVERROR_INVALIDDATA;
1014  if (flags & FLAG_CODED)
1015  flags ^= ffio_read_varlen(bc);
1016  if (flags & FLAG_STREAM_ID) {
1017  GET_V(*stream_id, tmp < s->nb_streams);
1018  }
1019  stc = &nut->stream[*stream_id];
1020  if (flags & FLAG_CODED_PTS) {
1021  int64_t coded_pts = ffio_read_varlen(bc);
1022  // FIXME check last_pts validity?
1023  if (coded_pts < (1LL << stc->msb_pts_shift)) {
1024  *pts = ff_lsb2full(stc, coded_pts);
1025  } else
1026  *pts = coded_pts - (1LL << stc->msb_pts_shift);
1027  } else
1028  *pts = stc->last_pts + pts_delta;
1029  if (flags & FLAG_SIZE_MSB)
1030  size += size_mul * ffio_read_varlen(bc);
1031  if (flags & FLAG_MATCH_TIME)
1032  get_s(bc);
1033  if (flags & FLAG_HEADER_IDX)
1034  *header_idx = ffio_read_varlen(bc);
1035  if (flags & FLAG_RESERVED)
1036  reserved_count = ffio_read_varlen(bc);
1037  for (i = 0; i < reserved_count; i++) {
1038  if (bc->eof_reached) {
1039  av_log(s, AV_LOG_ERROR, "reached EOF while decoding frame header\n");
1040  return AVERROR_INVALIDDATA;
1041  }
1042  ffio_read_varlen(bc);
1043  }
1044 
1045  if (*header_idx >= (unsigned)nut->header_count) {
1046  av_log(s, AV_LOG_ERROR, "header_idx invalid\n");
1047  return AVERROR_INVALIDDATA;
1048  }
1049  if (size > 4096)
1050  *header_idx = 0;
1051  size -= nut->header_len[*header_idx];
1052 
1053  if (flags & FLAG_CHECKSUM) {
1054  avio_rb32(bc); // FIXME check this
1055  } else if (!(nut->flags & NUT_PIPE) &&
1056  size > 2 * nut->max_distance ||
1057  FFABS(stc->last_pts - *pts) > stc->max_pts_distance) {
1058  av_log(s, AV_LOG_ERROR, "frame size > 2max_distance and no checksum\n");
1059  return AVERROR_INVALIDDATA;
1060  }
1061 
1062  stc->last_pts = *pts;
1063  stc->last_flags = flags;
1064 
1065  return size;
1066 fail:
1067  return ret;
1068 }
1069 
1070 static int decode_frame(NUTContext *nut, AVPacket *pkt, int frame_code)
1071 {
1072  AVFormatContext *s = nut->avf;
1073  AVIOContext *bc = s->pb;
1074  int size, stream_id, discard, ret;
1075  int64_t pts, last_IP_pts;
1076  StreamContext *stc;
1077  uint8_t header_idx;
1078 
1079  size = decode_frame_header(nut, &pts, &stream_id, &header_idx, frame_code);
1080  if (size < 0)
1081  return size;
1082 
1083  stc = &nut->stream[stream_id];
1084 
1085  if (stc->last_flags & FLAG_KEY)
1086  stc->skip_until_key_frame = 0;
1087 
1088  discard = s->streams[stream_id]->discard;
1089  last_IP_pts = ffstream(s->streams[stream_id])->last_IP_pts;
1090  if ((discard >= AVDISCARD_NONKEY && !(stc->last_flags & FLAG_KEY)) ||
1091  (discard >= AVDISCARD_BIDIR && last_IP_pts != AV_NOPTS_VALUE &&
1092  last_IP_pts > pts) ||
1093  discard >= AVDISCARD_ALL ||
1094  stc->skip_until_key_frame) {
1095  avio_skip(bc, size);
1096  return 1;
1097  }
1098 
1099  ret = av_new_packet(pkt, size + nut->header_len[header_idx]);
1100  if (ret < 0)
1101  return ret;
1102  if (nut->header[header_idx])
1103  memcpy(pkt->data, nut->header[header_idx], nut->header_len[header_idx]);
1104  pkt->pos = avio_tell(bc); // FIXME
1105  if (stc->last_flags & FLAG_SM_DATA) {
1106  int sm_size;
1107  if (read_sm_data(s, bc, pkt, 0, pkt->pos + size) < 0) {
1109  goto fail;
1110  }
1111  if (read_sm_data(s, bc, pkt, 1, pkt->pos + size) < 0) {
1113  goto fail;
1114  }
1115  sm_size = avio_tell(bc) - pkt->pos;
1116  size -= sm_size;
1117  pkt->size -= sm_size;
1118  }
1119 
1120  ret = avio_read(bc, pkt->data + nut->header_len[header_idx], size);
1121  if (ret != size) {
1122  if (ret < 0)
1123  goto fail;
1124  }
1125  av_shrink_packet(pkt, nut->header_len[header_idx] + ret);
1126 
1127  pkt->stream_index = stream_id;
1128  if (stc->last_flags & FLAG_KEY)
1130  pkt->pts = pts;
1131 
1132  return 0;
1133 fail:
1135  return ret;
1136 }
1137 
1139 {
1140  NUTContext *nut = s->priv_data;
1141  AVIOContext *bc = s->pb;
1142  int i, frame_code = 0, ret, skip;
1143  int64_t ts, back_ptr;
1144 
1145  for (;;) {
1146  int64_t pos = avio_tell(bc);
1147  uint64_t tmp = nut->next_startcode;
1148  nut->next_startcode = 0;
1149 
1150  if (tmp) {
1151  pos -= 8;
1152  } else {
1153  frame_code = avio_r8(bc);
1154  if (avio_feof(bc))
1155  return AVERROR_EOF;
1156  if (frame_code == 'N') {
1157  tmp = frame_code;
1158  for (i = 1; i < 8; i++)
1159  tmp = (tmp << 8) + avio_r8(bc);
1160  }
1161  }
1162  switch (tmp) {
1163  case MAIN_STARTCODE:
1164  case STREAM_STARTCODE:
1165  case INDEX_STARTCODE:
1166  skip = get_packetheader(nut, bc, 0, tmp);
1167  avio_skip(bc, skip);
1168  break;
1169  case INFO_STARTCODE:
1170  if (decode_info_header(nut) < 0)
1171  goto resync;
1172  break;
1173  case SYNCPOINT_STARTCODE:
1174  if (decode_syncpoint(nut, &ts, &back_ptr) < 0)
1175  goto resync;
1176  frame_code = avio_r8(bc);
1177  case 0:
1178  ret = decode_frame(nut, pkt, frame_code);
1179  if (ret == 0)
1180  return 0;
1181  else if (ret == 1) // OK but discard packet
1182  break;
1183  default:
1184 resync:
1185  av_log(s, AV_LOG_DEBUG, "syncing from %"PRId64"\n", pos);
1187  nut->last_resync_pos = avio_tell(bc);
1188  if (tmp == 0)
1189  return AVERROR_INVALIDDATA;
1190  av_log(s, AV_LOG_DEBUG, "sync\n");
1191  nut->next_startcode = tmp;
1192  }
1193  }
1194 }
1195 
1196 static int64_t nut_read_timestamp(AVFormatContext *s, int stream_index,
1197  int64_t *pos_arg, int64_t pos_limit)
1198 {
1199  NUTContext *nut = s->priv_data;
1200  AVIOContext *bc = s->pb;
1201  int64_t pos, pts, back_ptr;
1202  av_log(s, AV_LOG_DEBUG, "read_timestamp(X,%d,%"PRId64",%"PRId64")\n",
1203  stream_index, *pos_arg, pos_limit);
1204 
1205  pos = *pos_arg;
1206  do {
1208  if (pos < 1) {
1209  av_log(s, AV_LOG_ERROR, "read_timestamp failed.\n");
1210  return AV_NOPTS_VALUE;
1211  }
1212  } while (decode_syncpoint(nut, &pts, &back_ptr) < 0);
1213  *pos_arg = pos - 1;
1214  av_assert0(nut->last_syncpoint_pos == *pos_arg);
1215 
1216  av_log(s, AV_LOG_DEBUG, "return %"PRId64" %"PRId64"\n", pts, back_ptr);
1217  if (stream_index == -2)
1218  return back_ptr;
1219  av_assert0(stream_index == -1);
1220  return pts;
1221 }
1222 
1223 static int read_seek(AVFormatContext *s, int stream_index,
1224  int64_t pts, int flags)
1225 {
1226  NUTContext *nut = s->priv_data;
1227  AVStream *st = s->streams[stream_index];
1228  FFStream *const sti = ffstream(st);
1229  Syncpoint dummy = { .ts = pts * av_q2d(st->time_base) * AV_TIME_BASE };
1230  Syncpoint nopts_sp = { .ts = AV_NOPTS_VALUE, .back_ptr = AV_NOPTS_VALUE };
1231  Syncpoint *sp, *next_node[2] = { &nopts_sp, &nopts_sp };
1232  int64_t pos, pos2, ts;
1233  int i;
1234 
1235  if (nut->flags & NUT_PIPE) {
1236  return AVERROR(ENOSYS);
1237  }
1238 
1239  if (sti->index_entries) {
1241  if (index < 0)
1243  if (index < 0)
1244  return -1;
1245 
1246  pos2 = sti->index_entries[index].pos;
1247  ts = sti->index_entries[index].timestamp;
1248  } else {
1250  (void **) next_node);
1251  av_log(s, AV_LOG_DEBUG, "%"PRIu64"-%"PRIu64" %"PRId64"-%"PRId64"\n",
1252  next_node[0]->pos, next_node[1]->pos, next_node[0]->ts,
1253  next_node[1]->ts);
1254  pos = ff_gen_search(s, -1, dummy.ts, next_node[0]->pos,
1255  next_node[1]->pos, next_node[1]->pos,
1256  next_node[0]->ts, next_node[1]->ts,
1258  if (pos < 0)
1259  return pos;
1260 
1261  if (!(flags & AVSEEK_FLAG_BACKWARD)) {
1262  dummy.pos = pos + 16;
1263  next_node[1] = &nopts_sp;
1265  (void **) next_node);
1266  pos2 = ff_gen_search(s, -2, dummy.pos, next_node[0]->pos,
1267  next_node[1]->pos, next_node[1]->pos,
1268  next_node[0]->back_ptr, next_node[1]->back_ptr,
1269  flags, &ts, nut_read_timestamp);
1270  if (pos2 >= 0)
1271  pos = pos2;
1272  // FIXME dir but I think it does not matter
1273  }
1274  dummy.pos = pos;
1276  NULL);
1277 
1278  av_assert0(sp);
1279  pos2 = sp->back_ptr - 15;
1280  }
1281  av_log(s, AV_LOG_DEBUG, "SEEKTO: %"PRId64"\n", pos2);
1282  pos = find_startcode(s->pb, SYNCPOINT_STARTCODE, pos2);
1283  avio_seek(s->pb, pos, SEEK_SET);
1284  nut->last_syncpoint_pos = pos;
1285  av_log(s, AV_LOG_DEBUG, "SP: %"PRId64"\n", pos);
1286  if (pos2 > pos || pos2 + 15 < pos)
1287  av_log(s, AV_LOG_ERROR, "no syncpoint at backptr pos\n");
1288  for (i = 0; i < s->nb_streams; i++)
1289  nut->stream[i].skip_until_key_frame = 1;
1290 
1291  nut->last_resync_pos = 0;
1292 
1293  return 0;
1294 }
1295 
1297  .name = "nut",
1298  .long_name = NULL_IF_CONFIG_SMALL("NUT"),
1299  .flags = AVFMT_SEEK_TO_PTS,
1300  .priv_data_size = sizeof(NUTContext),
1301  .flags_internal = FF_FMT_INIT_CLEANUP,
1302  .read_probe = nut_probe,
1306  .read_seek = read_seek,
1307  .extensions = "nut",
1308  .codec_tag = ff_nut_codec_tags,
1309 };
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: avpacket.c:424
nut_read_close
static int nut_read_close(AVFormatContext *s)
Definition: nutdec.c:784
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:204
av_codec_get_id
enum AVCodecID av_codec_get_id(const struct AVCodecTag *const *tags, unsigned int tag)
Get the AVCodecID for the given codec tag tag.
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
AVCodecParameters::extradata
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: codec_par.h:74
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
ff_nut_audio_extra_tags
const AVCodecTag ff_nut_audio_extra_tags[]
Definition: nut.c:211
FrameCode::stream_id
uint8_t stream_id
Definition: nut.h:67
FF_FMT_INIT_CLEANUP
#define FF_FMT_INIT_CLEANUP
For an AVInputFormat with this flag set read_close() needs to be called by the caller upon read_heade...
Definition: internal.h:49
AVChapter::metadata
AVDictionary * metadata
Definition: avformat.h:1163
NUT_PIPE
#define NUT_PIPE
Definition: nut.h:114
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
avformat_new_stream
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
Definition: utils.c:768
decode_frame
static int decode_frame(NUTContext *nut, AVPacket *pkt, int frame_code)
Definition: nutdec.c:1070
StreamContext::last_flags
int last_flags
Definition: nut.h:76
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:56
NUTContext::time_base_count
unsigned int time_base_count
Definition: nut.h:103
AV_WL32
#define AV_WL32(p, v)
Definition: intreadwrite.h:426
last_pts
static int64_t last_pts
Definition: filtering_video.c:52
NUT_MAX_VERSION
#define NUT_MAX_VERSION
Definition: nut.h:39
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:469
NUTContext::minor_version
int minor_version
Definition: nut.h:117
AV_PKT_DATA_PARAM_CHANGE
@ AV_PKT_DATA_PARAM_CHANGE
An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows:
Definition: packet.h:72
FFStream::last_IP_pts
int64_t last_IP_pts
Definition: internal.h:396
ffformatcontext
static av_always_inline FFFormatContext * ffformatcontext(AVFormatContext *s)
Definition: internal.h:189
NUTContext::max_distance
unsigned int max_distance
Definition: nut.h:102
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
nut_read_packet
static int nut_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: nutdec.c:1138
ff_find_last_ts
int ff_find_last_ts(AVFormatContext *s, int stream_index, int64_t *ts, int64_t *pos, int64_t(*read_timestamp)(struct AVFormatContext *, int, int64_t *, int64_t))
Definition: seek.c:352
ff_nut_data_tags
const AVCodecTag ff_nut_data_tags[]
Definition: nut.c:38
SYNCPOINT_STARTCODE
#define SYNCPOINT_STARTCODE
Definition: nut.h:31
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:260
av_strcasecmp
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
Definition: avstring.c:215
ff_gen_search
int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts, int64_t pos_min, int64_t pos_max, int64_t pos_limit, int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret, int64_t(*read_timestamp)(struct AVFormatContext *, int, int64_t *, int64_t))
Perform a binary search using read_timestamp().
Definition: seek.c:390
FLAG_RESERVED
@ FLAG_RESERVED
Definition: nut.h:50
STREAM_STARTCODE
#define STREAM_STARTCODE
Definition: nut.h:30
av_be2ne64
#define av_be2ne64(x)
Definition: bswap.h:94
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:26
AVFormatContext::streams
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1268
index
fg index
Definition: ffmpeg_filter.c:167
AVPacket::data
uint8_t * data
Definition: packet.h:373
ff_nut_dispositions
const Dispositions ff_nut_dispositions[]
Definition: nut.c:324
NUTContext::last_syncpoint_pos
int64_t last_syncpoint_pos
Definition: nut.h:104
AV_PKT_DATA_PALETTE
@ AV_PKT_DATA_PALETTE
An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE bytes worth of palette.
Definition: packet.h:46
NUTContext::header_len
uint8_t header_len[128]
Definition: nut.h:97
AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE
@ AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE
Definition: packet.h:452
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:196
ff_codec_wav_tags
const AVCodecTag ff_codec_wav_tags[]
Definition: riff.c:509
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: codec_par.h:64
find_any_startcode
static uint64_t find_any_startcode(AVIOContext *bc, int64_t pos)
Definition: nutdec.c:109
StreamContext::decode_delay
int decode_delay
Definition: nut.h:83
mathematics.h
ff_nut_reset_ts
void ff_nut_reset_ts(NUTContext *nut, AVRational time_base, int64_t val)
Definition: nut.c:255
AVDictionary
Definition: dict.c:30
FrameCode::size_lsb
uint16_t size_lsb
Definition: nut.h:69
AVProbeData::buf_size
int buf_size
Size of buf except extra allocated bytes.
Definition: avformat.h:450
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
nut_probe
static int nut_probe(const AVProbeData *p)
Definition: nutdec.c:152
Syncpoint
Definition: nut.h:58
read_sm_data
static int read_sm_data(AVFormatContext *s, AVIOContext *bc, AVPacket *pkt, int is_meta, int64_t maxpos)
Definition: nutdec.c:862
AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT
@ AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT
Definition: packet.h:451
avio_size
int64_t avio_size(AVIOContext *s)
Get the filesize.
Definition: aviobuf.c:352
get_fourcc
static uint64_t get_fourcc(AVIOContext *bc)
Definition: nutdec.c:75
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:428
sample_rate
sample_rate
Definition: ffmpeg_filter.c:153
ffio_get_checksum
unsigned long ffio_get_checksum(AVIOContext *s)
Definition: aviobuf.c:612
AV_WB64
#define AV_WB64(p, v)
Definition: intreadwrite.h:433
NUTContext::last_resync_pos
int64_t last_resync_pos
Definition: nut.h:105
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
AVINDEX_KEYFRAME
#define AVINDEX_KEYFRAME
Definition: avformat.h:809
av_gcd
int64_t av_gcd(int64_t a, int64_t b)
Compute the greatest common divisor of two integer operands.
Definition: mathematics.c:36
A
#define A(x)
Definition: vp56_arith.h:28
ff_nut_sp_pos_cmp
int ff_nut_sp_pos_cmp(const void *a, const void *b)
Definition: nut.c:273
AVPROBE_SCORE_MAX
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:459
ff_nut_free_sp
void ff_nut_free_sp(NUTContext *nut)
Definition: nut.c:316
AVCodecParameters::channels
int channels
Audio only.
Definition: codec_par.h:166
get_s
static int64_t get_s(AVIOContext *bc)
Definition: nutdec.c:65
ffstream
static av_always_inline FFStream * ffstream(AVStream *st)
Definition: internal.h:432
AVFMT_SEEK_TO_PTS
#define AVFMT_SEEK_TO_PTS
Seeking is based on PTS.
Definition: avformat.h:497
U
#define U(x)
Definition: vp56_arith.h:37
fail
#define fail()
Definition: checkasm.h:127
av_shrink_packet
void av_shrink_packet(AVPacket *pkt, int size)
Reduce packet size, correctly zeroing padding.
Definition: avpacket.c:114
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:117
read_close
static av_cold int read_close(AVFormatContext *ctx)
Definition: libcdio.c:141
avio_tell
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:504
NUTContext::avf
AVFormatContext * avf
Definition: nut.h:93
AVChapter
Definition: avformat.h:1159
AVFMT_DURATION_FROM_PTS
@ AVFMT_DURATION_FROM_PTS
Duration accurately estimated from PTSes.
Definition: avformat.h:1181
skip_reserved
static int skip_reserved(AVIOContext *bc, int64_t pos)
Definition: nutdec.c:176
type
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 type
Definition: writing_filters.txt:86
pts
static int64_t pts
Definition: transcode_aac.c:653
NUTContext::header
const uint8_t * header[128]
Definition: nut.h:98
NUT_MAX_STREAMS
#define NUT_MAX_STREAMS
Definition: nutdec.c:36
avio_rl16
unsigned int avio_rl16(AVIOContext *s)
Definition: aviobuf.c:743
Syncpoint::ts
int64_t ts
Definition: nut.h:62
AVRational::num
int num
Numerator.
Definition: rational.h:59
NUTContext::header_count
int header_count
Definition: nut.h:106
avassert.h
avio_rb32
unsigned int avio_rb32(AVIOContext *s)
Definition: aviobuf.c:790
pkt
AVPacket * pkt
Definition: movenc.c:59
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
NUTContext
Definition: nut.h:91
AVInputFormat
Definition: avformat.h:650
AVCodecTag
Definition: internal.h:51
duration
int64_t duration
Definition: movenc.c:64
AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS
@ AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS
Definition: packet.h:453
width
#define width
intreadwrite.h
ff_nut_metadata_conv
const AVMetadataConv ff_nut_metadata_conv[]
Definition: nut.c:334
s
#define s(width, name)
Definition: cbs_vp9.c:257
nut.h
av_new_packet
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
Definition: avpacket.c:99
FrameCode::reserved_count
uint8_t reserved_count
Definition: nut.h:71
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:655
get_str
static int get_str(AVIOContext *bc, char *string, unsigned int maxlen)
Definition: nutdec.c:41
AVProbeData::buf
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:449
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
AVCodecParameters::width
int width
Video only.
Definition: codec_par.h:126
NUTContext::time_base
AVRational * time_base
Definition: nut.h:107
av_q2d
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition: rational.h:104
find_startcode
static int64_t find_startcode(AVIOContext *bc, uint64_t code, int64_t pos)
Find the given startcode.
Definition: nutdec.c:140
AVIndexEntry::timestamp
int64_t timestamp
Timestamp in AVStream.time_base units, preferably the time from which on correctly decoded frames are...
Definition: avformat.h:803
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
nut_read_timestamp
static int64_t nut_read_timestamp(AVFormatContext *s, int stream_index, int64_t *pos_arg, int64_t pos_limit)
Definition: nutdec.c:1196
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
FFFormatContext::data_offset
int64_t data_offset
offset of the first packet
Definition: internal.h:99
StreamContext::last_pts
int64_t last_pts
Definition: nut.h:78
channels
channels
Definition: aptx.h:33
nb_streams
static int nb_streams
Definition: ffprobe.c:297
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:141
AVMEDIA_TYPE_DATA
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
Definition: avutil.h:203
FrameCode::size_mul
uint16_t size_mul
Definition: nut.h:68
FLAG_INVALID
@ FLAG_INVALID
Definition: nut.h:55
AVDISCARD_BIDIR
@ AVDISCARD_BIDIR
discard all bidirectional frames
Definition: defs.h:51
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:65
GET_V
#define GET_V(dst, check)
Definition: nutdec.c:165
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:54
AVFormatContext
Format I/O context.
Definition: avformat.h:1200
ff_metadata_conv_ctx
void ff_metadata_conv_ctx(AVFormatContext *ctx, const AVMetadataConv *d_conv, const AVMetadataConv *s_conv)
Definition: metadata.c:59
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:1095
AVSEEK_FLAG_BACKWARD
#define AVSEEK_FLAG_BACKWARD
Definition: avformat.h:2275
read_header
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:527
Dispositions::flag
int flag
Definition: nut.h:130
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:965
NULL
#define NULL
Definition: coverity.c:32
read_probe
static int read_probe(const AVProbeData *pd)
Definition: jvdec.c:55
NUT_BROADCAST
#define NUT_BROADCAST
Definition: nut.h:113
isom.h
ff_nut_sp_pts_cmp
int ff_nut_sp_pts_cmp(const void *a, const void *b)
Definition: nut.c:279
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
avio_rb64
uint64_t avio_rb64(AVIOContext *s)
Definition: aviobuf.c:937
AVProbeData
This structure contains the data a format has to probe a file.
Definition: avformat.h:447
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:1006
read_seek
static int read_seek(AVFormatContext *s, int stream_index, int64_t pts, int flags)
Definition: nutdec.c:1223
ff_nut_video_tags
const AVCodecTag ff_nut_video_tags[]
Definition: nut.c:43
ff_codec_movvideo_tags
const AVCodecTag ff_codec_movvideo_tags[]
Definition: isom_tags.c:29
FLAG_MATCH_TIME
@ FLAG_MATCH_TIME
Definition: nut.h:53
AVSTREAM_EVENT_FLAG_METADATA_UPDATED
#define AVSTREAM_EVENT_FLAG_METADATA_UPDATED
Definition: avformat.h:1068
AVCodecParameters::sample_rate
int sample_rate
Audio only.
Definition: codec_par.h:170
FLAG_CODED
@ FLAG_CODED
Definition: nut.h:54
AVCodecParameters::extradata_size
int extradata_size
Size of the extradata content in bytes.
Definition: codec_par.h:78
AVFormatContext::nb_streams
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
Definition: avformat.h:1256
StreamContext
Definition: transcoding.c:51
decode_main_header
static int decode_main_header(NUTContext *nut)
Definition: nutdec.c:192
StreamContext::time_base_id
int time_base_id
Definition: nut.h:79
FLAG_SIZE_MSB
@ FLAG_SIZE_MSB
Definition: nut.h:48
avio_rl32
unsigned int avio_rl32(AVIOContext *s)
Definition: aviobuf.c:759
AVDISCARD_NONKEY
@ AVDISCARD_NONKEY
discard all frames except keyframes
Definition: defs.h:53
AVIOContext
Bytestream IO Context.
Definition: avio.h:161
ff_nut_demuxer
const AVInputFormat ff_nut_demuxer
Definition: nutdec.c:1296
state
static struct @320 state
AVPacket::size
int size
Definition: packet.h:374
FrameCode::pts_delta
int16_t pts_delta
Definition: nut.h:70
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:117
ff_codec_get_id
enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
Definition: utils.c:357
AVIOContext::seekable
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
Definition: avio.h:262
FFStream
Definition: internal.h:194
sp
#define sp
Definition: regdef.h:63
NUTContext::flags
int flags
Definition: nut.h:115
ff_nut_audio_tags
const AVCodecTag ff_nut_audio_tags[]
Definition: nut.c:221
size
int size
Definition: twinvq_data.h:10344
NUTContext::stream
StreamContext * stream
Definition: nut.h:100
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
AV_RB32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
Definition: bytestream.h:96
AVStream::event_flags
int event_flags
Flags indicating events happening on the stream, a combination of AVSTREAM_EVENT_FLAG_*.
Definition: avformat.h:1061
FrameCode::flags
uint16_t flags
Definition: nut.h:66
ffio_init_checksum
void ffio_init_checksum(AVIOContext *s, unsigned long(*update_checksum)(unsigned long c, const uint8_t *p, unsigned int len), unsigned long checksum)
Definition: aviobuf.c:620
AVStream::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
Definition: avformat.h:1004
tree.h
avio_r8
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:632
height
#define height
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:379
ffio_read_varlen
uint64_t ffio_read_varlen(AVIOContext *bc)
Definition: aviobuf.c:945
NUTContext::version
int version
Definition: nut.h:116
StreamContext::msb_pts_shift
int msb_pts_shift
Definition: nut.h:81
ff_crc04C11DB7_update
unsigned long ff_crc04C11DB7_update(unsigned long checksum, const uint8_t *buf, unsigned int len)
Definition: aviobuf.c:594
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:191
flag
#define flag(name)
Definition: cbs_av1.c:553
ff_nut_add_sp
int ff_nut_add_sp(NUTContext *nut, int64_t pos, int64_t back_ptr, int64_t ts)
Definition: nut.c:285
NUTContext::syncpoints
struct AVTreeNode * syncpoints
Definition: nut.h:108
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:48
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:271
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:366
code
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
Definition: filter_design.txt:178
avio_internal.h
ff_lsb2full
int64_t ff_lsb2full(StreamContext *stream, int64_t lsb)
Definition: nut.c:266
NUTContext::next_startcode
uint64_t next_startcode
Definition: nut.h:99
find_and_decode_index
static int find_and_decode_index(NUTContext *nut)
Definition: nutdec.c:670
AVCodecParameters::height
int height
Definition: codec_par.h:127
AV_TIME_BASE
#define AV_TIME_BASE
Internal time base represented as integer.
Definition: avutil.h:254
resync
static int resync(AVFormatContext *s)
Definition: flvdec.c:972
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:32
StreamContext::skip_until_key_frame
int skip_until_key_frame
Definition: nut.h:77
get_packetheader
static int get_packetheader(NUTContext *nut, AVIOContext *bc, int calculate_checksum, uint64_t startcode)
Definition: nutdec.c:89
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
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
AV_PKT_DATA_SKIP_SAMPLES
@ AV_PKT_DATA_SKIP_SAMPLES
Recommmends skipping the specified number of samples.
Definition: packet.h:156
len
int len
Definition: vorbis_enc_data.h:426
avpriv_new_chapter
AVChapter * avpriv_new_chapter(AVFormatContext *s, int64_t id, AVRational time_base, int64_t start, int64_t end, const char *title)
Add a new chapter.
Definition: utils.c:883
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:271
NUTContext::frame_code
FrameCode frame_code[256]
Definition: nut.h:96
FLAG_SM_DATA
@ FLAG_SM_DATA
Definition: nut.h:51
decode_frame_header
static int decode_frame_header(NUTContext *nut, int64_t *pts, int *stream_id, uint8_t *header_idx, int frame_code)
Definition: nutdec.c:987
AVStream::disposition
int disposition
Stream disposition - a combination of AV_DISPOSITION_* flags.
Definition: avformat.h:995
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:935
bswap.h
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:260
FLAG_STREAM_ID
@ FLAG_STREAM_ID
Definition: nut.h:47
decode_syncpoint
static int decode_syncpoint(NUTContext *nut, int64_t *ts, int64_t *back_ptr)
Definition: nutdec.c:614
pos
unsigned int pos
Definition: spdifenc.c:412
dict.h
FrameCode::header_idx
uint8_t header_idx
Definition: nut.h:72
set_disposition_bits
static void set_disposition_bits(AVFormatContext *avf, char *value, int stream_id)
Definition: nutdec.c:476
FLAG_CHECKSUM
@ FLAG_CHECKSUM
Definition: nut.h:49
FLAG_KEY
@ FLAG_KEY
Definition: nut.h:44
B
#define B
Definition: huffyuvdsp.h:32
ff_codec_bmp_tags
const AVCodecTag ff_codec_bmp_tags[]
Definition: riff.c:34
ff_nut_codec_tags
const AVCodecTag *const ff_nut_codec_tags[]
Definition: nut.c:250
AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT
@ AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT
Definition: packet.h:450
FLAG_HEADER_IDX
@ FLAG_HEADER_IDX
Definition: nut.h:52
AVIO_SEEKABLE_NORMAL
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
Definition: avio.h:40
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: avpacket.c:232
AV_PKT_DATA_NEW_EXTRADATA
@ AV_PKT_DATA_NEW_EXTRADATA
The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format that the extradata buffer was...
Definition: packet.h:55
AVRational::den
int den
Denominator.
Definition: rational.h:60
dummy
int dummy
Definition: motion.c:65
nut_read_header
static int nut_read_header(AVFormatContext *s)
Definition: nutdec.c:798
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:641
AVStream::r_frame_rate
AVRational r_frame_rate
Real base framerate of the stream.
Definition: avformat.h:1084
AVIndexEntry::pos
int64_t pos
Definition: avformat.h:802
AVIOContext::eof_reached
int eof_reached
true if was unable to read due to error or eof
Definition: avio.h:239
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: utils.c:1196
AVPacket::stream_index
int stream_index
Definition: packet.h:375
av_tree_find
void * av_tree_find(const AVTreeNode *t, void *key, int(*cmp)(const void *key, const void *b), void *next[2])
Definition: tree.c:39
avio_skip
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:347
FFStream::index_entries
AVIndexEntry * index_entries
Only used if the format does not support seeking natively.
Definition: internal.h:277
NUT_MIN_VERSION
#define NUT_MIN_VERSION
Definition: nut.h:41
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL
@ AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL
Data found in BlockAdditional element of matroska container.
Definition: packet.h:191
ff_nut_subtitle_tags
const AVCodecTag ff_nut_subtitle_tags[]
Definition: nut.c:28
AVCodecParameters::video_delay
int video_delay
Video only.
Definition: codec_par.h:155
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
FLAG_CODED_PTS
@ FLAG_CODED_PTS
Definition: nut.h:46
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:60
decode_stream_header
static int decode_stream_header(NUTContext *nut)
Definition: nutdec.c:367
AVPacket
This structure stores compressed data.
Definition: packet.h:350
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
av_dict_set
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:70
riff.h
AVPacket::pos
int64_t pos
byte position in stream, -1 if unknown
Definition: packet.h:393
avio_rl64
uint64_t avio_rl64(AVIOContext *s)
Definition: aviobuf.c:767
INDEX_STARTCODE
#define INDEX_STARTCODE
Definition: nut.h:32
bytestream.h
convert_header.str
string str
Definition: convert_header.py:20
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:561
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:61
avstring.h
StreamContext::time_base
AVRational time_base
Definition: signature.h:103
find_duration
static int64_t find_duration(NUTContext *nut, int64_t filesize)
Definition: nutdec.c:658
INFO_STARTCODE
#define INFO_STARTCODE
Definition: nut.h:33
MAIN_STARTCODE
#define MAIN_STARTCODE
Definition: nut.h:29
StreamContext::max_pts_distance
int max_pts_distance
Definition: nut.h:82
AVFMT_EVENT_FLAG_METADATA_UPDATED
#define AVFMT_EVENT_FLAG_METADATA_UPDATED
Definition: avformat.h:1517
decode_info_header
static int decode_info_header(NUTContext *nut)
Definition: nutdec.c:491
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:237
avio_feof
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
Definition: aviobuf.c:375