FFmpeg
avienc.c
Go to the documentation of this file.
1 /*
2  * AVI muxer
3  * Copyright (c) 2000 Fabrice Bellard
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 #include <math.h>
23 
24 #include "avformat.h"
25 #include "internal.h"
26 #include "avi.h"
27 #include "avio_internal.h"
28 #include "riff.h"
29 #include "mpegts.h"
30 #include "libavformat/avlanguage.h"
31 #include "libavutil/avstring.h"
32 #include "libavutil/avutil.h"
33 #include "libavutil/internal.h"
34 #include "libavutil/intreadwrite.h"
35 #include "libavutil/dict.h"
36 #include "libavutil/avassert.h"
37 #include "libavutil/timestamp.h"
38 #include "libavutil/opt.h"
39 #include "libavutil/pixdesc.h"
40 #include "libavcodec/raw.h"
41 
42 /*
43  * TODO:
44  * - fill all fields if non streamed (nb_frames for example)
45  */
46 
47 typedef struct AVIIentry {
48  char tag[4];
49  unsigned int flags;
50  unsigned int pos;
51  unsigned int len;
52 } AVIIentry;
53 
54 #define AVI_INDEX_CLUSTER_SIZE 16384
55 #define AVI_MASTER_INDEX_PREFIX_SIZE (8+2+1+1+4+8+4+4)
56 #define AVI_MASTER_INDEX_ENTRY_SIZE 16 /* bytes per entry */
57 #define AVI_MASTER_INDEX_SIZE_DEFAULT 256 /* number of entries */
58 
59 typedef struct AVIIndex {
60  int64_t indx_start;
62  int entry;
66 } AVIIndex;
67 
68 typedef struct AVIContext {
69  const AVClass *class;
71  int64_t frames_hdr_all;
72  int riff_id;
76 } AVIContext;
77 
78 typedef struct AVIStream {
79  int64_t frames_hdr_strm;
82  int entry;
83  int max_size;
85 
86  int64_t last_dts;
87 
89 
91 
94  int64_t pal_offset;
95 } AVIStream;
96 
98 
99 static inline AVIIentry *avi_get_ientry(const AVIIndex *idx, int ent_id)
100 {
101  int cl = ent_id / AVI_INDEX_CLUSTER_SIZE;
102  int id = ent_id % AVI_INDEX_CLUSTER_SIZE;
103  return &idx->cluster[cl][id];
104 }
105 
106 static int avi_add_ientry(AVFormatContext *s, int stream_index, char *tag,
107  unsigned int flags, unsigned int size)
108 {
109  AVIContext *avi = s->priv_data;
110  AVIOContext *pb = s->pb;
111  AVIStream *avist = s->streams[stream_index]->priv_data;
112  AVIIndex *idx = &avist->indexes;
113  int cl = idx->entry / AVI_INDEX_CLUSTER_SIZE;
114  int id = idx->entry % AVI_INDEX_CLUSTER_SIZE;
115 
116  if (idx->ents_allocated <= idx->entry) {
117  idx->cluster = av_realloc_f(idx->cluster, sizeof(void*), cl+1);
118  if (!idx->cluster) {
119  idx->ents_allocated = 0;
120  idx->entry = 0;
121  return AVERROR(ENOMEM);
122  }
123  idx->cluster[cl] =
125  if (!idx->cluster[cl])
126  return AVERROR(ENOMEM);
128  }
129 
130  if (tag)
131  memcpy(idx->cluster[cl][id].tag, tag, 4);
132  else
133  memset(idx->cluster[cl][id].tag, 0, 4);
134  idx->cluster[cl][id].flags = flags;
135  idx->cluster[cl][id].pos = avio_tell(pb) - avi->movi_list;
136  idx->cluster[cl][id].len = size;
137  avist->max_size = FFMAX(avist->max_size, size);
138  idx->entry++;
139 
140  return 0;
141 }
142 
143 static av_cold int avi_init(struct AVFormatContext *s)
144 {
145  AVIContext *avi = s->priv_data;
146 
147  if (avi->reserve_index_space > 0) {
150  } else
152  av_log(s, AV_LOG_DEBUG, "reserve_index_space:%d master_index_max_size:%d\n",
154 
155  return 1; /* stream initialization continues in avi_write_header */
156 }
157 
159  const char *riff_tag, const char *list_tag)
160 {
161  AVIContext *avi = s->priv_data;
162  int64_t loff;
163  int i;
164 
165  avi->riff_id++;
166  for (i = 0; i < s->nb_streams; i++) {
167  AVIStream *avist = s->streams[i]->priv_data;
169  avist->indexes.entry = 0;
170  }
171 
172  avi->riff_start = ff_start_tag(pb, "RIFF");
173  ffio_wfourcc(pb, riff_tag);
174  loff = ff_start_tag(pb, "LIST");
175  ffio_wfourcc(pb, list_tag);
176  return loff;
177 }
178 
179 static char *avi_stream2fourcc(char *tag, int index, enum AVMediaType type)
180 {
181  tag[0] = '0' + index / 10;
182  tag[1] = '0' + index % 10;
183  if (type == AVMEDIA_TYPE_VIDEO) {
184  tag[2] = 'd';
185  tag[3] = 'c';
186  } else if (type == AVMEDIA_TYPE_SUBTITLE) {
187  // note: this is not an official code
188  tag[2] = 's';
189  tag[3] = 'b';
190  } else {
191  tag[2] = 'w';
192  tag[3] = 'b';
193  }
194  tag[4] = '\0';
195  return tag;
196 }
197 
198 static int avi_write_counters(AVFormatContext *s, int riff_id)
199 {
200  AVIOContext *pb = s->pb;
201  AVIContext *avi = s->priv_data;
202  int n, au_byterate, au_ssize, au_scale, nb_frames = 0;
203  int64_t file_size;
204  AVCodecParameters *par;
205 
206  file_size = avio_tell(pb);
207  for (n = 0; n < s->nb_streams; n++) {
208  AVIStream *avist = s->streams[n]->priv_data;
209 
210  av_assert0(avist->frames_hdr_strm);
211  par = s->streams[n]->codecpar;
212  avio_seek(pb, avist->frames_hdr_strm, SEEK_SET);
213  ff_parse_specific_params(s->streams[n], &au_byterate, &au_ssize, &au_scale);
214  if (au_ssize == 0)
215  avio_wl32(pb, avist->packet_count);
216  else
217  avio_wl32(pb, avist->audio_strm_length / au_ssize);
218  if (par->codec_type == AVMEDIA_TYPE_VIDEO)
219  nb_frames = FFMAX(nb_frames, avist->packet_count);
220  }
221  if (riff_id == 1) {
223  avio_seek(pb, avi->frames_hdr_all, SEEK_SET);
224  avio_wl32(pb, nb_frames);
225  }
226  avio_seek(pb, file_size, SEEK_SET);
227 
228  return 0;
229 }
230 
231 static void write_odml_master(AVFormatContext *s, int stream_index)
232 {
233  AVIOContext *pb = s->pb;
234  AVIContext *avi = s->priv_data;
235  AVStream *st = s->streams[stream_index];
236  AVCodecParameters *par = st->codecpar;
237  AVIStream *avist = st->priv_data;
238  unsigned char tag[5];
239  int j;
240 
241  /* Starting to lay out AVI OpenDML master index.
242  * We want to make it JUNK entry for now, since we'd
243  * like to get away without making AVI an OpenDML one
244  * for compatibility reasons. */
245  avist->indexes.indx_start = ff_start_tag(pb, "JUNK");
246  avio_wl16(pb, 4); /* wLongsPerEntry */
247  avio_w8(pb, 0); /* bIndexSubType (0 == frame index) */
248  avio_w8(pb, 0); /* bIndexType (0 == AVI_INDEX_OF_INDEXES) */
249  avio_wl32(pb, 0); /* nEntriesInUse (will fill out later on) */
250  ffio_wfourcc(pb, avi_stream2fourcc(tag, stream_index, par->codec_type));
251  /* dwChunkId */
252  avio_wl64(pb, 0); /* dwReserved[3] */
253  avio_wl32(pb, 0); /* Must be 0. */
254  for (j = 0; j < avi->master_index_max_size * 2; j++)
255  avio_wl64(pb, 0);
256  ff_end_tag(pb, avist->indexes.indx_start);
257 }
258 
260 {
261  AVIContext *avi = s->priv_data;
262  AVIOContext *pb = s->pb;
263  int bitrate, n, i, nb_frames, au_byterate, au_ssize, au_scale;
264  int64_t max_stream_duration = 0;
265  AVCodecParameters *video_par;
267  int64_t list1, list2, strh, strf;
268  AVDictionaryEntry *t = NULL;
269  int padding;
270 
271  if (s->nb_streams > AVI_MAX_STREAM_COUNT) {
272  av_log(s, AV_LOG_ERROR, "AVI does not support >%d streams\n",
274  return AVERROR(EINVAL);
275  }
276 
277  for (n = 0; n < s->nb_streams; n++) {
278  s->streams[n]->priv_data = av_mallocz(sizeof(AVIStream));
279  if (!s->streams[n]->priv_data)
280  return AVERROR(ENOMEM);
281  }
282 
283  /* header list */
284  avi->riff_id = 0;
285  list1 = avi_start_new_riff(s, pb, "AVI ", "hdrl");
286 
287  /* avi header */
288  ffio_wfourcc(pb, "avih");
289  avio_wl32(pb, 14 * 4);
290  bitrate = 0;
291 
292  video_par = NULL;
293  for (n = 0; n < s->nb_streams; n++) {
294  AVCodecParameters *par = s->streams[n]->codecpar;
295  AVStream *st = s->streams[n];
296  bitrate = FFMIN(bitrate + par->bit_rate, INT32_MAX);
297  if (st->duration > 0) {
298  int64_t stream_duration = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
299  max_stream_duration = FFMAX(stream_duration, max_stream_duration);
300  }
301  if (par->codec_type == AVMEDIA_TYPE_VIDEO) {
302  video_par = par;
303  video_st = st;
304  }
305  }
306 
307  /* guess master index size based on bitrate and duration */
308  if (!avi->reserve_index_space) {
309  double duration_est, filesize_est;
310  if (s->duration > 0)
311  duration_est = (double)s->duration / AV_TIME_BASE;
312  else if (max_stream_duration > 0)
313  duration_est = (double)max_stream_duration / AV_TIME_BASE;
314  else
315  duration_est = 10 * 60 * 60; /* default to 10 hours */
316  filesize_est = duration_est * (bitrate / 8) * 1.10; /* add 10% safety margin for muxer+bitrate */
317  avi->master_index_max_size = FFMAX((int)ceil(filesize_est / AVI_MAX_RIFF_SIZE) + 1,
318  avi->master_index_max_size);
319  av_log(s, AV_LOG_DEBUG, "duration_est:%0.3f, filesize_est:%0.1fGiB, master_index_max_size:%d\n",
320  duration_est, filesize_est / (1024*1024*1024), avi->master_index_max_size);
321  }
322 
323  nb_frames = 0;
324 
325  // TODO: should be avg_frame_rate
326  if (video_st)
327  avio_wl32(pb, (uint32_t) (INT64_C(1000000) * video_st->time_base.num /
329  else
330  avio_wl32(pb, 0);
331  avio_wl32(pb, bitrate / 8); /* XXX: not quite exact */
332  avio_wl32(pb, 0); /* padding */
333  if (!(pb->seekable & AVIO_SEEKABLE_NORMAL))
334  avio_wl32(pb, AVIF_TRUSTCKTYPE | AVIF_ISINTERLEAVED); /* flags */
335  else
337  avi->frames_hdr_all = avio_tell(pb); /* remember this offset to fill later */
338  avio_wl32(pb, nb_frames); /* nb frames, filled later */
339  avio_wl32(pb, 0); /* initial frame */
340  avio_wl32(pb, s->nb_streams); /* nb streams */
341  avio_wl32(pb, 1024 * 1024); /* suggested buffer size */
342  if (video_par) {
343  avio_wl32(pb, video_par->width);
344  avio_wl32(pb, video_par->height);
345  } else {
346  avio_wl32(pb, 0);
347  avio_wl32(pb, 0);
348  }
349  avio_wl32(pb, 0); /* reserved */
350  avio_wl32(pb, 0); /* reserved */
351  avio_wl32(pb, 0); /* reserved */
352  avio_wl32(pb, 0); /* reserved */
353 
354  /* stream list */
355  for (i = 0; i < n; i++) {
356  AVStream *st = s->streams[i];
357  AVCodecParameters *par = st->codecpar;
358  AVIStream *avist = st->priv_data;
359  list2 = ff_start_tag(pb, "LIST");
360  ffio_wfourcc(pb, "strl");
361 
362  /* stream generic header */
363  strh = ff_start_tag(pb, "strh");
364  switch (par->codec_type) {
366  // XSUB subtitles behave like video tracks, other subtitles
367  // are not (yet) supported.
368  if (par->codec_id != AV_CODEC_ID_XSUB) {
369  avpriv_report_missing_feature(s, "Subtitle streams other than DivX XSUB");
370  return AVERROR_PATCHWELCOME;
371  }
372  case AVMEDIA_TYPE_VIDEO:
373  ffio_wfourcc(pb, "vids");
374  break;
375  case AVMEDIA_TYPE_AUDIO:
376  ffio_wfourcc(pb, "auds");
377  break;
378 // case AVMEDIA_TYPE_TEXT:
379 // ffio_wfourcc(pb, "txts");
380 // break;
381  case AVMEDIA_TYPE_DATA:
382  ffio_wfourcc(pb, "dats");
383  break;
384  }
385  if (par->codec_type == AVMEDIA_TYPE_VIDEO ||
386  par->codec_id == AV_CODEC_ID_XSUB)
387  avio_wl32(pb, par->codec_tag);
388  else
389  avio_wl32(pb, 1);
390  avist->strh_flags_offset = avio_tell(pb);
391  avio_wl32(pb, 0); /* flags */
392  avio_wl16(pb, 0); /* priority */
393  avio_wl16(pb, 0); /* language */
394  avio_wl32(pb, 0); /* initial frame */
395 
396  ff_parse_specific_params(st, &au_byterate, &au_ssize, &au_scale);
397 
398  if ( par->codec_type == AVMEDIA_TYPE_VIDEO
399  && par->codec_id != AV_CODEC_ID_XSUB
400  && au_byterate > 1000LL*au_scale) {
401  au_byterate = 600;
402  au_scale = 1;
403  }
404  avpriv_set_pts_info(st, 64, au_scale, au_byterate);
405  if (par->codec_id == AV_CODEC_ID_XSUB)
406  au_scale = au_byterate = 0;
407 
408  avio_wl32(pb, au_scale); /* scale */
409  avio_wl32(pb, au_byterate); /* rate */
410 
411  avio_wl32(pb, 0); /* start */
412  /* remember this offset to fill later */
413  avist->frames_hdr_strm = avio_tell(pb);
414  if (!(pb->seekable & AVIO_SEEKABLE_NORMAL))
415  /* FIXME: this may be broken, but who cares */
417  else
418  avio_wl32(pb, 0); /* length, XXX: filled later */
419 
420  /* suggested buffer size, is set to largest chunk size in avi_write_trailer */
421  if (par->codec_type == AVMEDIA_TYPE_VIDEO)
422  avio_wl32(pb, 1024 * 1024);
423  else if (par->codec_type == AVMEDIA_TYPE_AUDIO)
424  avio_wl32(pb, 12 * 1024);
425  else
426  avio_wl32(pb, 0);
427  avio_wl32(pb, -1); /* quality */
428  avio_wl32(pb, au_ssize); /* sample size */
429  avio_wl32(pb, 0);
430  avio_wl16(pb, par->width);
431  avio_wl16(pb, par->height);
432  ff_end_tag(pb, strh);
433 
434  if (par->codec_type != AVMEDIA_TYPE_DATA) {
435  int ret, flags;
436  enum AVPixelFormat pix_fmt;
437 
438  strf = ff_start_tag(pb, "strf");
439  switch (par->codec_type) {
441  /* XSUB subtitles behave like video tracks, other subtitles
442  * are not (yet) supported. */
443  if (par->codec_id != AV_CODEC_ID_XSUB)
444  break;
445  case AVMEDIA_TYPE_VIDEO:
446  /* WMP expects RGB 5:5:5 rawvideo in avi to have bpp set to 16. */
447  if ( !par->codec_tag
448  && par->codec_id == AV_CODEC_ID_RAWVIDEO
449  && par->format == AV_PIX_FMT_RGB555LE
450  && par->bits_per_coded_sample == 15)
451  par->bits_per_coded_sample = 16;
452  avist->pal_offset = avio_tell(pb) + 40;
453  ff_put_bmp_header(pb, par, 0, 0);
455  par->bits_per_coded_sample);
456  if ( !par->codec_tag
457  && par->codec_id == AV_CODEC_ID_RAWVIDEO
458  && par->format != pix_fmt
459  && par->format != AV_PIX_FMT_NONE)
460  av_log(s, AV_LOG_ERROR, "%s rawvideo cannot be written to avi, output file will be unreadable\n",
462 
463  if (par->format == AV_PIX_FMT_PAL8) {
464  if (par->bits_per_coded_sample < 0 || par->bits_per_coded_sample > 8) {
465  av_log(s, AV_LOG_ERROR, "PAL8 with %d bps is not allowed\n", par->bits_per_coded_sample);
466  return AVERROR(EINVAL);
467  }
468  }
469 
470  break;
471  case AVMEDIA_TYPE_AUDIO:
473  if ((ret = ff_put_wav_header(s, pb, par, flags)) < 0)
474  return ret;
475  break;
476  default:
478  "Invalid or not supported codec type '%s' found in the input\n",
479  (char *)av_x_if_null(av_get_media_type_string(par->codec_type), "?"));
480  return AVERROR(EINVAL);
481  }
482  ff_end_tag(pb, strf);
483  if ((t = av_dict_get(st->metadata, "title", NULL, 0))) {
484  ff_riff_write_info_tag(s->pb, "strn", t->value);
485  t = NULL;
486  }
487  if (par->codec_id == AV_CODEC_ID_XSUB
488  && (t = av_dict_get(s->streams[i]->metadata, "language", NULL, 0))) {
489  const char* langstr = ff_convert_lang_to(t->value, AV_LANG_ISO639_1);
490  t = NULL;
491  if (langstr) {
492  char* str = av_asprintf("Subtitle - %s-xx;02", langstr);
493  if (!str)
494  return AVERROR(ENOMEM);
495  ff_riff_write_info_tag(s->pb, "strn", str);
496  av_free(str);
497  }
498  }
499  }
500 
501  if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
503  }
504 
505  if (par->codec_type == AVMEDIA_TYPE_VIDEO &&
506  st->sample_aspect_ratio.num > 0 &&
507  st->sample_aspect_ratio.den > 0) {
508  int vprp = ff_start_tag(pb, "vprp");
510  (AVRational) { par->width,
511  par->height });
512  int num, den, fields, i;
513  av_reduce(&num, &den, dar.num, dar.den, 0xFFFF);
514  if (par->field_order == AV_FIELD_TT || par->field_order == AV_FIELD_BB ||
515  par->field_order == AV_FIELD_TB || par->field_order == AV_FIELD_BT) {
516  fields = 2; // interlaced
517  } else {
518  fields = 1; // progressive
519  }
520 
521  avio_wl32(pb, 0); // video format = unknown
522  avio_wl32(pb, 0); // video standard = unknown
523  // TODO: should be avg_frame_rate
524  avio_wl32(pb, (2LL*st->time_base.den + st->time_base.num - 1) / (2LL * st->time_base.num));
525  avio_wl32(pb, par->width);
526  avio_wl32(pb, par->height);
527  avio_wl16(pb, den);
528  avio_wl16(pb, num);
529  avio_wl32(pb, par->width);
530  avio_wl32(pb, par->height);
531  avio_wl32(pb, fields); // fields per frame
532 
533  for (i = 0; i < fields; i++) {
534  int start_line;
535  // OpenDML v1.02 is not very specific on what value to use for
536  // start_line when frame data is not coming from a capturing device,
537  // so just use 0/1 depending on the field order for interlaced frames
538  if (par->field_order == AV_FIELD_TT || par->field_order == AV_FIELD_TB) {
539  start_line = (i == 0) ? 0 : 1;
540  } else if (par->field_order == AV_FIELD_BB || par->field_order == AV_FIELD_BT) {
541  start_line = (i == 0) ? 1 : 0;
542  } else {
543  start_line = 0;
544  }
545 
546  avio_wl32(pb, par->height / fields); // compressed bitmap height
547  avio_wl32(pb, par->width); // compressed bitmap width
548  avio_wl32(pb, par->height / fields); // valid bitmap height
549  avio_wl32(pb, par->width); // valid bitmap width
550  avio_wl32(pb, 0); // valid bitmap X offset
551  avio_wl32(pb, 0); // valid bitmap Y offset
552  avio_wl32(pb, 0); // valid X offset in T
553  avio_wl32(pb, start_line); // valid Y start line
554  }
555  ff_end_tag(pb, vprp);
556  }
557 
558  ff_end_tag(pb, list2);
559  }
560 
561  if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
562  /* AVI could become an OpenDML one, if it grows beyond 2Gb range */
563  avi->odml_list = ff_start_tag(pb, "JUNK");
564  ffio_wfourcc(pb, "odml");
565  ffio_wfourcc(pb, "dmlh");
566  avio_wl32(pb, 248);
567  for (i = 0; i < 248; i += 4)
568  avio_wl32(pb, 0);
569  ff_end_tag(pb, avi->odml_list);
570  }
571 
572  ff_end_tag(pb, list1);
573 
575 
576 
577  padding = s->metadata_header_padding;
578  if (padding < 0)
579  padding = 1016;
580 
581  /* some padding for easier tag editing */
582  if (padding) {
583  list2 = ff_start_tag(pb, "JUNK");
584  for (i = padding; i > 0; i -= 4)
585  avio_wl32(pb, 0);
586  ff_end_tag(pb, list2);
587  }
588 
589  avi->movi_list = ff_start_tag(pb, "LIST");
590  ffio_wfourcc(pb, "movi");
591 
592  avio_flush(pb);
593 
594  return 0;
595 }
596 
597 static void update_odml_entry(AVFormatContext *s, int stream_index, int64_t ix, int size)
598 {
599  AVIOContext *pb = s->pb;
600  AVIContext *avi = s->priv_data;
601  AVIStream *avist = s->streams[stream_index]->priv_data;
602  int64_t pos;
603  int au_byterate, au_ssize, au_scale;
604 
605  avio_flush(pb);
606  pos = avio_tell(pb);
607 
608  /* Updating one entry in the AVI OpenDML master index */
609  avio_seek(pb, avist->indexes.indx_start - 8, SEEK_SET);
610  ffio_wfourcc(pb, "indx"); /* enabling this entry */
611  avio_skip(pb, 8);
612  avio_wl32(pb, avi->riff_id - avist->indexes.master_odml_riff_id_base); /* nEntriesInUse */
613  avio_skip(pb, 16 * (avi->riff_id - avist->indexes.master_odml_riff_id_base));
614  avio_wl64(pb, ix); /* qwOffset */
615  avio_wl32(pb, size); /* dwSize */
616  ff_parse_specific_params(s->streams[stream_index], &au_byterate, &au_ssize, &au_scale);
617  if (s->streams[stream_index]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && au_ssize > 0) {
618  uint32_t audio_segm_size = (avist->audio_strm_length - avist->indexes.audio_strm_offset);
619  if ((audio_segm_size % au_ssize > 0) && !avist->sample_requested) {
620  avpriv_request_sample(s, "OpenDML index duration for audio packets with partial frames");
621  avist->sample_requested = 1;
622  }
623  avio_wl32(pb, audio_segm_size / au_ssize); /* dwDuration (sample count) */
624  } else
625  avio_wl32(pb, avist->indexes.entry); /* dwDuration (packet count) */
626 
627  avio_seek(pb, pos, SEEK_SET);
628 }
629 
631 {
632  AVIOContext *pb = s->pb;
633  AVIContext *avi = s->priv_data;
634  char tag[5];
635  char ix_tag[] = "ix00";
636  int i, j;
637 
639 
640  for (i = 0; i < s->nb_streams; i++) {
641  AVIStream *avist = s->streams[i]->priv_data;
643  int64_t pos;
645 
646  pos = avio_tell(pb);
647  update_odml_entry(s, i, pos, size);
649  av_assert1(avio_tell(pb) - pos == size);
650  avist->indexes.master_odml_riff_id_base = avi->riff_id - 1;
651  }
653  }
654 
655  for (i = 0; i < s->nb_streams; i++) {
656  AVIStream *avist = s->streams[i]->priv_data;
657  int64_t ix;
658 
659  avi_stream2fourcc(tag, i, s->streams[i]->codecpar->codec_type);
660  ix_tag[3] = '0' + i;
661 
662  /* Writing AVI OpenDML leaf index chunk */
663  ix = avio_tell(pb);
664  ffio_wfourcc(pb, ix_tag); /* ix?? */
665  avio_wl32(pb, avist->indexes.entry * 8 + 24);
666  /* chunk size */
667  avio_wl16(pb, 2); /* wLongsPerEntry */
668  avio_w8(pb, 0); /* bIndexSubType (0 == frame index) */
669  avio_w8(pb, 1); /* bIndexType (1 == AVI_INDEX_OF_CHUNKS) */
670  avio_wl32(pb, avist->indexes.entry);
671  /* nEntriesInUse */
672  ffio_wfourcc(pb, tag); /* dwChunkId */
673  avio_wl64(pb, avi->movi_list); /* qwBaseOffset */
674  avio_wl32(pb, 0); /* dwReserved_3 (must be 0) */
675 
676  for (j = 0; j < avist->indexes.entry; j++) {
677  AVIIentry *ie = avi_get_ientry(&avist->indexes, j);
678  avio_wl32(pb, ie->pos + 8);
679  avio_wl32(pb, ((uint32_t) ie->len & ~0x80000000) |
680  (ie->flags & 0x10 ? 0 : 0x80000000));
681  }
682 
683  update_odml_entry(s, i, ix, avio_tell(pb) - ix);
684  }
685  return 0;
686 }
687 
689 {
690  AVIOContext *pb = s->pb;
691  AVIContext *avi = s->priv_data;
692  int64_t idx_chunk;
693  int i;
694  char tag[5];
695 
696  if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
697  AVIStream *avist;
698  AVIIentry *ie = 0, *tie;
699  int empty, stream_id = -1;
700 
701  idx_chunk = ff_start_tag(pb, "idx1");
702  for (i = 0; i < s->nb_streams; i++) {
703  avist = s->streams[i]->priv_data;
704  avist->entry = 0;
705  }
706 
707  do {
708  empty = 1;
709  for (i = 0; i < s->nb_streams; i++) {
710  avist = s->streams[i]->priv_data;
711  if (avist->indexes.entry <= avist->entry)
712  continue;
713 
714  tie = avi_get_ientry(&avist->indexes, avist->entry);
715  if (empty || tie->pos < ie->pos) {
716  ie = tie;
717  stream_id = i;
718  }
719  empty = 0;
720  }
721  if (!empty) {
722  avist = s->streams[stream_id]->priv_data;
723  if (*ie->tag)
724  ffio_wfourcc(pb, ie->tag);
725  else {
726  avi_stream2fourcc(tag, stream_id,
727  s->streams[stream_id]->codecpar->codec_type);
728  ffio_wfourcc(pb, tag);
729  }
730  avio_wl32(pb, ie->flags);
731  avio_wl32(pb, ie->pos);
732  avio_wl32(pb, ie->len);
733  avist->entry++;
734  }
735  } while (!empty);
736  ff_end_tag(pb, idx_chunk);
737 
739  }
740  return 0;
741 }
742 
743 static int write_skip_frames(AVFormatContext *s, int stream_index, int64_t dts)
744 {
745  AVIStream *avist = s->streams[stream_index]->priv_data;
746  AVCodecParameters *par = s->streams[stream_index]->codecpar;
747 
748  ff_dlog(s, "dts:%s packet_count:%d stream_index:%d\n", av_ts2str(dts), avist->packet_count, stream_index);
749  while (par->block_align == 0 && dts != AV_NOPTS_VALUE &&
750  dts > avist->packet_count && par->codec_id != AV_CODEC_ID_XSUB && avist->packet_count) {
751  AVPacket empty_packet;
752 
753  if (dts - avist->packet_count > 60000) {
754  av_log(s, AV_LOG_ERROR, "Too large number of skipped frames %"PRId64" > 60000\n", dts - avist->packet_count);
755  return AVERROR(EINVAL);
756  }
757 
758  av_init_packet(&empty_packet);
759  empty_packet.size = 0;
760  empty_packet.data = NULL;
761  empty_packet.stream_index = stream_index;
762  avi_write_packet_internal(s, &empty_packet);
763  ff_dlog(s, "dup dts:%s packet_count:%d\n", av_ts2str(dts), avist->packet_count);
764  }
765 
766  return 0;
767 }
768 
770 {
771  const int stream_index = pkt->stream_index;
772  AVCodecParameters *par = s->streams[stream_index]->codecpar;
773  int ret;
774 
775  if (par->codec_id == AV_CODEC_ID_H264 && par->codec_tag == MKTAG('H','2','6','4') && pkt->size) {
776  ret = ff_check_h264_startcode(s, s->streams[stream_index], pkt);
777  if (ret < 0)
778  return ret;
779  }
780 
781  if ((ret = write_skip_frames(s, stream_index, pkt->dts)) < 0)
782  return ret;
783 
784  if (!pkt->size)
785  return avi_write_packet_internal(s, pkt); /* Passthrough */
786 
787  if (par->codec_type == AVMEDIA_TYPE_VIDEO) {
788  AVIStream *avist = s->streams[stream_index]->priv_data;
789  AVIOContext *pb = s->pb;
790  AVPacket *opkt = pkt;
791  int reshuffle_ret;
792  if (par->codec_id == AV_CODEC_ID_RAWVIDEO && par->codec_tag == 0) {
793  int64_t bpc = par->bits_per_coded_sample != 15 ? par->bits_per_coded_sample : 16;
794  int expected_stride = ((par->width * bpc + 31) >> 5)*4;
795  reshuffle_ret = ff_reshuffle_raw_rgb(s, &pkt, par, expected_stride);
796  if (reshuffle_ret < 0)
797  return reshuffle_ret;
798  } else
799  reshuffle_ret = 0;
800  if (par->format == AV_PIX_FMT_PAL8) {
801  ret = ff_get_packet_palette(s, opkt, reshuffle_ret, avist->palette);
802  if (ret < 0)
803  goto fail;
804  if (ret) {
805  int pal_size = 1 << par->bits_per_coded_sample;
806  int pc_tag, i;
807 
809 
810  if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && avist->pal_offset) {
811  int64_t cur_offset = avio_tell(pb);
812  avio_seek(pb, avist->pal_offset, SEEK_SET);
813  for (i = 0; i < pal_size; i++) {
814  uint32_t v = avist->palette[i];
815  avio_wl32(pb, v & 0xffffff);
816  }
817  avio_seek(pb, cur_offset, SEEK_SET);
818  memcpy(avist->old_palette, avist->palette, pal_size * 4);
819  avist->pal_offset = 0;
820  }
821  if (memcmp(avist->palette, avist->old_palette, pal_size * 4)) {
822  unsigned char tag[5];
823  avi_stream2fourcc(tag, stream_index, par->codec_type);
824  tag[2] = 'p'; tag[3] = 'c';
825  if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) {
826  if (avist->strh_flags_offset) {
827  int64_t cur_offset = avio_tell(pb);
828  avio_seek(pb, avist->strh_flags_offset, SEEK_SET);
830  avio_seek(pb, cur_offset, SEEK_SET);
831  avist->strh_flags_offset = 0;
832  }
833  ret = avi_add_ientry(s, stream_index, tag, AVIIF_NO_TIME,
834  pal_size * 4 + 4);
835  if (ret < 0)
836  goto fail;
837  }
838  pc_tag = ff_start_tag(pb, tag);
839  avio_w8(pb, 0);
840  avio_w8(pb, pal_size & 0xFF);
841  avio_wl16(pb, 0); // reserved
842  for (i = 0; i < pal_size; i++) {
843  uint32_t v = avist->palette[i];
844  avio_wb32(pb, v<<8);
845  }
846  ff_end_tag(pb, pc_tag);
847  memcpy(avist->old_palette, avist->palette, pal_size * 4);
848  }
849  }
850  }
851  if (reshuffle_ret) {
853 
854 fail:
855  if (reshuffle_ret)
857  return ret;
858  }
859  }
860 
862 }
863 
865 {
866  unsigned char tag[5];
867  unsigned int flags = 0;
868  const int stream_index = pkt->stream_index;
869  int size = pkt->size;
870  AVIContext *avi = s->priv_data;
871  AVIOContext *pb = s->pb;
872  AVIStream *avist = s->streams[stream_index]->priv_data;
873  AVCodecParameters *par = s->streams[stream_index]->codecpar;
874 
875  if (pkt->dts != AV_NOPTS_VALUE)
876  avist->last_dts = pkt->dts + pkt->duration;
877 
878  avist->packet_count++;
879 
880  // Make sure to put an OpenDML chunk when the file size exceeds the limits
881  if ((pb->seekable & AVIO_SEEKABLE_NORMAL) &&
882  (avio_tell(pb) - avi->riff_start > AVI_MAX_RIFF_SIZE)) {
883  avi_write_ix(s);
884  ff_end_tag(pb, avi->movi_list);
885 
886  if (avi->riff_id == 1)
887  avi_write_idx1(s);
888 
889  ff_end_tag(pb, avi->riff_start);
890  avi->movi_list = avi_start_new_riff(s, pb, "AVIX", "movi");
891  }
892 
893  avi_stream2fourcc(tag, stream_index, par->codec_type);
894  if (pkt->flags & AV_PKT_FLAG_KEY)
895  flags = 0x10;
896  if (par->codec_type == AVMEDIA_TYPE_AUDIO)
897  avist->audio_strm_length += size;
898 
899  if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) {
900  int ret;
901  ret = avi_add_ientry(s, stream_index, NULL, flags, size);
902  if (ret < 0)
903  return ret;
904  }
905 
906  avio_write(pb, tag, 4);
907  avio_wl32(pb, size);
908  avio_write(pb, pkt->data, size);
909  if (size & 1)
910  avio_w8(pb, 0);
911 
912  return 0;
913 }
914 
916 {
917  AVIContext *avi = s->priv_data;
918  AVIOContext *pb = s->pb;
919  int res = 0;
920  int i, j, n, nb_frames;
921  int64_t file_size;
922 
923  for (i = 0; i < s->nb_streams; i++) {
924  AVIStream *avist = s->streams[i]->priv_data;
925  write_skip_frames(s, i, avist->last_dts);
926  }
927 
928  if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
929  if (avi->riff_id == 1) {
930  ff_end_tag(pb, avi->movi_list);
931  res = avi_write_idx1(s);
932  ff_end_tag(pb, avi->riff_start);
933  } else {
934  avi_write_ix(s);
935  ff_end_tag(pb, avi->movi_list);
936  ff_end_tag(pb, avi->riff_start);
937 
938  file_size = avio_tell(pb);
939  avio_seek(pb, avi->odml_list - 8, SEEK_SET);
940  ffio_wfourcc(pb, "LIST"); /* Making this AVI OpenDML one */
941  avio_skip(pb, 16);
942 
943  for (n = nb_frames = 0; n < s->nb_streams; n++) {
944  AVCodecParameters *par = s->streams[n]->codecpar;
945  AVIStream *avist = s->streams[n]->priv_data;
946 
947  if (par->codec_type == AVMEDIA_TYPE_VIDEO) {
948  if (nb_frames < avist->packet_count)
949  nb_frames = avist->packet_count;
950  } else {
951  if (par->codec_id == AV_CODEC_ID_MP2 ||
952  par->codec_id == AV_CODEC_ID_MP3)
953  nb_frames += avist->packet_count;
954  }
955  }
956  avio_wl32(pb, nb_frames);
957  avio_seek(pb, file_size, SEEK_SET);
958 
960  }
961  }
962 
963  if (avi->riff_id >= avi->master_index_max_size) {
964  int index_space = AVI_MASTER_INDEX_PREFIX_SIZE +
966  av_log(s, AV_LOG_WARNING, "Output file not strictly OpenDML compliant, "
967  "consider re-muxing with 'reserve_index_space' option value >= %d\n",
968  index_space);
969  }
970 
971  for (i = 0; i < s->nb_streams; i++) {
972  AVIStream *avist = s->streams[i]->priv_data;
973  for (j = 0; j < avist->indexes.ents_allocated / AVI_INDEX_CLUSTER_SIZE; j++)
974  av_freep(&avist->indexes.cluster[j]);
975  av_freep(&avist->indexes.cluster);
976  avist->indexes.ents_allocated = avist->indexes.entry = 0;
977  if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
978  avio_seek(pb, avist->frames_hdr_strm + 4, SEEK_SET);
979  avio_wl32(pb, avist->max_size);
980  }
981  }
982 
983  return res;
984 }
985 
986 #define OFFSET(x) offsetof(AVIContext, x)
987 #define ENC AV_OPT_FLAG_ENCODING_PARAM
988 static const AVOption options[] = {
989  { "reserve_index_space", "reserve space (in bytes) at the beginning of the file for each stream index", OFFSET(reserve_index_space), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, ENC },
990  { "write_channel_mask", "write channel mask into wave format header", OFFSET(write_channel_mask), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, ENC },
991  { NULL },
992 };
993 
994 static const AVClass avi_muxer_class = {
995  .class_name = "AVI muxer",
996  .item_name = av_default_item_name,
997  .option = options,
998  .version = LIBAVUTIL_VERSION_INT,
999 };
1000 
1002  .name = "avi",
1003  .long_name = NULL_IF_CONFIG_SMALL("AVI (Audio Video Interleaved)"),
1004  .mime_type = "video/x-msvideo",
1005  .extensions = "avi",
1006  .priv_data_size = sizeof(AVIContext),
1007  .audio_codec = CONFIG_LIBMP3LAME ? AV_CODEC_ID_MP3 : AV_CODEC_ID_AC3,
1008  .video_codec = AV_CODEC_ID_MPEG4,
1009  .init = avi_init,
1013  .codec_tag = (const AVCodecTag * const []) {
1015  },
1016  .priv_class = &avi_muxer_class,
1017 };
AVIStream::strh_flags_offset
int64_t strh_flags_offset
Definition: avienc.c:90
options
static const AVOption options[]
Definition: avienc.c:988
AV_LANG_ISO639_1
@ AV_LANG_ISO639_1
3-char terminological language codes as per ISO-IEC 639-2
Definition: avlanguage.h:33
avi_stream2fourcc
static char * avi_stream2fourcc(char *tag, int index, enum AVMediaType type)
Definition: avienc.c:179
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
AVIIentry::len
unsigned int len
Definition: avienc.c:51
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
AV_CODEC_ID_AC3
@ AV_CODEC_ID_AC3
Definition: avcodec.h:567
init
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
AVOutputFormat::name
const char * name
Definition: avformat.h:496
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: avcodec.h:3953
mpegts.h
ffio_wfourcc
static av_always_inline void ffio_wfourcc(AVIOContext *pb, const uint8_t *s)
Definition: avio_internal.h:58
AVCodecParameters
This struct describes the properties of an encoded stream.
Definition: avcodec.h:3949
n
int n
Definition: avisynth_c.h:760
avi_start_new_riff
static int64_t avi_start_new_riff(AVFormatContext *s, AVIOContext *pb, const char *riff_tag, const char *list_tag)
Definition: avienc.c:158
AVI_MASTER_INDEX_SIZE_DEFAULT
#define AVI_MASTER_INDEX_SIZE_DEFAULT
Definition: avienc.c:57
AVStream::priv_data
void * priv_data
Definition: avformat.h:885
MKTAG
#define MKTAG(a, b, c, d)
Definition: common.h:366
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:260
av_asprintf
char * av_asprintf(const char *fmt,...)
Definition: avstring.c:113
AVIStream
Definition: avidec.c:42
avlanguage.h
avi_get_ientry
static AVIIentry * avi_get_ientry(const AVIIndex *idx, int ent_id)
Definition: avienc.c:99
AV_CODEC_ID_RAWVIDEO
@ AV_CODEC_ID_RAWVIDEO
Definition: avcodec.h:231
AV_CODEC_ID_MPEG4
@ AV_CODEC_ID_MPEG4
Definition: avcodec.h:230
pixdesc.h
AVPacket::data
uint8_t * data
Definition: avcodec.h:1477
AVOption
AVOption.
Definition: opt.h:246
ff_codec_wav_tags
const AVCodecTag ff_codec_wav_tags[]
Definition: riff.c:499
avio_wl64
void avio_wl64(AVIOContext *s, uint64_t val)
Definition: aviobuf.c:457
AVPacket::duration
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition: avcodec.h:1495
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: avcodec.h:3961
avi_write_counters
static int avi_write_counters(AVFormatContext *s, int riff_id)
Definition: avienc.c:198
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: avcodec.h:1509
av_packet_free
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
Definition: avpacket.c:62
AVIIndex::audio_strm_offset
int64_t audio_strm_offset
Definition: avienc.c:61
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
AVIStream::palette
uint32_t palette[AVPALETTE_COUNT]
Definition: avienc.c:92
avio_wl16
void avio_wl16(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:469
avi_muxer_class
static const AVClass avi_muxer_class
Definition: avienc.c:994
AVIIndex::indx_start
int64_t indx_start
Definition: avienc.c:60
fail
#define fail()
Definition: checkasm.h:120
AVIContext::frames_hdr_all
int64_t frames_hdr_all
Definition: avienc.c:71
avio_tell
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:557
AVIStream::entry
int entry
Definition: avienc.c:82
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
avi_add_ientry
static int avi_add_ientry(AVFormatContext *s, int stream_index, char *tag, unsigned int flags, unsigned int size)
Definition: avienc.c:106
AV_CODEC_ID_MP3
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
Definition: avcodec.h:565
AVStream::duration
int64_t duration
Decoding: duration of the stream, in stream time base.
Definition: avformat.h:919
avi_write_trailer
static int avi_write_trailer(AVFormatContext *s)
Definition: avienc.c:915
av_reduce
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
Definition: rational.c:35
AVRational::num
int num
Numerator.
Definition: rational.h:59
raw.h
ff_start_tag
int64_t ff_start_tag(AVIOContext *pb, const char *tag)
Definition: riffenc.c:31
avassert.h
AVIStream::last_dts
int64_t last_dts
Definition: avienc.c:86
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
av_cold
#define av_cold
Definition: attributes.h:84
AVCodecTag
Definition: internal.h:44
AVIStream::old_palette
uint32_t old_palette[AVPALETTE_COUNT]
Definition: avienc.c:93
av_dict_get
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
Definition: dict.c:40
AVIContext::odml_list
int64_t odml_list
Definition: avienc.c:70
AVIContext
Definition: avidec.c:69
avi_write_header
static int avi_write_header(AVFormatContext *s)
Definition: avienc.c:259
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:257
avi_write_packet
static int avi_write_packet(AVFormatContext *s, AVPacket *pkt)
Definition: avienc.c:769
AVIContext::movi_list
int64_t movi_list
Definition: avidec.c:75
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
AVCodecParameters::width
int width
Video only.
Definition: avcodec.h:4023
AV_CODEC_ID_MP2
@ AV_CODEC_ID_MP2
Definition: avcodec.h:564
avi_init
static av_cold int avi_init(struct AVFormatContext *s)
Definition: avienc.c:143
AVI_MASTER_INDEX_PREFIX_SIZE
#define AVI_MASTER_INDEX_PREFIX_SIZE
Definition: avienc.c:55
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:197
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
pix_fmt
static enum AVPixelFormat pix_fmt
Definition: demuxing_decoding.c:40
AVMEDIA_TYPE_DATA
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
Definition: avutil.h:203
AVIIF_NO_TIME
#define AVIIF_NO_TIME
Definition: avi.h:39
AV_CODEC_ID_H264
@ AV_CODEC_ID_H264
Definition: avcodec.h:245
avi_write_idx1
static int avi_write_idx1(AVFormatContext *s)
Definition: avienc.c:688
avpriv_find_pix_fmt
enum AVPixelFormat avpriv_find_pix_fmt(const PixelFormatTag *tags, unsigned int fourcc)
Definition: utils.c:477
fields
the definition of that something depends on the semantic of the filter The callback must examine the status of the filter s links and proceed accordingly The status of output links is stored in the status_in and status_out fields and tested by the then the processing requires a frame on this link and the filter is expected to make efforts in that direction The status of input links is stored by the fifo and status_out fields
Definition: filter_design.txt:155
if
if(ret)
Definition: filter_design.txt:179
AVIContext::write_channel_mask
int write_channel_mask
Definition: avienc.c:75
ff_avi_muxer
AVOutputFormat ff_avi_muxer
Definition: avienc.c:1001
AVFormatContext
Format I/O context.
Definition: avformat.h:1342
av_realloc_f
#define av_realloc_f(p, o, n)
Definition: tableprint_vlc.h:33
internal.h
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
AVISF_VIDEO_PALCHANGES
#define AVISF_VIDEO_PALCHANGES
Definition: avi.h:35
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:67
AVStream::time_base
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition: avformat.h:899
NULL
#define NULL
Definition: coverity.c:32
ff_put_wav_header
int ff_put_wav_header(AVFormatContext *s, AVIOContext *pb, AVCodecParameters *par, int flags)
Write WAVEFORMAT header structure.
Definition: riffenc.c:54
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:62
update_odml_entry
static void update_odml_entry(AVFormatContext *s, int stream_index, int64_t ix, int size)
Definition: avienc.c:597
write_trailer
static int write_trailer(AVFormatContext *s1)
Definition: v4l2enc.c:94
AVI_MAX_RIFF_SIZE
#define AVI_MAX_RIFF_SIZE
Definition: avi.h:31
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:191
AVI_MAX_STREAM_COUNT
#define AVI_MAX_STREAM_COUNT
Definition: avi.h:32
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:934
AVIStream::packet_count
int packet_count
Definition: avienc.c:81
AVIStream::pal_offset
int64_t pal_offset
Definition: avienc.c:94
ff_reshuffle_raw_rgb
int ff_reshuffle_raw_rgb(AVFormatContext *s, AVPacket **ppkt, AVCodecParameters *par, int expected_stride)
Reshuffles the lines to use the user specified stride.
Definition: rawutils.c:25
avio_w8
void avio_w8(AVIOContext *s, int b)
Definition: aviobuf.c:196
index
int index
Definition: gxfenc.c:89
AVPALETTE_COUNT
#define AVPALETTE_COUNT
Definition: pixfmt.h:33
OFFSET
#define OFFSET(x)
Definition: avienc.c:986
avi.h
ff_dlog
#define ff_dlog(a,...)
Definition: tableprint_vlc.h:29
AVIOContext
Bytestream IO Context.
Definition: avio.h:161
AVMediaType
AVMediaType
Definition: avutil.h:199
AVPacket::size
int size
Definition: avcodec.h:1478
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:188
id
enum AVCodecID id
Definition: extract_extradata_bsf.c:329
ff_riff_write_info_tag
void ff_riff_write_info_tag(AVIOContext *pb, const char *tag, const char *str)
Write a single RIFF info tag.
Definition: riffenc.c:295
AVIOContext::seekable
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
Definition: avio.h:260
ff_convert_lang_to
const char * ff_convert_lang_to(const char *lang, enum AVLangCodespace target_codespace)
Convert a language code to a target codespace.
Definition: avlanguage.c:736
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
AVIIndex::cluster
AVIIentry ** cluster
Definition: avienc.c:65
size
int size
Definition: twinvq_data.h:11134
video_st
AVStream * video_st
Definition: movenc.c:59
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
avpriv_report_missing_feature
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
FF_PUT_WAV_HEADER_SKIP_CHANNELMASK
#define FF_PUT_WAV_HEADER_SKIP_CHANNELMASK
Tell ff_put_wav_header() to write an empty channel mask.
Definition: riff.h:59
AVStream::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
Definition: avformat.h:932
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
avio_wb32
void avio_wb32(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:377
FFMIN
#define FFMIN(a, b)
Definition: common.h:96
avio_wl32
void avio_wl32(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:369
AV_FIELD_TT
@ AV_FIELD_TT
Definition: avcodec.h:1546
ENC
#define ENC
Definition: avienc.c:987
AVIIentry::pos
unsigned int pos
Definition: avienc.c:50
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: avcodec.h:1483
bitrate
int64_t bitrate
Definition: h264_levels.c:131
ff_end_tag
void ff_end_tag(AVIOContext *pb, int64_t start)
Definition: riffenc.c:38
write_packet
static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int unqueue)
Definition: ffmpeg.c:690
avi_write_packet_internal
static int avi_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
Definition: avienc.c:864
AV_PIX_FMT_RGB555LE
@ AV_PIX_FMT_RGB555LE
packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined
Definition: pixfmt.h:108
AVOutputFormat
Definition: avformat.h:495
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
AVIStream::max_size
int max_size
Definition: avienc.c:83
avio_internal.h
AVI_MASTER_INDEX_ENTRY_SIZE
#define AVI_MASTER_INDEX_ENTRY_SIZE
Definition: avienc.c:56
internal.h
AVIF_TRUSTCKTYPE
#define AVIF_TRUSTCKTYPE
Definition: avi.h:27
AVCodecParameters::height
int height
Definition: avcodec.h:4024
AV_TIME_BASE
#define AV_TIME_BASE
Internal time base represented as integer.
Definition: avutil.h:254
AVCodecParameters::block_align
int block_align
Audio only.
Definition: avcodec.h:4074
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:53
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:236
AVI_INDEX_CLUSTER_SIZE
#define AVI_INDEX_CLUSTER_SIZE
Definition: avienc.c:54
AVCodecParameters::field_order
enum AVFieldOrder field_order
Video only.
Definition: avcodec.h:4038
ff_check_h264_startcode
int ff_check_h264_startcode(AVFormatContext *s, const AVStream *st, const AVPacket *pkt)
Check presence of H264 startcode.
Definition: mpegtsenc.c:1438
AV_CODEC_ID_XSUB
@ AV_CODEC_ID_XSUB
Definition: avcodec.h:661
AV_PIX_FMT_PAL8
@ AV_PIX_FMT_PAL8
8 bits with AV_PIX_FMT_RGB32 palette
Definition: pixfmt.h:77
tag
uint32_t tag
Definition: movenc.c:1496
ret
ret
Definition: filter_design.txt:187
ff_get_packet_palette
int ff_get_packet_palette(AVFormatContext *s, AVPacket *pkt, int ret, uint32_t *palette)
Retrieves the palette from a packet, either from side data, or appended to the video data in the pack...
Definition: utils.c:5703
AVStream
Stream structure.
Definition: avformat.h:870
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:246
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:72
AVIContext::riff_id
int riff_id
Definition: avienc.c:72
ff_parse_specific_params
void ff_parse_specific_params(AVStream *st, int *au_rate, int *au_ssize, int *au_scale)
Definition: riffenc.c:265
avformat.h
AVIStream::sample_requested
int sample_requested
Definition: avienc.c:84
dict.h
write_odml_master
static void write_odml_master(AVFormatContext *s, int stream_index)
Definition: avienc.c:231
AVIContext::reserve_index_space
int reserve_index_space
Definition: avienc.c:73
AVIIndex::master_odml_riff_id_base
int master_odml_riff_id_base
Definition: avienc.c:64
ff_put_bmp_header
void ff_put_bmp_header(AVIOContext *pb, AVCodecParameters *par, int for_asf, int ignore_extradata)
Definition: riffenc.c:209
av_get_media_type_string
const char * av_get_media_type_string(enum AVMediaType media_type)
Return a string describing the media_type enum, NULL if media_type is unknown.
Definition: utils.c:76
ff_codec_bmp_tags
const AVCodecTag ff_codec_bmp_tags[]
Definition: riff.c:32
pkt
static AVPacket pkt
Definition: demuxing_decoding.c:54
AVIO_SEEKABLE_NORMAL
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
Definition: avio.h:40
AVRational::den
int den
Denominator.
Definition: rational.h:60
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:65
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:223
avpriv_pix_fmt_bps_avi
const PixelFormatTag avpriv_pix_fmt_bps_avi[]
Definition: raw.c:315
ff_riff_write_info
void ff_riff_write_info(AVFormatContext *s)
Write all recognized RIFF tags from s->metadata.
Definition: riffenc.c:327
AVIIentry
Definition: avienc.c:47
av_mul_q
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
Definition: rational.c:80
AVPacket::stream_index
int stream_index
Definition: avcodec.h:1479
avio_skip
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:331
AVIF_HASINDEX
#define AVIF_HASINDEX
Definition: avi.h:24
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
avutil.h
AVCodecParameters::bits_per_coded_sample
int bits_per_coded_sample
The number of bits per sample in the codedwords.
Definition: avcodec.h:3999
avpriv_request_sample
#define avpriv_request_sample(...)
Definition: tableprint_vlc.h:39
AVCodecParameters::format
int format
Definition: avcodec.h:3981
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
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: avcodec.h:3957
AVPacket
This structure stores compressed data.
Definition: avcodec.h:1454
AVIF_ISINTERLEAVED
#define AVIF_ISINTERLEAVED
Definition: avi.h:26
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
AV_FIELD_TB
@ AV_FIELD_TB
Definition: avcodec.h:1548
AVIStream::frames_hdr_strm
int64_t frames_hdr_strm
Definition: avienc.c:79
AV_FIELD_BB
@ AV_FIELD_BB
Definition: avcodec.h:1547
timestamp.h
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:565
AVCodecParameters::bit_rate
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
Definition: avcodec.h:3986
AVIIndex::entry
int entry
Definition: avienc.c:62
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
AVIIndex
Definition: avienc.c:59
av_ts2str
#define av_ts2str(ts)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: timestamp.h:54
AVIStream::indexes
AVIIndex indexes
Definition: avienc.c:88
AVDictionaryEntry::value
char * value
Definition: dict.h:83
avstring.h
write_header
static void write_header(FFV1Context *f)
Definition: ffv1enc.c:337
AVIStream::audio_strm_length
int64_t audio_strm_length
Definition: avienc.c:80
AVIIentry::tag
char tag[4]
Definition: avienc.c:48
AV_FIELD_BT
@ AV_FIELD_BT
Definition: avcodec.h:1549
AVIContext::riff_start
int64_t riff_start
Definition: avienc.c:70
write_skip_frames
static int write_skip_frames(AVFormatContext *s, int stream_index, int64_t dts)
Definition: avienc.c:743
AVIIentry::flags
unsigned int flags
Definition: avienc.c:49
av_x_if_null
static void * av_x_if_null(const void *p, const void *x)
Return x default pointer in case p is NULL.
Definition: avutil.h:308
av_get_pix_fmt_name
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition: pixdesc.c:2438
AVIContext::master_index_max_size
int master_index_max_size
Definition: avienc.c:74
AVIIndex::ents_allocated
int ents_allocated
Definition: avienc.c:63
av_init_packet
void av_init_packet(AVPacket *pkt)
Initialize optional fields of a packet with default values.
Definition: avpacket.c:33
avi_write_ix
static int avi_write_ix(AVFormatContext *s)
Definition: avienc.c:630