FFmpeg
nutenc.c
Go to the documentation of this file.
1 /*
2  * nut muxer
3  * Copyright (c) 2004-2007 Michael Niedermayer
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 <stdint.h>
23 
24 #include "libavutil/intreadwrite.h"
25 #include "libavutil/mathematics.h"
26 #include "libavutil/tree.h"
27 #include "libavutil/dict.h"
28 #include "libavutil/avassert.h"
29 #include "libavutil/time.h"
30 #include "libavutil/opt.h"
31 #include "libavcodec/bytestream.h"
33 #include "nut.h"
34 #include "internal.h"
35 #include "avio_internal.h"
36 #include "riff.h"
37 
38 static int find_expected_header(AVCodecParameters *p, int size, int key_frame,
39  uint8_t out[64])
40 {
41  int sample_rate = p->sample_rate;
42 
43  if (size > 4096)
44  return 0;
45 
46  AV_WB24(out, 1);
47 
48  if (p->codec_id == AV_CODEC_ID_MPEG4) {
49  if (key_frame) {
50  return 3;
51  } else {
52  out[3] = 0xB6;
53  return 4;
54  }
55  } else if (p->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
57  return 3;
58  } else if (p->codec_id == AV_CODEC_ID_H264) {
59  return 3;
60  } else if (p->codec_id == AV_CODEC_ID_MP3 ||
61  p->codec_id == AV_CODEC_ID_MP2) {
62  int lsf, mpeg25, sample_rate_index, bitrate_index, frame_size;
63  int layer = p->codec_id == AV_CODEC_ID_MP3 ? 3 : 2;
64  unsigned int header = 0xFFF00000;
65 
66  lsf = sample_rate < (24000 + 32000) / 2;
67  mpeg25 = sample_rate < (12000 + 16000) / 2;
68  sample_rate <<= lsf + mpeg25;
69  if (sample_rate < (32000 + 44100) / 2) sample_rate_index = 2;
70  else if (sample_rate < (44100 + 48000) / 2) sample_rate_index = 0;
71  else sample_rate_index = 1;
72 
73  sample_rate = avpriv_mpa_freq_tab[sample_rate_index] >> (lsf + mpeg25);
74 
75  for (bitrate_index = 2; bitrate_index < 30; bitrate_index++) {
76  frame_size =
77  avpriv_mpa_bitrate_tab[lsf][layer - 1][bitrate_index >> 1];
78  frame_size = (frame_size * 144000) / (sample_rate << lsf) +
79  (bitrate_index & 1);
80 
81  if (frame_size == size)
82  break;
83  }
84 
85  header |= (!lsf) << 19;
86  header |= (4 - layer) << 17;
87  header |= 1 << 16; //no crc
88  AV_WB32(out, header);
89  if (size <= 0)
90  return 2; //we guess there is no crc, if there is one the user clearly does not care about overhead
91  if (bitrate_index == 30)
92  return -1; //something is wrong ...
93 
94  header |= (bitrate_index >> 1) << 12;
95  header |= sample_rate_index << 10;
96  header |= (bitrate_index & 1) << 9;
97 
98  return 2; //FIXME actually put the needed ones in build_elision_headers()
99  //return 3; //we guess that the private bit is not set
100 //FIXME the above assumptions should be checked, if these turn out false too often something should be done
101  }
102  return 0;
103 }
104 
106  int frame_type)
107 {
108  NUTContext *nut = s->priv_data;
109  uint8_t out[64];
110  int i;
111  int len = find_expected_header(p, size, frame_type, out);
112 
113  for (i = 1; i < nut->header_count; i++) {
114  if (len == nut->header_len[i] && !memcmp(out, nut->header[i], len)) {
115  return i;
116  }
117  }
118 
119  return 0;
120 }
121 
123 {
124  NUTContext *nut = s->priv_data;
125  int i;
126  //FIXME this is lame
127  //FIXME write a 2pass mode to find the maximal headers
128  static const uint8_t headers[][5] = {
129  { 3, 0x00, 0x00, 0x01 },
130  { 4, 0x00, 0x00, 0x01, 0xB6},
131  { 2, 0xFF, 0xFA }, //mp3+crc
132  { 2, 0xFF, 0xFB }, //mp3
133  { 2, 0xFF, 0xFC }, //mp2+crc
134  { 2, 0xFF, 0xFD }, //mp2
135  };
136 
137  nut->header_count = 7;
138  for (i = 1; i < nut->header_count; i++) {
139  nut->header_len[i] = headers[i - 1][0];
140  nut->header[i] = &headers[i - 1][1];
141  }
142 }
143 
145 {
146  NUTContext *nut = s->priv_data;
147  int key_frame, index, pred, stream_id;
148  int start = 1;
149  int end = 254;
150  int keyframe_0_esc = s->nb_streams > 2;
151  int pred_table[10];
152  FrameCode *ft;
153 
154  ft = &nut->frame_code[start];
155  ft->flags = FLAG_CODED;
156  ft->size_mul = 1;
157  ft->pts_delta = 1;
158  start++;
159 
160  if (keyframe_0_esc) {
161  /* keyframe = 0 escape */
162  FrameCode *ft = &nut->frame_code[start];
164  ft->size_mul = 1;
165  start++;
166  }
167 
168  for (stream_id = 0; stream_id < s->nb_streams; stream_id++) {
169  int start2 = start + (end - start) * stream_id / s->nb_streams;
170  int end2 = start + (end - start) * (stream_id + 1) / s->nb_streams;
171  AVCodecParameters *par = s->streams[stream_id]->codecpar;
172  int is_audio = par->codec_type == AVMEDIA_TYPE_AUDIO;
173  int intra_only = /*codec->intra_only || */ is_audio;
174  int pred_count;
175  int frame_size = 0;
176 
177  if (par->codec_type == AVMEDIA_TYPE_AUDIO) {
179  if (par->codec_id == AV_CODEC_ID_VORBIS && !frame_size)
180  frame_size = 64;
181  } else {
182  AVRational f = av_div_q(av_inv_q(s->streams[stream_id]->avg_frame_rate), *nut->stream[stream_id].time_base);
183  if (f.den == 1 && f.num>0)
184  frame_size = f.num;
185  }
186  if (!frame_size)
187  frame_size = 1;
188 
189  for (key_frame = 0; key_frame < 2; key_frame++) {
190  if (!intra_only || !keyframe_0_esc || key_frame != 0) {
191  FrameCode *ft = &nut->frame_code[start2];
192  ft->flags = FLAG_KEY * key_frame;
194  ft->stream_id = stream_id;
195  ft->size_mul = 1;
196  if (is_audio)
197  ft->header_idx = find_header_idx(s, par, -1, key_frame);
198  start2++;
199  }
200  }
201 
202  key_frame = intra_only;
203 #if 1
204  if (is_audio) {
205  int frame_bytes;
206  int pts;
207 
208  if (par->block_align > 0) {
209  frame_bytes = par->block_align;
210  } else {
212  frame_bytes = frame_size * (int64_t)par->bit_rate / (8 * par->sample_rate);
213  }
214 
215  for (pts = 0; pts < 2; pts++) {
216  for (pred = 0; pred < 2; pred++) {
217  FrameCode *ft = &nut->frame_code[start2];
218  ft->flags = FLAG_KEY * key_frame;
219  ft->stream_id = stream_id;
220  ft->size_mul = frame_bytes + 2;
221  ft->size_lsb = frame_bytes + pred;
222  ft->pts_delta = pts * frame_size;
223  ft->header_idx = find_header_idx(s, par, frame_bytes + pred, key_frame);
224  start2++;
225  }
226  }
227  } else {
228  FrameCode *ft = &nut->frame_code[start2];
229  ft->flags = FLAG_KEY | FLAG_SIZE_MSB;
230  ft->stream_id = stream_id;
231  ft->size_mul = 1;
232  ft->pts_delta = frame_size;
233  start2++;
234  }
235 #endif
236 
237  if (par->video_delay) {
238  pred_count = 5;
239  pred_table[0] = -2;
240  pred_table[1] = -1;
241  pred_table[2] = 1;
242  pred_table[3] = 3;
243  pred_table[4] = 4;
244  } else if (par->codec_id == AV_CODEC_ID_VORBIS) {
245  pred_count = 3;
246  pred_table[0] = 2;
247  pred_table[1] = 9;
248  pred_table[2] = 16;
249  } else {
250  pred_count = 1;
251  pred_table[0] = 1;
252  }
253 
254  for (pred = 0; pred < pred_count; pred++) {
255  int start3 = start2 + (end2 - start2) * pred / pred_count;
256  int end3 = start2 + (end2 - start2) * (pred + 1) / pred_count;
257 
258  pred_table[pred] *= frame_size;
259 
260  for (index = start3; index < end3; index++) {
261  FrameCode *ft = &nut->frame_code[index];
262  ft->flags = FLAG_KEY * key_frame;
263  ft->flags |= FLAG_SIZE_MSB;
264  ft->stream_id = stream_id;
265 //FIXME use single byte size and pred from last
266  ft->size_mul = end3 - start3;
267  ft->size_lsb = index - start3;
268  ft->pts_delta = pred_table[pred];
269  if (is_audio)
270  ft->header_idx = find_header_idx(s, par, -1, key_frame);
271  }
272  }
273  }
274  memmove(&nut->frame_code['N' + 1], &nut->frame_code['N'], sizeof(FrameCode) * (255 - 'N'));
275  nut->frame_code[0].flags =
276  nut->frame_code[255].flags =
277  nut->frame_code['N'].flags = FLAG_INVALID;
278 }
279 
280 static void put_tt(NUTContext *nut, AVRational *time_base, AVIOContext *bc, uint64_t val)
281 {
282  val *= nut->time_base_count;
283  val += time_base - nut->time_base;
284  ff_put_v(bc, val);
285 }
286 /**
287  * Store a string as vb.
288  */
289 static void put_str(AVIOContext *bc, const char *string)
290 {
291  size_t len = strlen(string);
292 
293  ff_put_v(bc, len);
294  avio_write(bc, string, len);
295 }
296 
297 static void put_s(AVIOContext *bc, int64_t val)
298 {
299  ff_put_v(bc, 2 * FFABS(val) - (val > 0));
300 }
301 
302 //FIXME remove calculate_checksum
303 static void put_packet(NUTContext *nut, AVIOContext *bc, AVIOContext *dyn_bc,
304  int calculate_checksum, uint64_t startcode)
305 {
306  uint8_t *dyn_buf = NULL;
307  int dyn_size = avio_close_dyn_buf(dyn_bc, &dyn_buf);
308  int forw_ptr = dyn_size + 4 * calculate_checksum;
309 
310  if (forw_ptr > 4096)
312  avio_wb64(bc, startcode);
313  ff_put_v(bc, forw_ptr);
314  if (forw_ptr > 4096)
315  avio_wl32(bc, ffio_get_checksum(bc));
316 
317  if (calculate_checksum)
319  avio_write(bc, dyn_buf, dyn_size);
320  if (calculate_checksum)
321  avio_wl32(bc, ffio_get_checksum(bc));
322 
323  av_free(dyn_buf);
324 }
325 
327 {
328  int i, j, tmp_pts, tmp_flags, tmp_stream, tmp_mul, tmp_size, tmp_fields,
329  tmp_head_idx;
330  int64_t tmp_match;
331 
332  ff_put_v(bc, nut->version);
333  if (nut->version > 3)
334  ff_put_v(bc, nut->minor_version = 1);
335  ff_put_v(bc, nut->avf->nb_streams);
336  ff_put_v(bc, nut->max_distance);
337  ff_put_v(bc, nut->time_base_count);
338 
339  for (i = 0; i < nut->time_base_count; i++) {
340  ff_put_v(bc, nut->time_base[i].num);
341  ff_put_v(bc, nut->time_base[i].den);
342  }
343 
344  tmp_pts = 0;
345  tmp_mul = 1;
346  tmp_stream = 0;
347  tmp_match = 1 - (1LL << 62);
348  tmp_head_idx = 0;
349  for (i = 0; i < 256; ) {
350  tmp_fields = 0;
351  tmp_size = 0;
352 // tmp_res=0;
353  if (tmp_pts != nut->frame_code[i].pts_delta ) tmp_fields = 1;
354  if (tmp_mul != nut->frame_code[i].size_mul ) tmp_fields = 2;
355  if (tmp_stream != nut->frame_code[i].stream_id ) tmp_fields = 3;
356  if (tmp_size != nut->frame_code[i].size_lsb ) tmp_fields = 4;
357 // if (tmp_res != nut->frame_code[i].res ) tmp_fields=5;
358  if (tmp_head_idx != nut->frame_code[i].header_idx) tmp_fields = 8;
359 
360  tmp_pts = nut->frame_code[i].pts_delta;
361  tmp_flags = nut->frame_code[i].flags;
362  tmp_stream = nut->frame_code[i].stream_id;
363  tmp_mul = nut->frame_code[i].size_mul;
364  tmp_size = nut->frame_code[i].size_lsb;
365 // tmp_res = nut->frame_code[i].res;
366  tmp_head_idx = nut->frame_code[i].header_idx;
367 
368  for (j = 0; i < 256; j++, i++) {
369  if (i == 'N') {
370  j--;
371  continue;
372  }
373  if (nut->frame_code[i].pts_delta != tmp_pts ||
374  nut->frame_code[i].flags != tmp_flags ||
375  nut->frame_code[i].stream_id != tmp_stream ||
376  nut->frame_code[i].size_mul != tmp_mul ||
377  nut->frame_code[i].size_lsb != tmp_size + j ||
378 // nut->frame_code[i].res != tmp_res ||
379  nut->frame_code[i].header_idx != tmp_head_idx)
380  break;
381  }
382  if (j != tmp_mul - tmp_size)
383  tmp_fields = 6;
384 
385  ff_put_v(bc, tmp_flags);
386  ff_put_v(bc, tmp_fields);
387  if (tmp_fields > 0) put_s(bc, tmp_pts);
388  if (tmp_fields > 1) ff_put_v(bc, tmp_mul);
389  if (tmp_fields > 2) ff_put_v(bc, tmp_stream);
390  if (tmp_fields > 3) ff_put_v(bc, tmp_size);
391  if (tmp_fields > 4) ff_put_v(bc, 0 /*tmp_res*/);
392  if (tmp_fields > 5) ff_put_v(bc, j);
393  if (tmp_fields > 6) ff_put_v(bc, tmp_match);
394  if (tmp_fields > 7) ff_put_v(bc, tmp_head_idx);
395  }
396  ff_put_v(bc, nut->header_count - 1);
397  for (i = 1; i < nut->header_count; i++) {
398  ff_put_v(bc, nut->header_len[i]);
399  avio_write(bc, nut->header[i], nut->header_len[i]);
400  }
401  // flags had been effectively introduced in version 4
402  if (nut->version > 3)
403  ff_put_v(bc, nut->flags);
404 }
405 
407  AVStream *st, int i)
408 {
409  NUTContext *nut = avctx->priv_data;
410  AVCodecParameters *par = st->codecpar;
411 
412  ff_put_v(bc, i);
413  switch (par->codec_type) {
414  case AVMEDIA_TYPE_VIDEO: ff_put_v(bc, 0); break;
415  case AVMEDIA_TYPE_AUDIO: ff_put_v(bc, 1); break;
416  case AVMEDIA_TYPE_SUBTITLE: ff_put_v(bc, 2); break;
417  default: ff_put_v(bc, 3); break;
418  }
419  ff_put_v(bc, 4);
420 
421  if (par->codec_tag) {
422  avio_wl32(bc, par->codec_tag);
423  } else {
424  av_log(avctx, AV_LOG_ERROR, "No codec tag defined for stream %d\n", i);
425  return AVERROR(EINVAL);
426  }
427 
428  ff_put_v(bc, nut->stream[i].time_base - nut->time_base);
429  ff_put_v(bc, nut->stream[i].msb_pts_shift);
430  ff_put_v(bc, nut->stream[i].max_pts_distance);
431  ff_put_v(bc, par->video_delay);
432  avio_w8(bc, 0); /* flags: 0x1 - fixed_fps, 0x2 - index_present */
433 
434  ff_put_v(bc, par->extradata_size);
435  avio_write(bc, par->extradata, par->extradata_size);
436 
437  switch (par->codec_type) {
438  case AVMEDIA_TYPE_AUDIO:
439  ff_put_v(bc, par->sample_rate);
440  ff_put_v(bc, 1);
441  ff_put_v(bc, par->channels);
442  break;
443  case AVMEDIA_TYPE_VIDEO:
444  ff_put_v(bc, par->width);
445  ff_put_v(bc, par->height);
446 
447  if (st->sample_aspect_ratio.num <= 0 ||
448  st->sample_aspect_ratio.den <= 0) {
449  ff_put_v(bc, 0);
450  ff_put_v(bc, 0);
451  } else {
454  }
455  ff_put_v(bc, 0); /* csp type -- unknown */
456  break;
457  default:
458  break;
459  }
460  return 0;
461 }
462 
463 static int add_info(AVIOContext *bc, const char *type, const char *value)
464 {
465  put_str(bc, type);
466  put_s(bc, -1);
467  put_str(bc, value);
468  return 1;
469 }
470 
472 {
473  AVFormatContext *s = nut->avf;
474  AVDictionaryEntry *t = NULL;
475  AVIOContext *dyn_bc;
476  uint8_t *dyn_buf = NULL;
477  int count = 0, dyn_size;
478  int ret = avio_open_dyn_buf(&dyn_bc);
479  if (ret < 0)
480  return ret;
481 
483  while ((t = av_dict_get(s->metadata, "", t, AV_DICT_IGNORE_SUFFIX)))
484  count += add_info(dyn_bc, t->key, t->value);
485 
486  ff_put_v(bc, 0); //stream_if_plus1
487  ff_put_v(bc, 0); //chapter_id
488  ff_put_v(bc, 0); //timestamp_start
489  ff_put_v(bc, 0); //length
490 
491  ff_put_v(bc, count);
492 
493  dyn_size = avio_close_dyn_buf(dyn_bc, &dyn_buf);
494  avio_write(bc, dyn_buf, dyn_size);
495  av_free(dyn_buf);
496  return 0;
497 }
498 
499 static int write_streaminfo(NUTContext *nut, AVIOContext *bc, int stream_id) {
500  AVFormatContext *s= nut->avf;
501  AVStream* st = s->streams[stream_id];
502  AVDictionaryEntry *t = NULL;
503  AVIOContext *dyn_bc;
504  uint8_t *dyn_buf=NULL;
505  int count=0, dyn_size, i;
506  int ret = avio_open_dyn_buf(&dyn_bc);
507  if (ret < 0)
508  return ret;
509 
510  while ((t = av_dict_get(st->metadata, "", t, AV_DICT_IGNORE_SUFFIX)))
511  count += add_info(dyn_bc, t->key, t->value);
512  for (i=0; ff_nut_dispositions[i].flag; ++i) {
514  count += add_info(dyn_bc, "Disposition", ff_nut_dispositions[i].str);
515  }
516  if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
517  uint8_t buf[256];
518  if (st->r_frame_rate.num>0 && st->r_frame_rate.den>0)
519  snprintf(buf, sizeof(buf), "%d/%d", st->r_frame_rate.num, st->r_frame_rate.den);
520  else
521  snprintf(buf, sizeof(buf), "%d/%d", st->avg_frame_rate.num, st->avg_frame_rate.den);
522  count += add_info(dyn_bc, "r_frame_rate", buf);
523  }
524  dyn_size = avio_close_dyn_buf(dyn_bc, &dyn_buf);
525 
526  if (count) {
527  ff_put_v(bc, stream_id + 1); //stream_id_plus1
528  ff_put_v(bc, 0); //chapter_id
529  ff_put_v(bc, 0); //timestamp_start
530  ff_put_v(bc, 0); //length
531 
532  ff_put_v(bc, count);
533 
534  avio_write(bc, dyn_buf, dyn_size);
535  }
536 
537  av_free(dyn_buf);
538  return count;
539 }
540 
541 static int write_chapter(NUTContext *nut, AVIOContext *bc, int id)
542 {
543  AVIOContext *dyn_bc;
544  uint8_t *dyn_buf = NULL;
545  AVDictionaryEntry *t = NULL;
546  AVChapter *ch = nut->avf->chapters[id];
547  int ret, dyn_size, count = 0;
548 
549  ret = avio_open_dyn_buf(&dyn_bc);
550  if (ret < 0)
551  return ret;
552 
553  ff_put_v(bc, 0); // stream_id_plus1
554  put_s(bc, id + 1); // chapter_id
555  put_tt(nut, nut->chapter[id].time_base, bc, ch->start); // chapter_start
556  ff_put_v(bc, ch->end - ch->start); // chapter_len
557 
558  while ((t = av_dict_get(ch->metadata, "", t, AV_DICT_IGNORE_SUFFIX)))
559  count += add_info(dyn_bc, t->key, t->value);
560 
561  ff_put_v(bc, count);
562 
563  dyn_size = avio_close_dyn_buf(dyn_bc, &dyn_buf);
564  avio_write(bc, dyn_buf, dyn_size);
565  av_freep(&dyn_buf);
566  return 0;
567 }
568 
569 static int write_index(NUTContext *nut, AVIOContext *bc) {
570  int i;
571  Syncpoint dummy= { .pos= 0 };
572  Syncpoint *next_node[2] = { NULL };
573  int64_t startpos = avio_tell(bc);
574  int64_t payload_size;
575 
576  put_tt(nut, nut->max_pts_tb, bc, nut->max_pts);
577 
578  ff_put_v(bc, nut->sp_count);
579 
580  for (i=0; i<nut->sp_count; i++) {
581  av_tree_find(nut->syncpoints, &dummy, ff_nut_sp_pos_cmp, (void**)next_node);
582  ff_put_v(bc, (next_node[1]->pos >> 4) - (dummy.pos>>4));
583  dummy.pos = next_node[1]->pos;
584  }
585 
586  for (i=0; i<nut->avf->nb_streams; i++) {
587  StreamContext *nus= &nut->stream[i];
588  int64_t last_pts= -1;
589  int j, k;
590  for (j=0; j<nut->sp_count; j++) {
591  int flag;
592  int n = 0;
593 
594  if (j && nus->keyframe_pts[j] == nus->keyframe_pts[j-1]) {
595  av_log(nut->avf, AV_LOG_WARNING, "Multiple keyframes with same PTS\n");
596  nus->keyframe_pts[j] = AV_NOPTS_VALUE;
597  }
598 
599  flag = (nus->keyframe_pts[j] != AV_NOPTS_VALUE) ^ (j+1 == nut->sp_count);
600  for (; j<nut->sp_count && (nus->keyframe_pts[j] != AV_NOPTS_VALUE) == flag; j++)
601  n++;
602 
603  ff_put_v(bc, 1 + 2*flag + 4*n);
604  for (k= j - n; k<=j && k<nut->sp_count; k++) {
605  if (nus->keyframe_pts[k] == AV_NOPTS_VALUE)
606  continue;
607  av_assert0(nus->keyframe_pts[k] > last_pts);
608  ff_put_v(bc, nus->keyframe_pts[k] - last_pts);
609  last_pts = nus->keyframe_pts[k];
610  }
611  }
612  }
613 
614  payload_size = avio_tell(bc) - startpos + 8 + 4;
615 
616  avio_wb64(bc, 8 + payload_size + av_log2(payload_size) / 7 + 1 + 4*(payload_size > 4096));
617 
618  return 0;
619 }
620 
622 {
623  NUTContext *nut = avctx->priv_data;
624  AVIOContext *dyn_bc;
625  int i, ret;
626 
628 
629  ret = avio_open_dyn_buf(&dyn_bc);
630  if (ret < 0)
631  return ret;
632  write_mainheader(nut, dyn_bc);
633  put_packet(nut, bc, dyn_bc, 1, MAIN_STARTCODE);
634 
635  for (i = 0; i < nut->avf->nb_streams; i++) {
636  ret = avio_open_dyn_buf(&dyn_bc);
637  if (ret < 0)
638  return ret;
639  ret = write_streamheader(avctx, dyn_bc, nut->avf->streams[i], i);
640  if (ret < 0)
641  return ret;
642  put_packet(nut, bc, dyn_bc, 1, STREAM_STARTCODE);
643  }
644 
645  ret = avio_open_dyn_buf(&dyn_bc);
646  if (ret < 0)
647  return ret;
648  write_globalinfo(nut, dyn_bc);
649  put_packet(nut, bc, dyn_bc, 1, INFO_STARTCODE);
650 
651  for (i = 0; i < nut->avf->nb_streams; i++) {
652  ret = avio_open_dyn_buf(&dyn_bc);
653  if (ret < 0)
654  return ret;
655  ret = write_streaminfo(nut, dyn_bc, i);
656  if (ret < 0)
657  return ret;
658  if (ret > 0)
659  put_packet(nut, bc, dyn_bc, 1, INFO_STARTCODE);
660  else
661  ffio_free_dyn_buf(&dyn_bc);
662  }
663 
664  for (i = 0; i < nut->avf->nb_chapters; i++) {
665  ret = avio_open_dyn_buf(&dyn_bc);
666  if (ret < 0)
667  return ret;
668  ret = write_chapter(nut, dyn_bc, i);
669  if (ret < 0) {
670  ffio_free_dyn_buf(&dyn_bc);
671  return ret;
672  }
673  put_packet(nut, bc, dyn_bc, 1, INFO_STARTCODE);
674  }
675 
676  nut->last_syncpoint_pos = INT_MIN;
677  nut->header_count++;
678  return 0;
679 }
680 
682 {
683  NUTContext *nut = s->priv_data;
684  AVIOContext *bc = s->pb;
685  int i, j, ret;
686 
687  nut->avf = s;
688 
689  nut->version = FFMAX(NUT_STABLE_VERSION, 3 + !!nut->flags);
690  if (nut->version > 3 && s->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
692  "The additional syncpoint modes require version %d, "
693  "that is currently not finalized, "
694  "please set -f_strict experimental in order to enable it.\n",
695  nut->version);
696  return AVERROR_EXPERIMENTAL;
697  }
698 
699  nut->stream = av_calloc(s->nb_streams, sizeof(*nut->stream ));
700  nut->chapter = av_calloc(s->nb_chapters, sizeof(*nut->chapter));
701  nut->time_base= av_calloc(s->nb_streams +
702  s->nb_chapters, sizeof(*nut->time_base));
703  if (!nut->stream || !nut->chapter || !nut->time_base) {
704  av_freep(&nut->stream);
705  av_freep(&nut->chapter);
706  av_freep(&nut->time_base);
707  return AVERROR(ENOMEM);
708  }
709 
710  for (i = 0; i < s->nb_streams; i++) {
711  AVStream *st = s->streams[i];
712  int ssize;
713  AVRational time_base;
714  ff_parse_specific_params(st, &time_base.den, &ssize, &time_base.num);
715 
717  time_base = (AVRational) {1, st->codecpar->sample_rate};
718  } else {
719  time_base = ff_choose_timebase(s, st, 48000);
720  }
721 
722  avpriv_set_pts_info(st, 64, time_base.num, time_base.den);
723 
724  for (j = 0; j < nut->time_base_count; j++)
725  if (!memcmp(&time_base, &nut->time_base[j], sizeof(AVRational))) {
726  break;
727  }
728  nut->time_base[j] = time_base;
729  nut->stream[i].time_base = &nut->time_base[j];
730  if (j == nut->time_base_count)
731  nut->time_base_count++;
732 
733  if (INT64_C(1000) * time_base.num >= time_base.den)
734  nut->stream[i].msb_pts_shift = 7;
735  else
736  nut->stream[i].msb_pts_shift = 14;
737  nut->stream[i].max_pts_distance =
738  FFMAX(time_base.den, time_base.num) / time_base.num;
739  }
740 
741  for (i = 0; i < s->nb_chapters; i++) {
742  AVChapter *ch = s->chapters[i];
743 
744  for (j = 0; j < nut->time_base_count; j++)
745  if (!memcmp(&ch->time_base, &nut->time_base[j], sizeof(AVRational)))
746  break;
747 
748  nut->time_base[j] = ch->time_base;
749  nut->chapter[i].time_base = &nut->time_base[j];
750  if (j == nut->time_base_count)
751  nut->time_base_count++;
752  }
753 
754  nut->max_distance = MAX_DISTANCE;
757  av_assert0(nut->frame_code['N'].flags == FLAG_INVALID);
758 
759  avio_write(bc, ID_STRING, strlen(ID_STRING));
760  avio_w8(bc, 0);
761 
762  if ((ret = write_headers(s, bc)) < 0)
763  return ret;
764 
765  if (s->avoid_negative_ts < 0)
766  s->avoid_negative_ts = 1;
767 
768  avio_flush(bc);
769 
770  return 0;
771 }
772 
774  AVPacket *pkt)
775 {
776  int flags = 0;
777 
778  if (pkt->flags & AV_PKT_FLAG_KEY)
779  flags |= FLAG_KEY;
780  if (pkt->stream_index != fc->stream_id)
782  if (pkt->size / fc->size_mul)
783  flags |= FLAG_SIZE_MSB;
784  if (pkt->pts - nus->last_pts != fc->pts_delta)
786  if (pkt->side_data_elems && nut->version > 3)
787  flags |= FLAG_SM_DATA;
788  if (pkt->size > 2 * nut->max_distance)
789  flags |= FLAG_CHECKSUM;
790  if (FFABS(pkt->pts - nus->last_pts) > nus->max_pts_distance)
791  flags |= FLAG_CHECKSUM;
792  if (fc->header_idx)
793  if (pkt->size < nut->header_len[fc->header_idx] ||
794  pkt->size > 4096 ||
795  memcmp(pkt->data, nut->header [fc->header_idx],
796  nut->header_len[fc->header_idx]))
798 
799  return flags | (fc->flags & FLAG_CODED);
800 }
801 
803 {
804  int i;
805  int best_i = 0;
806  int best_len = 0;
807 
808  if (pkt->size > 4096)
809  return 0;
810 
811  for (i = 1; i < nut->header_count; i++)
812  if (pkt->size >= nut->header_len[i]
813  && nut->header_len[i] > best_len
814  && !memcmp(pkt->data, nut->header[i], nut->header_len[i])) {
815  best_i = i;
816  best_len = nut->header_len[i];
817  }
818  return best_i;
819 }
820 
821 static int write_sm_data(AVFormatContext *s, AVIOContext *bc, AVPacket *pkt, int is_meta)
822 {
823  int ret, i, dyn_size;
824  unsigned flags;
825  AVIOContext *dyn_bc;
826  int sm_data_count = 0;
827  uint8_t tmp[256];
828  uint8_t *dyn_buf;
829 
830  ret = avio_open_dyn_buf(&dyn_bc);
831  if (ret < 0)
832  return ret;
833 
834  for (i = 0; i<pkt->side_data_elems; i++) {
835  const uint8_t *data = pkt->side_data[i].data;
836  int size = pkt->side_data[i].size;
837  const uint8_t *data_end = data + size;
838 
839  if (is_meta) {
842  if (!size || data[size-1]) {
843  ret = AVERROR(EINVAL);
844  goto fail;
845  }
846  while (data < data_end) {
847  const uint8_t *key = data;
848  const uint8_t *val = data + strlen(key) + 1;
849 
850  if(val >= data_end) {
851  ret = AVERROR(EINVAL);
852  goto fail;
853  }
854  put_str(dyn_bc, key);
855  put_s(dyn_bc, -1);
856  put_str(dyn_bc, val);
857  data = val + strlen(val) + 1;
858  sm_data_count++;
859  }
860  }
861  } else {
862  switch (pkt->side_data[i].type) {
863  case AV_PKT_DATA_PALETTE:
866  default:
868  put_str(dyn_bc, "Palette");
869  } else if(pkt->side_data[i].type == AV_PKT_DATA_NEW_EXTRADATA) {
870  put_str(dyn_bc, "Extradata");
872  snprintf(tmp, sizeof(tmp), "CodecSpecificSide%"PRId64"", AV_RB64(data));
873  put_str(dyn_bc, tmp);
874  } else {
875  snprintf(tmp, sizeof(tmp), "UserData%s-SD-%d",
876  (s->flags & AVFMT_FLAG_BITEXACT) ? "Lavf" : LIBAVFORMAT_IDENT,
877  pkt->side_data[i].type);
878  put_str(dyn_bc, tmp);
879  }
880  put_s(dyn_bc, -2);
881  put_str(dyn_bc, "bin");
882  ff_put_v(dyn_bc, pkt->side_data[i].size);
883  avio_write(dyn_bc, data, pkt->side_data[i].size);
884  sm_data_count++;
885  break;
887  flags = bytestream_get_le32(&data);
889  put_str(dyn_bc, "Channels");
890  put_s(dyn_bc, bytestream_get_le32(&data));
891  sm_data_count++;
892  }
894  put_str(dyn_bc, "ChannelLayout");
895  put_s(dyn_bc, -2);
896  put_str(dyn_bc, "u64");
897  ff_put_v(bc, 8);
898  avio_write(dyn_bc, data, 8); data+=8;
899  sm_data_count++;
900  }
902  put_str(dyn_bc, "SampleRate");
903  put_s(dyn_bc, bytestream_get_le32(&data));
904  sm_data_count++;
905  }
907  put_str(dyn_bc, "Width");
908  put_s(dyn_bc, bytestream_get_le32(&data));
909  put_str(dyn_bc, "Height");
910  put_s(dyn_bc, bytestream_get_le32(&data));
911  sm_data_count+=2;
912  }
913  break;
915  if (AV_RL32(data)) {
916  put_str(dyn_bc, "SkipStart");
917  put_s(dyn_bc, (unsigned)AV_RL32(data));
918  sm_data_count++;
919  }
920  if (AV_RL32(data+4)) {
921  put_str(dyn_bc, "SkipEnd");
922  put_s(dyn_bc, (unsigned)AV_RL32(data+4));
923  sm_data_count++;
924  }
925  break;
929  // belongs into meta, not side data
930  break;
931  }
932  }
933  }
934 
935 fail:
936  ff_put_v(bc, sm_data_count);
937  dyn_size = avio_close_dyn_buf(dyn_bc, &dyn_buf);
938  avio_write(bc, dyn_buf, dyn_size);
939  av_freep(&dyn_buf);
940 
941  return ret;
942 }
943 
945 {
946  NUTContext *nut = s->priv_data;
947  StreamContext *nus = &nut->stream[pkt->stream_index];
948  AVIOContext *bc = s->pb, *dyn_bc, *sm_bc = NULL;
949  FrameCode *fc;
950  int64_t coded_pts;
951  int best_length, frame_code, flags, needed_flags, i, header_idx;
952  int best_header_idx;
953  int key_frame = !!(pkt->flags & AV_PKT_FLAG_KEY);
954  int store_sp = 0;
955  int ret = 0;
956  int sm_size = 0;
957  int data_size = pkt->size;
958  uint8_t *sm_buf = NULL;
959 
960  if (pkt->pts < 0) {
962  "Negative pts not supported stream %d, pts %"PRId64"\n",
963  pkt->stream_index, pkt->pts);
964  if (pkt->pts == AV_NOPTS_VALUE)
965  av_log(s, AV_LOG_ERROR, "Try to enable the genpts flag\n");
966  return AVERROR(EINVAL);
967  }
968 
969  if (pkt->side_data_elems && nut->version > 3) {
970  ret = avio_open_dyn_buf(&sm_bc);
971  if (ret < 0)
972  return ret;
973  ret = write_sm_data(s, sm_bc, pkt, 0);
974  if (ret >= 0)
975  ret = write_sm_data(s, sm_bc, pkt, 1);
976  sm_size = avio_close_dyn_buf(sm_bc, &sm_buf);
977  if (ret < 0)
978  goto fail;
979  data_size += sm_size;
980  }
981 
982  if (1LL << (20 + 3 * nut->header_count) <= avio_tell(bc))
983  write_headers(s, bc);
984 
985  if (key_frame && !(nus->last_flags & FLAG_KEY))
986  store_sp = 1;
987 
988  if (data_size + 30 /*FIXME check*/ + avio_tell(bc) >= nut->last_syncpoint_pos + nut->max_distance)
989  store_sp = 1;
990 
991 //FIXME: Ensure store_sp is 1 in the first place.
992 
993  if (store_sp &&
994  (!(nut->flags & NUT_PIPE) || nut->last_syncpoint_pos == INT_MIN)) {
995  int64_t sp_pos = INT64_MAX;
996 
997  ff_nut_reset_ts(nut, *nus->time_base, pkt->dts);
998  for (i = 0; i < s->nb_streams; i++) {
999  AVStream *st = s->streams[i];
1000  int64_t dts_tb = av_rescale_rnd(pkt->dts,
1001  nus->time_base->num * (int64_t)nut->stream[i].time_base->den,
1002  nus->time_base->den * (int64_t)nut->stream[i].time_base->num,
1003  AV_ROUND_DOWN);
1004  int index = av_index_search_timestamp(st, dts_tb,
1006  if (index >= 0) {
1007  sp_pos = FFMIN(sp_pos, st->index_entries[index].pos);
1008  if (!nut->write_index && 2*index > st->nb_index_entries) {
1009  memmove(st->index_entries,
1010  st->index_entries + index,
1011  sizeof(*st->index_entries) * (st->nb_index_entries - index));
1012  st->nb_index_entries -= index;
1013  }
1014  }
1015  }
1016 
1017  nut->last_syncpoint_pos = avio_tell(bc);
1018  ret = avio_open_dyn_buf(&dyn_bc);
1019  if (ret < 0)
1020  goto fail;
1021  put_tt(nut, nus->time_base, dyn_bc, pkt->dts);
1022  ff_put_v(dyn_bc, sp_pos != INT64_MAX ? (nut->last_syncpoint_pos - sp_pos) >> 4 : 0);
1023 
1024  if (nut->flags & NUT_BROADCAST) {
1025  put_tt(nut, nus->time_base, dyn_bc,
1027  }
1028  put_packet(nut, bc, dyn_bc, 1, SYNCPOINT_STARTCODE);
1029 
1030  if (nut->write_index) {
1031  if ((ret = ff_nut_add_sp(nut, nut->last_syncpoint_pos, 0 /*unused*/, pkt->dts)) < 0)
1032  goto fail;
1033 
1034  if ((1ll<<60) % nut->sp_count == 0)
1035  for (i=0; i<s->nb_streams; i++) {
1036  int j;
1037  StreamContext *nus = &nut->stream[i];
1038  av_reallocp_array(&nus->keyframe_pts, 2*nut->sp_count, sizeof(*nus->keyframe_pts));
1039  if (!nus->keyframe_pts) {
1040  ret = AVERROR(ENOMEM);
1041  goto fail;
1042  }
1043  for (j=nut->sp_count == 1 ? 0 : nut->sp_count; j<2*nut->sp_count; j++)
1044  nus->keyframe_pts[j] = AV_NOPTS_VALUE;
1045  }
1046  }
1047  }
1049 
1050  coded_pts = pkt->pts & ((1 << nus->msb_pts_shift) - 1);
1051  if (ff_lsb2full(nus, coded_pts) != pkt->pts)
1052  coded_pts = pkt->pts + (1 << nus->msb_pts_shift);
1053 
1054  best_header_idx = find_best_header_idx(nut, pkt);
1055 
1056  best_length = INT_MAX;
1057  frame_code = -1;
1058  for (i = 0; i < 256; i++) {
1059  int length = 0;
1060  FrameCode *fc = &nut->frame_code[i];
1061  int flags = fc->flags;
1062 
1063  if (flags & FLAG_INVALID)
1064  continue;
1065  needed_flags = get_needed_flags(nut, nus, fc, pkt);
1066 
1067  if (flags & FLAG_CODED) {
1068  length++;
1069  flags = needed_flags;
1070  }
1071 
1072  if ((flags & needed_flags) != needed_flags)
1073  continue;
1074 
1075  if ((flags ^ needed_flags) & FLAG_KEY)
1076  continue;
1077 
1078  if (flags & FLAG_STREAM_ID)
1080 
1081  if (data_size % fc->size_mul != fc->size_lsb)
1082  continue;
1083  if (flags & FLAG_SIZE_MSB)
1084  length += ff_get_v_length(data_size / fc->size_mul);
1085 
1086  if (flags & FLAG_CHECKSUM)
1087  length += 4;
1088 
1089  if (flags & FLAG_CODED_PTS)
1090  length += ff_get_v_length(coded_pts);
1091 
1092  if ( (flags & FLAG_CODED)
1093  && nut->header_len[best_header_idx] > nut->header_len[fc->header_idx] + 1) {
1095  }
1096 
1097  if (flags & FLAG_HEADER_IDX) {
1098  length += 1 - nut->header_len[best_header_idx];
1099  } else {
1100  length -= nut->header_len[fc->header_idx];
1101  }
1102 
1103  length *= 4;
1104  length += !(flags & FLAG_CODED_PTS);
1105  length += !(flags & FLAG_CHECKSUM);
1106 
1107  if (length < best_length) {
1108  best_length = length;
1109  frame_code = i;
1110  }
1111  }
1112  av_assert0(frame_code != -1);
1113 
1114  fc = &nut->frame_code[frame_code];
1115  flags = fc->flags;
1116  needed_flags = get_needed_flags(nut, nus, fc, pkt);
1117  header_idx = fc->header_idx;
1118 
1120  avio_w8(bc, frame_code);
1121  if (flags & FLAG_CODED) {
1122  ff_put_v(bc, (flags ^ needed_flags) & ~(FLAG_CODED));
1123  flags = needed_flags;
1124  }
1126  if (flags & FLAG_CODED_PTS) ff_put_v(bc, coded_pts);
1127  if (flags & FLAG_SIZE_MSB ) ff_put_v(bc, data_size / fc->size_mul);
1128  if (flags & FLAG_HEADER_IDX) ff_put_v(bc, header_idx = best_header_idx);
1129 
1131  else ffio_get_checksum(bc);
1132 
1133  if (flags & FLAG_SM_DATA) {
1134  avio_write(bc, sm_buf, sm_size);
1135  }
1136  avio_write(bc, pkt->data + nut->header_len[header_idx], pkt->size - nut->header_len[header_idx]);
1137 
1138  nus->last_flags = flags;
1139  nus->last_pts = pkt->pts;
1140 
1141  //FIXME just store one per syncpoint
1142  if (flags & FLAG_KEY && !(nut->flags & NUT_PIPE)) {
1144  s->streams[pkt->stream_index],
1145  nut->last_syncpoint_pos,
1146  pkt->pts,
1147  0,
1148  0,
1150  if (nus->keyframe_pts && nus->keyframe_pts[nut->sp_count] == AV_NOPTS_VALUE)
1151  nus->keyframe_pts[nut->sp_count] = pkt->pts;
1152  }
1153 
1154  if (!nut->max_pts_tb || av_compare_ts(nut->max_pts, *nut->max_pts_tb, pkt->pts, *nus->time_base) < 0) {
1155  nut->max_pts = pkt->pts;
1156  nut->max_pts_tb = nus->time_base;
1157  }
1158 
1159 fail:
1160  av_freep(&sm_buf);
1161 
1162  return ret;
1163 }
1164 
1166 {
1167  NUTContext *nut = s->priv_data;
1168  AVIOContext *bc = s->pb, *dyn_bc;
1169  int ret;
1170 
1171  while (nut->header_count < 3)
1172  write_headers(s, bc);
1173 
1174  if (!nut->sp_count)
1175  return 0;
1176 
1177  ret = avio_open_dyn_buf(&dyn_bc);
1178  if (ret >= 0) {
1179  av_assert1(nut->write_index); // sp_count should be 0 if no index is going to be written
1180  write_index(nut, dyn_bc);
1181  put_packet(nut, bc, dyn_bc, 1, INDEX_STARTCODE);
1182  }
1183 
1184  return 0;
1185 }
1186 
1188 {
1189  NUTContext *nut = s->priv_data;
1190  int i;
1191 
1192  ff_nut_free_sp(nut);
1193  if (nut->stream)
1194  for (i=0; i<s->nb_streams; i++)
1195  av_freep(&nut->stream[i].keyframe_pts);
1196 
1197  av_freep(&nut->stream);
1198  av_freep(&nut->chapter);
1199  av_freep(&nut->time_base);
1200 }
1201 
1202 #define OFFSET(x) offsetof(NUTContext, x)
1203 #define E AV_OPT_FLAG_ENCODING_PARAM
1204 static const AVOption options[] = {
1205  { "syncpoints", "NUT syncpoint behaviour", OFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, INT_MIN, INT_MAX, E, "syncpoints" },
1206  { "default", "", 0, AV_OPT_TYPE_CONST, {.i64 = 0}, INT_MIN, INT_MAX, E, "syncpoints" },
1207  { "none", "Disable syncpoints, low overhead and unseekable", 0, AV_OPT_TYPE_CONST, {.i64 = NUT_PIPE}, INT_MIN, INT_MAX, E, "syncpoints" },
1208  { "timestamped", "Extend syncpoints with a wallclock timestamp", 0, AV_OPT_TYPE_CONST, {.i64 = NUT_BROADCAST}, INT_MIN, INT_MAX, E, "syncpoints" },
1209  { "write_index", "Write index", OFFSET(write_index), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, E, },
1210  { NULL },
1211 };
1212 
1213 static const AVClass class = {
1214  .class_name = "nutenc",
1215  .item_name = av_default_item_name,
1216  .option = options,
1218 };
1219 
1221  .name = "nut",
1222  .long_name = NULL_IF_CONFIG_SMALL("NUT"),
1223  .mime_type = "video/x-nut",
1224  .extensions = "nut",
1225  .priv_data_size = sizeof(NUTContext),
1226  .audio_codec = CONFIG_LIBVORBIS ? AV_CODEC_ID_VORBIS :
1227  CONFIG_LIBMP3LAME ? AV_CODEC_ID_MP3 : AV_CODEC_ID_MP2,
1228  .video_codec = AV_CODEC_ID_MPEG4,
1232  .deinit = nut_write_deinit,
1234  .codec_tag = ff_nut_codec_tags,
1235  .priv_class = &class,
1236 };
AVStream::index_entries
AVIndexEntry * index_entries
Only used if the format does not support seeking natively.
Definition: avformat.h:1099
write_streaminfo
static int write_streaminfo(NUTContext *nut, AVIOContext *bc, int stream_id)
Definition: nutenc.c:499
intra_only
int intra_only
Definition: mxfenc.c:2218
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:204
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:182
AVCodecParameters::extradata
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: avcodec.h:3971
LIBAVFORMAT_IDENT
#define LIBAVFORMAT_IDENT
Definition: version.h:46
AVERROR_EXPERIMENTAL
#define AVERROR_EXPERIMENTAL
Requested feature is flagged experimental. Set strict_std_compliance if you really want to use it.
Definition: error.h:72
ff_put_v
void ff_put_v(AVIOContext *bc, uint64_t val)
Put val using a variable number of bytes.
Definition: aviobuf.c:447
FrameCode::stream_id
uint8_t stream_id
Definition: nut.h:67
write_mainheader
static void write_mainheader(NUTContext *nut, AVIOContext *bc)
Definition: nutenc.c:326
AVOutputFormat::name
const char * name
Definition: avformat.h:496
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
write_globalinfo
static int write_globalinfo(NUTContext *nut, AVIOContext *bc)
Definition: nutenc.c:471
opt.h
StreamContext::last_flags
int last_flags
Definition: nut.h:76
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: avcodec.h:3953
NUTContext::time_base_count
unsigned int time_base_count
Definition: nut.h:103
av_compare_ts
int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b)
Compare two timestamps each in its own time base.
Definition: mathematics.c:147
last_pts
static int64_t last_pts
Definition: filtering_video.c:52
out
FILE * out
Definition: movenc.c:54
NUTContext::minor_version
int minor_version
Definition: nut.h:117
FF_COMPLIANCE_EXPERIMENTAL
#define FF_COMPLIANCE_EXPERIMENTAL
Allow nonstandardized experimental things.
Definition: avcodec.h:2633
get_needed_flags
static int get_needed_flags(NUTContext *nut, StreamContext *nus, FrameCode *fc, AVPacket *pkt)
Definition: nutenc.c:773
AVFormatContext::nb_chapters
unsigned int nb_chapters
Number of chapters in AVChapter array.
Definition: avformat.h:1571
AVCodecParameters
This struct describes the properties of an encoded stream.
Definition: avcodec.h:3949
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: avcodec.h:1216
n
int n
Definition: avisynth_c.h:760
NUTContext::max_distance
unsigned int max_distance
Definition: nut.h:102
nut_write_trailer
static int nut_write_trailer(AVFormatContext *s)
Definition: nutenc.c:1165
AVFMT_VARIABLE_FPS
#define AVFMT_VARIABLE_FPS
Format allows variable fps.
Definition: avformat.h:470
av_div_q
AVRational av_div_q(AVRational b, AVRational c)
Divide one rational by another.
Definition: rational.c:88
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
ch
uint8_t pi<< 24) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_U8,(uint64_t)((*(const uint8_t *) pi - 0x80U))<< 56) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16,(*(const int16_t *) pi >>8)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S16,(uint64_t)(*(const int16_t *) pi)<< 48) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32,(*(const int32_t *) pi >>24)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S32,(uint64_t)(*(const int32_t *) pi)<< 32) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S64,(*(const int64_t *) pi >>56)+0x80) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0f/(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0/(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_FLT, llrintf(*(const float *) pi *(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_DBL, llrint(*(const double *) pi *(INT64_C(1)<< 63))) #define FMT_PAIR_FUNC(out, in) static conv_func_type *const fmt_pair_to_conv_functions[AV_SAMPLE_FMT_NB *AV_SAMPLE_FMT_NB]={ FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S64), };static void cpy1(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, len);} static void cpy2(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 2 *len);} static void cpy4(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 4 *len);} static void cpy8(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 8 *len);} AudioConvert *swri_audio_convert_alloc(enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, const int *ch_map, int flags) { AudioConvert *ctx;conv_func_type *f=fmt_pair_to_conv_functions[av_get_packed_sample_fmt(out_fmt)+AV_SAMPLE_FMT_NB *av_get_packed_sample_fmt(in_fmt)];if(!f) return NULL;ctx=av_mallocz(sizeof(*ctx));if(!ctx) return NULL;if(channels==1){ in_fmt=av_get_planar_sample_fmt(in_fmt);out_fmt=av_get_planar_sample_fmt(out_fmt);} ctx->channels=channels;ctx->conv_f=f;ctx->ch_map=ch_map;if(in_fmt==AV_SAMPLE_FMT_U8||in_fmt==AV_SAMPLE_FMT_U8P) memset(ctx->silence, 0x80, sizeof(ctx->silence));if(out_fmt==in_fmt &&!ch_map) { switch(av_get_bytes_per_sample(in_fmt)){ case 1:ctx->simd_f=cpy1;break;case 2:ctx->simd_f=cpy2;break;case 4:ctx->simd_f=cpy4;break;case 8:ctx->simd_f=cpy8;break;} } if(HAVE_X86ASM &&1) swri_audio_convert_init_x86(ctx, out_fmt, in_fmt, channels);if(ARCH_ARM) swri_audio_convert_init_arm(ctx, out_fmt, in_fmt, channels);if(ARCH_AARCH64) swri_audio_convert_init_aarch64(ctx, out_fmt, in_fmt, channels);return ctx;} void swri_audio_convert_free(AudioConvert **ctx) { av_freep(ctx);} int swri_audio_convert(AudioConvert *ctx, AudioData *out, AudioData *in, int len) { int ch;int off=0;const int os=(out->planar ? 1 :out->ch_count) *out->bps;unsigned misaligned=0;av_assert0(ctx->channels==out->ch_count);if(ctx->in_simd_align_mask) { int planes=in->planar ? in->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) in->ch[ch];misaligned|=m &ctx->in_simd_align_mask;} if(ctx->out_simd_align_mask) { int planes=out->planar ? out->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) out->ch[ch];misaligned|=m &ctx->out_simd_align_mask;} if(ctx->simd_f &&!ctx->ch_map &&!misaligned){ off=len &~15;av_assert1(off >=0);av_assert1(off<=len);av_assert2(ctx->channels==SWR_CH_MAX||!in->ch[ctx->channels]);if(off >0){ if(out->planar==in->planar){ int planes=out->planar ? out->ch_count :1;for(ch=0;ch< planes;ch++){ ctx->simd_f(out-> ch ch
Definition: audioconvert.c:56
count
void INT64 INT64 count
Definition: avisynth_c.h:767
AV_CODEC_ID_MPEG4
@ AV_CODEC_ID_MPEG4
Definition: avcodec.h:230
STREAM_STARTCODE
#define STREAM_STARTCODE
Definition: nut.h:30
avpriv_mpa_freq_tab
const uint16_t avpriv_mpa_freq_tab[3]
Definition: mpegaudiodata.c:40
avpriv_mpa_bitrate_tab
const uint16_t avpriv_mpa_bitrate_tab[2][3][15]
Definition: mpegaudiodata.c:30
end
static av_cold int end(AVCodecContext *avctx)
Definition: avrndec.c:90
NUTContext::write_index
int write_index
Definition: nut.h:110
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:1410
nut_write_packet
static int nut_write_packet(AVFormatContext *s, AVPacket *pkt)
Definition: nutenc.c:944
AVPacket::data
uint8_t * data
Definition: avcodec.h:1477
ff_nut_dispositions
const Dispositions ff_nut_dispositions[]
Definition: nut.c:320
NUTContext::last_syncpoint_pos
int64_t last_syncpoint_pos
Definition: nut.h:104
AVOption
AVOption.
Definition: opt.h:246
AV_PKT_DATA_PALETTE
@ AV_PKT_DATA_PALETTE
An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE bytes worth of palette.
Definition: avcodec.h:1190
AVStream::avg_frame_rate
AVRational avg_frame_rate
Average framerate.
Definition: avformat.h:943
data
const char data[16]
Definition: mxf.c:91
NUTContext::header_len
uint8_t header_len[128]
Definition: nut.h:97
AV_DICT_IGNORE_SUFFIX
#define AV_DICT_IGNORE_SUFFIX
Return first entry in a dictionary whose first part corresponds to the search key,...
Definition: dict.h:70
AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE
@ AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE
Definition: avcodec.h:1534
fc
#define fc(width, name, range_min, range_max)
Definition: cbs_av1.c:555
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: avcodec.h:3961
mathematics.h
ff_nut_reset_ts
void ff_nut_reset_ts(NUTContext *nut, AVRational time_base, int64_t val)
Definition: nut.c:251
write_chapter
static int write_chapter(NUTContext *nut, AVIOContext *bc, int id)
Definition: nutenc.c:541
FrameCode::size_lsb
uint16_t size_lsb
Definition: nut.h:69
Syncpoint
Definition: nut.h:58
AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT
@ AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT
Definition: avcodec.h:1533
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: avcodec.h:1509
sample_rate
sample_rate
Definition: ffmpeg_filter.c:191
ffio_get_checksum
unsigned long ffio_get_checksum(AVIOContext *s)
Definition: aviobuf.c:618
AVINDEX_KEYFRAME
#define AVINDEX_KEYFRAME
Definition: avformat.h:808
ff_nut_sp_pos_cmp
int ff_nut_sp_pos_cmp(const void *a, const void *b)
Definition: nut.c:269
ff_nut_free_sp
void ff_nut_free_sp(NUTContext *nut)
Definition: nut.c:312
AVCodecParameters::channels
int channels
Audio only.
Definition: avcodec.h:4063
find_best_header_idx
static int find_best_header_idx(NUTContext *nut, AVPacket *pkt)
Definition: nutenc.c:802
fail
#define fail()
Definition: checkasm.h:120
nut_write_header
static int nut_write_header(AVFormatContext *s)
Definition: nutenc.c:681
start
void INT64 start
Definition: avisynth_c.h:767
av_add_index_entry
int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp, int size, int distance, int flags)
Add an index entry into a sorted list.
Definition: utils.c:2056
avio_tell
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:557
NUTContext::avf
AVFormatContext * avf
Definition: nut.h:93
AVChapter
Definition: avformat.h:1299
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:647
NUTContext::header
const uint8_t * header[128]
Definition: nut.h:98
AV_CODEC_ID_MP3
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
Definition: avcodec.h:565
AVRational::num
int num
Numerator.
Definition: rational.h:59
AV_PKT_DATA_STRINGS_METADATA
@ AV_PKT_DATA_STRINGS_METADATA
A list of zero terminated key/value strings.
Definition: avcodec.h:1316
NUTContext::sp_count
int sp_count
Definition: nut.h:109
avio_close_dyn_buf
int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
Return the written size and a pointer to the buffer.
Definition: aviobuf.c:1415
NUTContext::header_count
int header_count
Definition: nut.h:106
avassert.h
put_str
static void put_str(AVIOContext *bc, const char *string)
Store a string as vb.
Definition: nutenc.c:289
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
NUTContext
Definition: nut.h:91
buf
void * buf
Definition: avisynth_c.h:766
ChapterContext::time_base
AVRational * time_base
Definition: nut.h:88
av_dict_get
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
Definition: dict.c:40
avio_open_dyn_buf
int avio_open_dyn_buf(AVIOContext **s)
Open a write only memory stream.
Definition: aviobuf.c:1386
E
#define E
Definition: nutenc.c:1203
AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS
@ AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS
Definition: avcodec.h:1535
intreadwrite.h
ff_nut_metadata_conv
const AVMetadataConv ff_nut_metadata_conv[]
Definition: nut.c:330
s
#define s(width, name)
Definition: cbs_vp9.c:257
nut.h
AVFormatContext::chapters
AVChapter ** chapters
Definition: avformat.h:1572
AVDictionaryEntry::key
char * key
Definition: dict.h:82
frame_size
int frame_size
Definition: mxfenc.c:2215
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
AVCodecParameters::width
int width
Video only.
Definition: avcodec.h:4023
AV_CODEC_ID_MP2
@ AV_CODEC_ID_MP2
Definition: avcodec.h:564
NUTContext::time_base
AVRational * time_base
Definition: nut.h:107
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
write_streamheader
static int write_streamheader(AVFormatContext *avctx, AVIOContext *bc, AVStream *st, int i)
Definition: nutenc.c:406
AVPacketSideData::data
uint8_t * data
Definition: avcodec.h:1421
StreamContext::last_pts
int64_t last_pts
Definition: nut.h:78
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
write_index
static int write_index(NUTContext *nut, AVIOContext *bc)
Definition: nutenc.c:569
key
const char * key
Definition: hwcontext_opencl.c:168
FrameCode::size_mul
uint16_t size_mul
Definition: nut.h:68
FLAG_INVALID
@ FLAG_INVALID
Definition: nut.h:55
f
#define f(width, name)
Definition: cbs_vp9.c:255
find_expected_header
static int find_expected_header(AVCodecParameters *p, int size, int key_frame, uint8_t out[64])
Definition: nutenc.c:38
AV_CODEC_ID_H264
@ AV_CODEC_ID_H264
Definition: avcodec.h:245
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:72
if
if(ret)
Definition: filter_design.txt:179
options
static const AVOption options[]
Definition: nutenc.c:1204
AVFormatContext
Format I/O context.
Definition: avformat.h:1342
internal.h
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:1017
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVSEEK_FLAG_BACKWARD
#define AVSEEK_FLAG_BACKWARD
Definition: avformat.h:2495
Dispositions::flag
int flag
Definition: nut.h:130
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:67
NULL
#define NULL
Definition: coverity.c:32
NUT_BROADCAST
#define NUT_BROADCAST
Definition: nut.h:113
write_trailer
static int write_trailer(AVFormatContext *s1)
Definition: v4l2enc.c:94
ff_choose_timebase
AVRational ff_choose_timebase(AVFormatContext *s, AVStream *st, int min_precision)
Chooses a timebase for muxing the specified stream.
Definition: mux.c:102
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
AVPacketSideData::type
enum AVPacketSideDataType type
Definition: avcodec.h:1423
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:191
NUTContext::chapter
ChapterContext * chapter
Definition: nut.h:101
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:934
time.h
avio_w8
void avio_w8(AVIOContext *s, int b)
Definition: aviobuf.c:196
build_elision_headers
static void build_elision_headers(AVFormatContext *s)
Definition: nutenc.c:122
write_headers
static int write_headers(AVFormatContext *avctx, AVIOContext *bc)
Definition: nutenc.c:621
index
int index
Definition: gxfenc.c:89
AVCodecParameters::sample_rate
int sample_rate
Audio only.
Definition: avcodec.h:4067
AV_CODEC_ID_MPEG1VIDEO
@ AV_CODEC_ID_MPEG1VIDEO
Definition: avcodec.h:219
FLAG_CODED
@ FLAG_CODED
Definition: nut.h:54
AVCodecParameters::extradata_size
int extradata_size
Size of the extradata content in bytes.
Definition: avcodec.h:3975
AV_WB32
#define AV_WB32(p, v)
Definition: intreadwrite.h:419
AVFormatContext::nb_streams
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
Definition: avformat.h:1398
StreamContext
Definition: transcoding.c:47
put_tt
static void put_tt(NUTContext *nut, AVRational *time_base, AVIOContext *bc, uint64_t val)
Definition: nutenc.c:280
av_rescale_rnd
int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd)
Rescale a 64-bit integer with specified rounding.
Definition: mathematics.c:58
FLAG_SIZE_MSB
@ FLAG_SIZE_MSB
Definition: nut.h:48
AVIOContext
Bytestream IO Context.
Definition: avio.h:161
put_s
static void put_s(AVIOContext *bc, int64_t val)
Definition: nutenc.c:297
AVPacket::size
int size
Definition: avcodec.h:1478
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:188
id
enum AVCodecID id
Definition: extract_extradata_bsf.c:329
AVStream::nb_index_entries
int nb_index_entries
Definition: avformat.h:1101
add_info
static int add_info(AVIOContext *bc, const char *type, const char *value)
Definition: nutenc.c:463
NUTContext::max_pts_tb
AVRational * max_pts_tb
Definition: nut.h:112
FFMAX
#define FFMAX(a, b)
Definition: common.h:94
avpriv_set_pts_info
void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition: utils.c:4910
NUTContext::flags
int flags
Definition: nut.h:115
size
int size
Definition: twinvq_data.h:11134
NUTContext::stream
StreamContext * stream
Definition: nut.h:100
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
FrameCode::flags
uint16_t flags
Definition: nut.h:66
NUT_STABLE_VERSION
#define NUT_STABLE_VERSION
Definition: nut.h:40
build_frame_code
static void build_frame_code(AVFormatContext *s)
Definition: nutenc.c:144
AV_WB24
#define AV_WB24(p, d)
Definition: intreadwrite.h:450
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:626
AVStream::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
Definition: avformat.h:932
val
const char const char void * val
Definition: avisynth_c.h:863
tree.h
header
static const uint8_t header[24]
Definition: sdr2.c:67
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: avcodec.h:1476
avio_write
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
Definition: aviobuf.c:218
FFMIN
#define FFMIN(a, b)
Definition: common.h:96
av_reallocp_array
int av_reallocp_array(void *ptr, size_t nmemb, size_t size)
Allocate, reallocate, or free an array through a pointer to a pointer.
Definition: mem.c:205
avio_wl32
void avio_wl32(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:369
AVPacketSideData::size
int size
Definition: avcodec.h:1422
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: avcodec.h:1483
find_header_idx
static int find_header_idx(AVFormatContext *s, AVCodecParameters *p, int size, int frame_type)
Definition: nutenc.c:105
NUTContext::version
int version
Definition: nut.h:116
StreamContext::msb_pts_shift
int msb_pts_shift
Definition: nut.h:81
AV_PKT_DATA_METADATA_UPDATE
@ AV_PKT_DATA_METADATA_UPDATE
A list of zero terminated key/value strings.
Definition: avcodec.h:1353
ff_crc04C11DB7_update
unsigned long ff_crc04C11DB7_update(unsigned long checksum, const uint8_t *buf, unsigned int len)
Definition: aviobuf.c:600
write_packet
static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int unqueue)
Definition: ffmpeg.c:690
flag
#define flag(name)
Definition: cbs_av1.c:557
ff_standardize_creation_time
int ff_standardize_creation_time(AVFormatContext *s)
Standardize creation_time metadata in AVFormatContext to an ISO-8601 timestamp string.
Definition: utils.c:5694
ff_nut_add_sp
int ff_nut_add_sp(NUTContext *nut, int64_t pos, int64_t back_ptr, int64_t ts)
Definition: nut.c:281
NUTContext::syncpoints
struct AVTreeNode * syncpoints
Definition: nut.h:108
AVFMT_GLOBALHEADER
#define AVFMT_GLOBALHEADER
Format wants global header.
Definition: avformat.h:466
AVOutputFormat
Definition: avformat.h:495
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: avcodec.h:1470
avio_internal.h
ff_lsb2full
int64_t ff_lsb2full(StreamContext *stream, int64_t lsb)
Definition: nut.c:262
AVCodecParameters::height
int height
Definition: avcodec.h:4024
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:53
put_packet
static void put_packet(NUTContext *nut, AVIOContext *bc, AVIOContext *dyn_bc, int calculate_checksum, uint64_t startcode)
Definition: nutenc.c:303
AV_ROUND_DOWN
@ AV_ROUND_DOWN
Round toward -infinity.
Definition: mathematics.h:82
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
uint8_t
uint8_t
Definition: audio_convert.c:194
headers
FFmpeg currently uses a custom build this text attempts to document some of its obscure features and options Makefile the full command issued by make and its output will be shown on the screen DBG Preprocess x86 external assembler files to a dbg asm file in the object which then gets compiled Helps in developing those assembler files DESTDIR Destination directory for the install useful to prepare packages or install FFmpeg in cross environments GEN Set to ‘1’ to generate the missing or mismatched references Makefile builds all the libraries and the executables fate Run the fate test note that you must have installed it fate list List all fate regression test targets install Install headers
Definition: build_system.txt:34
NUTContext::max_pts
int64_t max_pts
Definition: nut.h:111
av_inv_q
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
Definition: rational.h:159
AV_PKT_DATA_SKIP_SAMPLES
@ AV_PKT_DATA_SKIP_SAMPLES
Recommmends skipping the specified number of samples.
Definition: avcodec.h:1300
len
int len
Definition: vorbis_enc_data.h:452
NUTContext::frame_code
FrameCode frame_code[256]
Definition: nut.h:96
StreamContext::keyframe_pts
int64_t * keyframe_pts
Definition: nut.h:84
FLAG_SM_DATA
@ FLAG_SM_DATA
Definition: nut.h:51
AVStream::disposition
int disposition
AV_DISPOSITION_* bit field.
Definition: avformat.h:923
ffio_free_dyn_buf
void ffio_free_dyn_buf(AVIOContext **s)
Free a dynamic buffer.
Definition: aviobuf.c:1445
AVFMT_FLAG_BITEXACT
#define AVFMT_FLAG_BITEXACT
When muxing, try to avoid writing any random/volatile data to the output.
Definition: avformat.h:1490
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:870
pred
static const float pred[4]
Definition: siprdata.h:259
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:72
FLAG_STREAM_ID
@ FLAG_STREAM_ID
Definition: nut.h:47
ff_parse_specific_params
void ff_parse_specific_params(AVStream *st, int *au_rate, int *au_ssize, int *au_scale)
Definition: riffenc.c:265
dict.h
AVPacket::side_data
AVPacketSideData * side_data
Additional packet data that can be provided by the container.
Definition: avcodec.h:1488
FrameCode::header_idx
uint8_t header_idx
Definition: nut.h:72
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:88
FLAG_CHECKSUM
@ FLAG_CHECKSUM
Definition: nut.h:49
FLAG_KEY
@ FLAG_KEY
Definition: nut.h:44
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Non-inlined equivalent of av_mallocz_array().
Definition: mem.c:244
ff_nut_codec_tags
const AVCodecTag *const ff_nut_codec_tags[]
Definition: nut.c:246
AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT
@ AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT
Definition: avcodec.h:1532
ff_nut_muxer
AVOutputFormat ff_nut_muxer
Definition: nutenc.c:1220
pkt
static AVPacket pkt
Definition: demuxing_decoding.c:54
FLAG_HEADER_IDX
@ FLAG_HEADER_IDX
Definition: nut.h:52
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: avcodec.h:1199
AVRational::den
int den
Denominator.
Definition: rational.h:60
dummy
int dummy
Definition: motion.c:64
AVStream::r_frame_rate
AVRational r_frame_rate
Real base framerate of the stream.
Definition: avformat.h:994
AVIndexEntry::pos
int64_t pos
Definition: avformat.h:801
av_get_audio_frame_duration2
int av_get_audio_frame_duration2(AVCodecParameters *par, int frame_bytes)
This function is the same as av_get_audio_frame_duration(), except it works with AVCodecParameters in...
Definition: utils.c:1785
AVPacket::stream_index
int stream_index
Definition: avcodec.h:1479
write_sm_data
static int write_sm_data(AVFormatContext *s, AVIOContext *bc, AVPacket *pkt, int is_meta)
Definition: nutenc.c:821
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
mpegaudiodata.h
OFFSET
#define OFFSET(x)
Definition: nutenc.c:1202
avio_wb64
void avio_wb64(AVIOContext *s, uint64_t val)
Definition: aviobuf.c:463
av_gettime
int64_t av_gettime(void)
Get the current time in microseconds.
Definition: time.c:39
MAX_DISTANCE
#define MAX_DISTANCE
Definition: nut.h:37
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: avcodec.h:1335
AVCodecParameters::video_delay
int video_delay
Video only.
Definition: avcodec.h:4052
avio_flush
int void avio_flush(AVIOContext *s)
Force flushing of buffered data.
Definition: aviobuf.c:238
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AVDictionaryEntry
Definition: dict.h:81
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: avcodec.h:3957
FrameCode
Definition: nut.h:65
AVPacket
This structure stores compressed data.
Definition: avcodec.h:1454
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Definition: opt.h:240
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
riff.h
nut_write_deinit
static void nut_write_deinit(AVFormatContext *s)
Definition: nutenc.c:1187
INDEX_STARTCODE
#define INDEX_STARTCODE
Definition: nut.h:32
ff_get_v_length
int ff_get_v_length(uint64_t val)
Get the length in bytes which is needed to store val as v.
Definition: aviobuf.c:437
AV_OPT_TYPE_FLAGS
@ AV_OPT_TYPE_FLAGS
Definition: opt.h:222
bytestream.h
AV_PKT_DATA_QUALITY_STATS
@ AV_PKT_DATA_QUALITY_STATS
This side data contains quality related information from the encoder.
Definition: avcodec.h:1276
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:565
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
length
const char int length
Definition: avisynth_c.h:860
AV_CODEC_ID_VORBIS
@ AV_CODEC_ID_VORBIS
Definition: avcodec.h:569
AVDictionaryEntry::value
char * value
Definition: dict.h:83
StreamContext::time_base
AVRational time_base
Definition: signature.h:103
write_header
static void write_header(FFV1Context *f)
Definition: ffv1enc.c:337
AV_CODEC_ID_MPEG2VIDEO
@ AV_CODEC_ID_MPEG2VIDEO
preferred ID for MPEG-1/2 video decoding
Definition: avcodec.h:220
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Definition: opt.h:232
snprintf
#define snprintf
Definition: snprintf.h:34
INFO_STARTCODE
#define INFO_STARTCODE
Definition: nut.h:33
MAIN_STARTCODE
#define MAIN_STARTCODE
Definition: nut.h:29
AVFormatContext::priv_data
void * priv_data
Format private data.
Definition: avformat.h:1370
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
StreamContext::max_pts_distance
int max_pts_distance
Definition: nut.h:82
AV_RB64
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_RB64
Definition: bytestream.h:91
ID_STRING
#define ID_STRING
Definition: ffmeta.h:25
AVPacket::side_data_elems
int side_data_elems
Definition: avcodec.h:1489
av_index_search_timestamp
int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags)
Get the index for a specific timestamp.
Definition: utils.c:2167