FFmpeg
mux.c
Go to the documentation of this file.
1 /*
2  * muxing functions for use within FFmpeg
3  * Copyright (c) 2000, 2001, 2002 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 "avformat.h"
23 #include "avformat_internal.h"
24 #include "internal.h"
25 #include "mux.h"
26 #include "version.h"
27 #include "libavcodec/bsf.h"
28 #include "libavcodec/codec_desc.h"
29 #include "libavcodec/internal.h"
31 #include "libavutil/mem.h"
32 #include "libavutil/opt.h"
33 #include "libavutil/dict.h"
34 #include "libavutil/timestamp.h"
35 #include "libavutil/avassert.h"
36 #include "libavutil/frame.h"
37 #include "libavutil/internal.h"
38 #include "libavutil/mathematics.h"
39 
40 /**
41  * @file
42  * muxing functions for use within libavformat
43  */
44 
45 /* fraction handling */
46 
47 /**
48  * f = val + (num / den) + 0.5.
49  *
50  * 'num' is normalized so that it is such as 0 <= num < den.
51  *
52  * @param f fractional number
53  * @param val integer value
54  * @param num must be >= 0
55  * @param den must be >= 1
56  */
57 static void frac_init(FFFrac *f, int64_t val, int64_t num, int64_t den)
58 {
59  num += (den >> 1);
60  if (num >= den) {
61  val += num / den;
62  num = num % den;
63  }
64  f->val = val;
65  f->num = num;
66  f->den = den;
67 }
68 
69 /**
70  * Fractional addition to f: f = f + (incr / f->den).
71  *
72  * @param f fractional number
73  * @param incr increment, can be positive or negative
74  */
75 static void frac_add(FFFrac *f, int64_t incr)
76 {
77  int64_t num, den;
78 
79  num = f->num + incr;
80  den = f->den;
81  if (num < 0) {
82  f->val += num / den;
83  num = num % den;
84  if (num < 0) {
85  num += den;
86  f->val--;
87  }
88  } else if (num >= den) {
89  f->val += num / den;
90  num = num % den;
91  }
92  f->num = num;
93 }
94 
96  const char *format, const char *filename)
97 {
99  int ret = 0;
100 
101  *avctx = NULL;
102  if (!s)
103  goto nomem;
104 
105  if (!oformat) {
106  if (format) {
107  oformat = av_guess_format(format, NULL, NULL);
108  if (!oformat) {
109  av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not known.\n", format);
110  ret = AVERROR(EINVAL);
111  goto error;
112  }
113  } else {
114  oformat = av_guess_format(NULL, filename, NULL);
115  if (!oformat) {
116  ret = AVERROR(EINVAL);
118  "Unable to choose an output format for '%s'; "
119  "use a standard extension for the filename or specify "
120  "the format manually.\n", filename);
121  goto error;
122  }
123  }
124  }
125 
126  s->oformat = oformat;
127  if (ffofmt(s->oformat)->priv_data_size > 0) {
128  s->priv_data = av_mallocz(ffofmt(s->oformat)->priv_data_size);
129  if (!s->priv_data)
130  goto nomem;
131  if (s->oformat->priv_class) {
132  *(const AVClass**)s->priv_data= s->oformat->priv_class;
133  av_opt_set_defaults(s->priv_data);
134  }
135  } else
136  s->priv_data = NULL;
137 
138  if (filename) {
139  if (!(s->url = av_strdup(filename)))
140  goto nomem;
141 
142  }
143  *avctx = s;
144  return 0;
145 nomem:
146  av_log(s, AV_LOG_ERROR, "Out of memory\n");
147  ret = AVERROR(ENOMEM);
148 error:
150  return ret;
151 }
152 
153 static int validate_codec_tag(const AVFormatContext *s, const AVStream *st)
154 {
155  const AVCodecTag *avctag;
156  enum AVCodecID id = AV_CODEC_ID_NONE;
157  unsigned uppercase_tag = ff_toupper4(st->codecpar->codec_tag);
158  int64_t tag = -1;
159 
160  /**
161  * Check that tag + id is in the table
162  * If neither is in the table -> OK
163  * If tag is in the table with another id -> FAIL
164  * If id is in the table with another tag -> FAIL unless strict < normal
165  */
166  for (int n = 0; s->oformat->codec_tag[n]; n++) {
167  avctag = s->oformat->codec_tag[n];
168  while (avctag->id != AV_CODEC_ID_NONE) {
169  if (ff_toupper4(avctag->tag) == uppercase_tag) {
170  id = avctag->id;
171  if (id == st->codecpar->codec_id)
172  return 1;
173  }
174  if (avctag->id == st->codecpar->codec_id)
175  tag = avctag->tag;
176  avctag++;
177  }
178  }
179  if (id != AV_CODEC_ID_NONE)
180  return 0;
181  if (tag >= 0 && (s->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
182  return 0;
183  return 1;
184 }
185 
186 
188 {
189  FormatContextInternal *const fci = ff_fc_internal(s);
190  AVDictionary *tmp = NULL;
191  const FFOutputFormat *of = ffofmt(s->oformat);
193  static const unsigned default_codec_offsets[] = {
194  [AVMEDIA_TYPE_VIDEO] = offsetof(AVOutputFormat, video_codec),
195  [AVMEDIA_TYPE_AUDIO] = offsetof(AVOutputFormat, audio_codec),
196  [AVMEDIA_TYPE_SUBTITLE] = offsetof(AVOutputFormat, subtitle_codec),
197  };
198  unsigned nb_type[FF_ARRAY_ELEMS(default_codec_offsets)] = { 0 };
199  int ret = 0;
200 
201  if (options)
202  av_dict_copy(&tmp, *options, 0);
203 
204  if ((ret = av_opt_set_dict(s, &tmp)) < 0)
205  goto fail;
206  if (s->priv_data && s->oformat->priv_class && *(const AVClass**)s->priv_data==s->oformat->priv_class &&
207  (ret = av_opt_set_dict2(s->priv_data, &tmp, AV_OPT_SEARCH_CHILDREN)) < 0)
208  goto fail;
209 
210  if (!s->url && !(s->url = av_strdup(""))) {
211  ret = AVERROR(ENOMEM);
212  goto fail;
213  }
214 
215  // some sanity checks
216  if (s->nb_streams == 0 && !(of->p.flags & AVFMT_NOSTREAMS)) {
217  av_log(s, AV_LOG_ERROR, "No streams to mux were specified\n");
218  ret = AVERROR(EINVAL);
219  goto fail;
220  }
221 
222  for (unsigned i = 0; i < s->nb_streams; i++) {
223  AVStream *const st = s->streams[i];
224  FFStream *const sti = ffstream(st);
225  AVCodecParameters *const par = st->codecpar;
226  const AVCodecDescriptor *desc;
227 
228  if (!st->time_base.num) {
229  /* fall back on the default timebase values */
230  if (par->codec_type == AVMEDIA_TYPE_AUDIO && par->sample_rate)
231  avpriv_set_pts_info(st, 64, 1, par->sample_rate);
232  else
233  avpriv_set_pts_info(st, 33, 1, 90000);
234  }
235 
236  switch (par->codec_type) {
237  case AVMEDIA_TYPE_AUDIO:
238  if (par->sample_rate <= 0) {
239  av_log(s, AV_LOG_ERROR, "sample rate not set\n");
240  ret = AVERROR(EINVAL);
241  goto fail;
242  }
243 
244  if (!par->block_align)
245  par->block_align = par->ch_layout.nb_channels *
246  av_get_bits_per_sample(par->codec_id) >> 3;
247  break;
248  case AVMEDIA_TYPE_VIDEO:
249  if ((par->width <= 0 || par->height <= 0) &&
250  !(of->p.flags & AVFMT_NODIMENSIONS)) {
251  av_log(s, AV_LOG_ERROR, "dimensions not set\n");
252  ret = AVERROR(EINVAL);
253  goto fail;
254  }
257  ) {
258  if (st->sample_aspect_ratio.num != 0 &&
259  st->sample_aspect_ratio.den != 0 &&
260  par->sample_aspect_ratio.num != 0 &&
261  par->sample_aspect_ratio.den != 0) {
262  av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between muxer "
263  "(%d/%d) and encoder layer (%d/%d)\n",
266  par->sample_aspect_ratio.den);
267  ret = AVERROR(EINVAL);
268  goto fail;
269  }
270  }
271  break;
272  }
274  enum AVCodecID default_codec_id = AV_CODEC_ID_NONE;
275  unsigned nb;
276  if ((unsigned)par->codec_type < FF_ARRAY_ELEMS(default_codec_offsets)) {
277  nb = ++nb_type[par->codec_type];
278  if (default_codec_offsets[par->codec_type])
279  default_codec_id = *(const enum AVCodecID*)((const char*)of + default_codec_offsets[par->codec_type]);
280  }
282  default_codec_id != AV_CODEC_ID_NONE && par->codec_id != default_codec_id) {
283  av_log(s, AV_LOG_ERROR, "%s muxer supports only codec %s for type %s\n",
284  of->p.name, avcodec_get_name(default_codec_id), av_get_media_type_string(par->codec_type));
285  ret = AVERROR(EINVAL);
286  goto fail;
287  } else if (default_codec_id == AV_CODEC_ID_NONE ||
288  (of->flags_internal & FF_OFMT_FLAG_MAX_ONE_OF_EACH && nb > 1)) {
289  const char *type = av_get_media_type_string(par->codec_type);
290  av_log(s, AV_LOG_ERROR, "%s muxer does not support %s stream of type %s\n",
291  of->p.name, default_codec_id == AV_CODEC_ID_NONE ? "any" : "more than one",
292  type ? type : "unknown");
293  ret = AVERROR(EINVAL);
294  goto fail;
295  }
296  }
297 
298 #if FF_API_AVSTREAM_SIDE_DATA
300  /* if the caller is using the deprecated AVStream side_data API,
301  * copy its contents to AVStream.codecpar, giving it priority
302  over existing side data in the latter */
303  for (int i = 0; i < st->nb_side_data; i++) {
304  const AVPacketSideData *sd_src = &st->side_data[i];
305  AVPacketSideData *sd_dst;
306 
309  sd_src->type, sd_src->size, 0);
310  if (!sd_dst) {
311  ret = AVERROR(ENOMEM);
312  goto fail;
313  }
314  memcpy(sd_dst->data, sd_src->data, sd_src->size);
315  }
317 #endif
318 
320  if (desc && desc->props & AV_CODEC_PROP_REORDER)
321  sti->reorder = 1;
322 
324 
325  if (of->p.codec_tag) {
326  if ( par->codec_tag
327  && par->codec_id == AV_CODEC_ID_RAWVIDEO
328  && ( av_codec_get_tag(of->p.codec_tag, par->codec_id) == 0
329  || av_codec_get_tag(of->p.codec_tag, par->codec_id) == MKTAG('r', 'a', 'w', ' '))
330  && !validate_codec_tag(s, st)) {
331  // the current rawvideo encoding system ends up setting
332  // the wrong codec_tag for avi/mov, we override it here
333  par->codec_tag = 0;
334  }
335  if (par->codec_tag) {
336  if (!validate_codec_tag(s, st)) {
337  const uint32_t otag = av_codec_get_tag(s->oformat->codec_tag, par->codec_id);
339  "Tag %s incompatible with output codec id '%d' (%s)\n",
340  av_fourcc2str(par->codec_tag), par->codec_id, av_fourcc2str(otag));
342  goto fail;
343  }
344  } else
345  par->codec_tag = av_codec_get_tag(of->p.codec_tag, par->codec_id);
346  }
347 
348  if (par->codec_type != AVMEDIA_TYPE_ATTACHMENT &&
350  fci->nb_interleaved_streams++;
351  }
353  if (!fci->interleave_packet)
354  fci->interleave_packet = fci->nb_interleaved_streams > 1 ?
357 
358  if (!s->priv_data && of->priv_data_size > 0) {
359  s->priv_data = av_mallocz(of->priv_data_size);
360  if (!s->priv_data) {
361  ret = AVERROR(ENOMEM);
362  goto fail;
363  }
364  if (of->p.priv_class) {
365  *(const AVClass **)s->priv_data = of->p.priv_class;
366  av_opt_set_defaults(s->priv_data);
367  if ((ret = av_opt_set_dict2(s->priv_data, &tmp, AV_OPT_SEARCH_CHILDREN)) < 0)
368  goto fail;
369  }
370  }
371 
372  /* set muxer identification string */
373  if (!(s->flags & AVFMT_FLAG_BITEXACT)) {
374  av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
375  } else {
376  av_dict_set(&s->metadata, "encoder", NULL, 0);
377  }
378 
379  for (e = NULL; e = av_dict_get(s->metadata, "encoder-", e, AV_DICT_IGNORE_SUFFIX); ) {
380  av_dict_set(&s->metadata, e->key, NULL, 0);
381  }
382 
383  if (options) {
385  *options = tmp;
386  }
387 
388  if (of->init) {
389  if ((ret = of->init(s)) < 0) {
390  if (of->deinit)
391  of->deinit(s);
392  return ret;
393  }
394  return ret == 0;
395  }
396 
397  return 0;
398 
399 fail:
400  av_dict_free(&tmp);
401  return ret;
402 }
403 
405 {
406  FFFormatContext *const si = ffformatcontext(s);
407 
408  /* init PTS generation */
409  for (unsigned i = 0; i < s->nb_streams; i++) {
410  AVStream *const st = s->streams[i];
411  FFStream *const sti = ffstream(st);
412  int64_t den = AV_NOPTS_VALUE;
413 
414  switch (st->codecpar->codec_type) {
415  case AVMEDIA_TYPE_AUDIO:
416  den = (int64_t)st->time_base.num * st->codecpar->sample_rate;
417  break;
418  case AVMEDIA_TYPE_VIDEO:
419  den = (int64_t)st->time_base.num * st->time_base.den;
420  break;
421  default:
422  break;
423  }
424 
425  if (den != AV_NOPTS_VALUE) {
426  if (den <= 0)
427  return AVERROR_INVALIDDATA;
428 
429  frac_init(&sti->priv_pts, 0, 0, den);
430  }
431  }
432 
433  si->avoid_negative_ts_status = AVOID_NEGATIVE_TS_UNKNOWN;
434  if (s->avoid_negative_ts < 0) {
435  av_assert2(s->avoid_negative_ts == AVFMT_AVOID_NEG_TS_AUTO);
436  if (s->oformat->flags & (AVFMT_TS_NEGATIVE | AVFMT_NOTIMESTAMPS)) {
437  s->avoid_negative_ts = AVFMT_AVOID_NEG_TS_DISABLED;
438  si->avoid_negative_ts_status = AVOID_NEGATIVE_TS_DISABLED;
439  } else
440  s->avoid_negative_ts = AVFMT_AVOID_NEG_TS_MAKE_NON_NEGATIVE;
441  } else if (s->avoid_negative_ts == AVFMT_AVOID_NEG_TS_DISABLED)
442  si->avoid_negative_ts_status = AVOID_NEGATIVE_TS_DISABLED;
443 
444  return 0;
445 }
446 
448 {
449  if (s->pb && s->pb->error >= 0) {
450  if (s->flush_packets == 1 || s->flags & AVFMT_FLAG_FLUSH_PACKETS)
451  avio_flush(s->pb);
452  else if (s->flush_packets && !(s->oformat->flags & AVFMT_NOFILE))
454  }
455 }
456 
458 {
459  FormatContextInternal *const fci = ff_fc_internal(s);
460  const FFOutputFormat *const of = ffofmt(s->oformat);
461  if (of && of->deinit && fci->initialized)
462  of->deinit(s);
463  fci->initialized =
464  fci->streams_initialized = 0;
465 }
466 
468 {
469  FormatContextInternal *const fci = ff_fc_internal(s);
470  int ret = 0;
471 
472  if ((ret = init_muxer(s, options)) < 0)
473  return ret;
474 
475  fci->initialized = 1;
476  fci->streams_initialized = ret;
477 
478  if (ffofmt(s->oformat)->init && ret) {
479  if ((ret = init_pts(s)) < 0)
480  return ret;
481 
483  }
484 
486 }
487 
489 {
490  FormatContextInternal *const fci = ff_fc_internal(s);
491  int already_initialized = fci->initialized;
492  int streams_already_initialized = fci->streams_initialized;
493  int ret = 0;
494 
495  if (!already_initialized)
496  if ((ret = avformat_init_output(s, options)) < 0)
497  return ret;
498 
499  if (ffofmt(s->oformat)->write_header) {
500  if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
502  ret = ffofmt(s->oformat)->write_header(s);
503  if (ret >= 0 && s->pb && s->pb->error < 0)
504  ret = s->pb->error;
505  if (ret < 0)
506  goto fail;
508  }
509  if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
511 
512  if (!fci->streams_initialized) {
513  if ((ret = init_pts(s)) < 0)
514  goto fail;
515  }
516 
517  return streams_already_initialized;
518 
519 fail:
520  deinit_muxer(s);
521  return ret;
522 }
523 
524 #define AV_PKT_FLAG_UNCODED_FRAME 0x2000
525 
526 
527 #if FF_API_COMPUTE_PKT_FIELDS2
529 //FIXME merge with compute_pkt_fields
531 {
532  FormatContextInternal *const fci = ff_fc_internal(s);
533  FFStream *const sti = ffstream(st);
534  int delay = st->codecpar->video_delay;
535  int frame_size;
536 
537  if (!fci->missing_ts_warning &&
538  !(s->oformat->flags & AVFMT_NOTIMESTAMPS) &&
540  (pkt->pts == AV_NOPTS_VALUE || pkt->dts == AV_NOPTS_VALUE)) {
542  "Timestamps are unset in a packet for stream %d. "
543  "This is deprecated and will stop working in the future. "
544  "Fix your code to set the timestamps properly\n", st->index);
545  fci->missing_ts_warning = 1;
546  }
547 
548  if (s->debug & FF_FDEBUG_TS)
549  av_log(s, AV_LOG_DEBUG, "compute_muxer_pkt_fields: pts:%s dts:%s cur_dts:%s b:%d size:%d st:%d\n",
551 
552  if (pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay == 0)
553  pkt->pts = pkt->dts;
554 
555  //XXX/FIXME this is a temporary hack until all encoders output pts
556  if ((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay) {
557  static int warned;
558  if (!warned) {
559  av_log(s, AV_LOG_WARNING, "Encoder did not produce proper pts, making some up.\n");
560  warned = 1;
561  }
562  pkt->dts =
563 // pkt->pts= st->cur_dts;
564  pkt->pts = sti->priv_pts.val;
565  }
566 
567  //calculate dts from pts
568  if (pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
569  sti->pts_buffer[0] = pkt->pts;
570  for (int i = 1; i < delay + 1 && sti->pts_buffer[i] == AV_NOPTS_VALUE; i++)
571  sti->pts_buffer[i] = pkt->pts + (i - delay - 1) * pkt->duration;
572  for (int i = 0; i<delay && sti->pts_buffer[i] > sti->pts_buffer[i + 1]; i++)
573  FFSWAP(int64_t, sti->pts_buffer[i], sti->pts_buffer[i + 1]);
574 
575  pkt->dts = sti->pts_buffer[0];
576  }
577 
578  if (sti->cur_dts && sti->cur_dts != AV_NOPTS_VALUE &&
579  ((!(s->oformat->flags & AVFMT_TS_NONSTRICT) &&
582  sti->cur_dts >= pkt->dts) || sti->cur_dts > pkt->dts)) {
584  "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %s >= %s\n",
585  st->index, av_ts2str(sti->cur_dts), av_ts2str(pkt->dts));
586  return AVERROR(EINVAL);
587  }
588  if (pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts) {
590  "pts (%s) < dts (%s) in stream %d\n",
592  st->index);
593  return AVERROR(EINVAL);
594  }
595 
596  if (s->debug & FF_FDEBUG_TS)
597  av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%s dts2:%s\n",
599 
600  sti->cur_dts = pkt->dts;
601  sti->priv_pts.val = pkt->dts;
602 
603  /* update pts */
604  switch (st->codecpar->codec_type) {
605  case AVMEDIA_TYPE_AUDIO:
607  (*(AVFrame **)pkt->data)->nb_samples :
609 
610  /* HACK/FIXME, we skip the initial 0 size packets as they are most
611  * likely equal to the encoder delay, but it would be better if we
612  * had the real timestamps from the encoder */
613  if (frame_size >= 0 && (pkt->size || sti->priv_pts.num != sti->priv_pts.den >> 1 || sti->priv_pts.val)) {
615  }
616  break;
617  case AVMEDIA_TYPE_VIDEO:
618  frac_add(&sti->priv_pts, (int64_t)st->time_base.den * st->time_base.num);
619  break;
620  }
621  return 0;
622 }
624 #endif
625 
627 {
628  if (pkt->duration < 0 && st->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE) {
629  av_log(s, AV_LOG_WARNING, "Packet with invalid duration %"PRId64" in stream %d\n",
631  pkt->duration = 0;
632  }
633 
634  if (pkt->duration)
635  return;
636 
637  switch (st->codecpar->codec_type) {
638  case AVMEDIA_TYPE_VIDEO:
639  if (st->avg_frame_rate.num > 0 && st->avg_frame_rate.den > 0) {
641  st->time_base);
642  } else if (st->time_base.num * 1000LL > st->time_base.den)
643  pkt->duration = 1;
644  break;
645  case AVMEDIA_TYPE_AUDIO: {
647  if (frame_size && st->codecpar->sample_rate) {
649  (AVRational){1, st->codecpar->sample_rate},
650  st->time_base);
651  }
652  break;
653  }
654  }
655 }
656 
658  AVPacket *pkt)
659 {
660  AVFormatContext *const s = &si->pub;
661  int64_t offset;
662 
664  return;
665 
666  if (si->avoid_negative_ts_status == AVOID_NEGATIVE_TS_UNKNOWN) {
667  int use_pts = si->avoid_negative_ts_use_pts;
668  int64_t ts = use_pts ? pkt->pts : pkt->dts;
669  AVRational tb = sti->pub.time_base;
670 
671  if (ts == AV_NOPTS_VALUE)
672  return;
673 
674  ts -= sti->lowest_ts_allowed;
675 
676  /* Peek into the muxing queue to improve our estimate
677  * of the lowest timestamp if av_interleaved_write_frame() is used. */
678  for (const PacketListEntry *pktl = si->packet_buffer.head;
679  pktl; pktl = pktl->next) {
680  AVRational cmp_tb = s->streams[pktl->pkt.stream_index]->time_base;
681  int64_t cmp_ts = use_pts ? pktl->pkt.pts : pktl->pkt.dts;
682  if (cmp_ts == AV_NOPTS_VALUE)
683  continue;
684  cmp_ts -= ffstream(s->streams[pktl->pkt.stream_index])->lowest_ts_allowed;
685  if (s->output_ts_offset)
686  cmp_ts += av_rescale_q(s->output_ts_offset, AV_TIME_BASE_Q, cmp_tb);
687  if (av_compare_ts(cmp_ts, cmp_tb, ts, tb) < 0) {
688  ts = cmp_ts;
689  tb = cmp_tb;
690  }
691  }
692 
693  if (ts < 0 ||
694  ts > 0 && s->avoid_negative_ts == AVFMT_AVOID_NEG_TS_MAKE_ZERO) {
695  for (unsigned i = 0; i < s->nb_streams; i++) {
696  AVStream *const st2 = s->streams[i];
697  FFStream *const sti2 = ffstream(st2);
698  sti2->mux_ts_offset = av_rescale_q_rnd(-ts, tb,
699  st2->time_base,
700  AV_ROUND_UP);
701  }
702  }
703  si->avoid_negative_ts_status = AVOID_NEGATIVE_TS_KNOWN;
704  }
705 
706  offset = sti->mux_ts_offset;
707 
708  if (pkt->dts != AV_NOPTS_VALUE)
709  pkt->dts += offset;
710  if (pkt->pts != AV_NOPTS_VALUE)
711  pkt->pts += offset;
712 
713  if (si->avoid_negative_ts_use_pts) {
714  if (pkt->pts != AV_NOPTS_VALUE && pkt->pts < sti->lowest_ts_allowed) {
715  av_log(s, AV_LOG_WARNING, "failed to avoid negative "
716  "pts %s in stream %d.\n"
717  "Try -avoid_negative_ts 1 as a possible workaround.\n",
718  av_ts2str(pkt->pts),
720  );
721  }
722  } else {
723  if (pkt->dts != AV_NOPTS_VALUE && pkt->dts < sti->lowest_ts_allowed) {
725  "Packets poorly interleaved, failed to avoid negative "
726  "timestamp %s in stream %d.\n"
727  "Try -max_interleave_delta 0 as a possible workaround.\n",
728  av_ts2str(pkt->dts),
730  );
731  }
732  }
733 }
734 
735 /**
736  * Shift timestamps and call muxer; the original pts/dts are not kept.
737  *
738  * FIXME: this function should NEVER get undefined pts/dts beside when the
739  * AVFMT_NOTIMESTAMPS is set.
740  * Those additional safety checks should be dropped once the correct checks
741  * are set in the callers.
742  */
744 {
745  FFFormatContext *const si = ffformatcontext(s);
746  AVStream *const st = s->streams[pkt->stream_index];
747  FFStream *const sti = ffstream(st);
748  int ret;
749 
750  // If the timestamp offsetting below is adjusted, adjust
751  // ff_interleaved_peek similarly.
752  if (s->output_ts_offset) {
753  int64_t offset = av_rescale_q(s->output_ts_offset, AV_TIME_BASE_Q, st->time_base);
754 
755  if (pkt->dts != AV_NOPTS_VALUE)
756  pkt->dts += offset;
757  if (pkt->pts != AV_NOPTS_VALUE)
758  pkt->pts += offset;
759  }
760  handle_avoid_negative_ts(si, sti, pkt);
761 
763  AVFrame **frame = (AVFrame **)pkt->data;
764  av_assert0(pkt->size == sizeof(*frame));
765  ret = ffofmt(s->oformat)->write_uncoded_frame(s, pkt->stream_index, frame, 0);
766  } else {
767  ret = ffofmt(s->oformat)->write_packet(s, pkt);
768  }
769 
770  if (s->pb && ret >= 0) {
772  if (s->pb->error < 0)
773  ret = s->pb->error;
774  }
775 
776  if (ret >= 0)
777  st->nb_frames++;
778 
779  return ret;
780 }
781 
783 {
784  if (pkt->stream_index < 0 || pkt->stream_index >= s->nb_streams) {
785  av_log(s, AV_LOG_ERROR, "Invalid packet stream index: %d\n",
786  pkt->stream_index);
787  return AVERROR(EINVAL);
788  }
789 
790  if (s->streams[pkt->stream_index]->codecpar->codec_type == AVMEDIA_TYPE_ATTACHMENT) {
791  av_log(s, AV_LOG_ERROR, "Received a packet for an attachment stream.\n");
792  return AVERROR(EINVAL);
793  }
794 
795  return 0;
796 }
797 
799 {
800  FFStream *const sti = ffstream(st);
801 #if !FF_API_COMPUTE_PKT_FIELDS2
802  /* sanitize the timestamps */
803  if (!(s->oformat->flags & AVFMT_NOTIMESTAMPS)) {
804 
805  /* when there is no reordering (so dts is equal to pts), but
806  * only one of them is set, set the other as well */
807  if (!sti->reorder) {
808  if (pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE)
809  pkt->pts = pkt->dts;
810  if (pkt->dts == AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE)
811  pkt->dts = pkt->pts;
812  }
813 
814  /* check that the timestamps are set */
815  if (pkt->pts == AV_NOPTS_VALUE || pkt->dts == AV_NOPTS_VALUE) {
817  "Timestamps are unset in a packet for stream %d\n", st->index);
818  return AVERROR(EINVAL);
819  }
820 
821  /* check that the dts are increasing (or at least non-decreasing,
822  * if the format allows it */
823  if (sti->cur_dts != AV_NOPTS_VALUE &&
824  ((!(s->oformat->flags & AVFMT_TS_NONSTRICT) && sti->cur_dts >= pkt->dts) ||
825  sti->cur_dts > pkt->dts)) {
827  "Application provided invalid, non monotonically increasing "
828  "dts to muxer in stream %d: %" PRId64 " >= %" PRId64 "\n",
829  st->index, sti->cur_dts, pkt->dts);
830  return AVERROR(EINVAL);
831  }
832 
833  if (pkt->pts < pkt->dts) {
834  av_log(s, AV_LOG_ERROR, "pts %" PRId64 " < dts %" PRId64 " in stream %d\n",
835  pkt->pts, pkt->dts, st->index);
836  return AVERROR(EINVAL);
837  }
838  }
839 #endif
840  /* update flags */
841  if (sti->is_intra_only)
843 
844  if (!pkt->data && !pkt->side_data_elems) {
845  /* Such empty packets signal EOS for the BSF API; so sanitize
846  * the packet by allocating data of size 0 (+ padding). */
849  }
850 
851  return 0;
852 }
853 
854 #define CHUNK_START 0x1000
855 
857  int (*compare)(AVFormatContext *, const AVPacket *, const AVPacket *))
858 {
859  int ret;
860  FFFormatContext *const si = ffformatcontext(s);
861  PacketListEntry **next_point, *this_pktl;
862  AVStream *st = s->streams[pkt->stream_index];
863  FFStream *const sti = ffstream(st);
864  int chunked = s->max_chunk_size || s->max_chunk_duration;
865 
866  this_pktl = av_malloc(sizeof(*this_pktl));
867  if (!this_pktl) {
869  return AVERROR(ENOMEM);
870  }
871  if ((ret = av_packet_make_refcounted(pkt)) < 0) {
872  av_free(this_pktl);
874  return ret;
875  }
876 
877  av_packet_move_ref(&this_pktl->pkt, pkt);
878  pkt = &this_pktl->pkt;
879 
880  if (sti->last_in_packet_buffer) {
881  next_point = &(sti->last_in_packet_buffer->next);
882  } else {
883  next_point = &si->packet_buffer.head;
884  }
885 
886  if (chunked) {
887  uint64_t max= av_rescale_q_rnd(s->max_chunk_duration, AV_TIME_BASE_Q, st->time_base, AV_ROUND_UP);
890  if ( (s->max_chunk_size && sti->interleaver_chunk_size > s->max_chunk_size)
891  || (max && sti->interleaver_chunk_duration > max)) {
892  sti->interleaver_chunk_size = 0;
893  pkt->flags |= CHUNK_START;
894  if (max && sti->interleaver_chunk_duration > max) {
895  int64_t syncoffset = (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)*max/2;
896  int64_t syncto = av_rescale(pkt->dts + syncoffset, 1, max)*max - syncoffset;
897 
898  sti->interleaver_chunk_duration += (pkt->dts - syncto)/8 - max;
899  } else
901  }
902  }
903  if (*next_point) {
904  if (chunked && !(pkt->flags & CHUNK_START))
905  goto next_non_null;
906 
907  if (compare(s, &si->packet_buffer.tail->pkt, pkt)) {
908  while ( *next_point
909  && ((chunked && !((*next_point)->pkt.flags&CHUNK_START))
910  || !compare(s, &(*next_point)->pkt, pkt)))
911  next_point = &(*next_point)->next;
912  if (*next_point)
913  goto next_non_null;
914  } else {
915  next_point = &(si->packet_buffer.tail->next);
916  }
917  }
918  av_assert1(!*next_point);
919 
920  si->packet_buffer.tail = this_pktl;
921 next_non_null:
922 
923  this_pktl->next = *next_point;
924 
925  sti->last_in_packet_buffer = *next_point = this_pktl;
926 
927  return 0;
928 }
929 
931  const AVPacket *pkt)
932 {
933  AVStream *st = s->streams[pkt->stream_index];
934  AVStream *st2 = s->streams[next->stream_index];
935  int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
936  st->time_base);
937  if (s->audio_preload) {
938  int preload = st ->codecpar->codec_type == AVMEDIA_TYPE_AUDIO;
939  int preload2 = st2->codecpar->codec_type == AVMEDIA_TYPE_AUDIO;
940  if (preload != preload2) {
941  int64_t ts, ts2;
942  preload *= s->audio_preload;
943  preload2 *= s->audio_preload;
944  ts = av_rescale_q(pkt ->dts, st ->time_base, AV_TIME_BASE_Q) - preload;
945  ts2= av_rescale_q(next->dts, st2->time_base, AV_TIME_BASE_Q) - preload2;
946  if (ts == ts2) {
947  ts = ((uint64_t)pkt ->dts*st ->time_base.num*AV_TIME_BASE - (uint64_t)preload *st ->time_base.den)*st2->time_base.den
948  - ((uint64_t)next->dts*st2->time_base.num*AV_TIME_BASE - (uint64_t)preload2*st2->time_base.den)*st ->time_base.den;
949  ts2 = 0;
950  }
951  comp = (ts2 > ts) - (ts2 < ts);
952  }
953  }
954 
955  if (comp == 0)
956  return pkt->stream_index < next->stream_index;
957  return comp > 0;
958 }
959 
961  int flush, int has_packet)
962 {
963  FormatContextInternal *const fci = ff_fc_internal(s);
964  FFFormatContext *const si = &fci->fc;
965  int stream_count = 0;
966  int noninterleaved_count = 0;
967  int ret;
968  int eof = flush;
969 
970  if (has_packet) {
972  return ret;
973  }
974 
975  for (unsigned i = 0; i < s->nb_streams; i++) {
976  const AVStream *const st = s->streams[i];
977  const FFStream *const sti = cffstream(st);
978  const AVCodecParameters *const par = st->codecpar;
979  if (sti->last_in_packet_buffer) {
980  ++stream_count;
981  } else if (par->codec_type != AVMEDIA_TYPE_ATTACHMENT &&
982  par->codec_id != AV_CODEC_ID_VP8 &&
983  par->codec_id != AV_CODEC_ID_VP9 &&
985  ++noninterleaved_count;
986  }
987  }
988 
989  if (fci->nb_interleaved_streams == stream_count)
990  flush = 1;
991 
992  if (s->max_interleave_delta > 0 &&
993  si->packet_buffer.head &&
995  !flush &&
996  fci->nb_interleaved_streams == stream_count+noninterleaved_count
997  ) {
998  AVPacket *const top_pkt = &si->packet_buffer.head->pkt;
999  int64_t delta_dts = INT64_MIN;
1000  int64_t top_dts = av_rescale_q(top_pkt->dts,
1001  s->streams[top_pkt->stream_index]->time_base,
1002  AV_TIME_BASE_Q);
1003 
1004  for (unsigned i = 0; i < s->nb_streams; i++) {
1005  const AVStream *const st = s->streams[i];
1006  const FFStream *const sti = cffstream(st);
1007  const PacketListEntry *const last = sti->last_in_packet_buffer;
1008  int64_t last_dts;
1009 
1010  if (!last || st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE)
1011  continue;
1012 
1013  last_dts = av_rescale_q(last->pkt.dts,
1014  st->time_base,
1015  AV_TIME_BASE_Q);
1016  delta_dts = FFMAX(delta_dts, last_dts - top_dts);
1017  }
1018 
1019  if (delta_dts > s->max_interleave_delta) {
1021  "Delay between the first packet and last packet in the "
1022  "muxing queue is %"PRId64" > %"PRId64": forcing output\n",
1023  delta_dts, s->max_interleave_delta);
1024  flush = 1;
1025  }
1026  }
1027 
1028 #if FF_API_LAVF_SHORTEST
1029  if (si->packet_buffer.head &&
1030  eof &&
1031  (s->flags & AVFMT_FLAG_SHORTEST) &&
1032  fci->shortest_end == AV_NOPTS_VALUE) {
1033  AVPacket *const top_pkt = &si->packet_buffer.head->pkt;
1034 
1035  fci->shortest_end = av_rescale_q(top_pkt->dts,
1036  s->streams[top_pkt->stream_index]->time_base,
1037  AV_TIME_BASE_Q);
1038  }
1039 
1040  if (fci->shortest_end != AV_NOPTS_VALUE) {
1041  while (si->packet_buffer.head) {
1042  PacketListEntry *pktl = si->packet_buffer.head;
1043  AVPacket *const top_pkt = &pktl->pkt;
1044  AVStream *const st = s->streams[top_pkt->stream_index];
1045  FFStream *const sti = ffstream(st);
1046  int64_t top_dts = av_rescale_q(top_pkt->dts, st->time_base,
1047  AV_TIME_BASE_Q);
1048 
1049  if (fci->shortest_end + 1 >= top_dts)
1050  break;
1051 
1052  si->packet_buffer.head = pktl->next;
1053  if (!si->packet_buffer.head)
1054  si->packet_buffer.tail = NULL;
1055 
1056  if (sti->last_in_packet_buffer == pktl)
1057  sti->last_in_packet_buffer = NULL;
1058 
1059  av_packet_unref(&pktl->pkt);
1060  av_freep(&pktl);
1061  flush = 0;
1062  }
1063  }
1064 #endif
1065 
1066  if (stream_count && flush) {
1067  PacketListEntry *pktl = si->packet_buffer.head;
1068  AVStream *const st = s->streams[pktl->pkt.stream_index];
1069  FFStream *const sti = ffstream(st);
1070 
1071  if (sti->last_in_packet_buffer == pktl)
1072  sti->last_in_packet_buffer = NULL;
1074 
1075  return 1;
1076  } else {
1077  return 0;
1078  }
1079 }
1080 
1082  int flush, int has_packet)
1083 {
1084  return has_packet;
1085 }
1086 
1088 {
1089  AVStream *st;
1090 
1091  if (stream_index < 0 || stream_index >= s->nb_streams)
1092  return AVERROR(EINVAL);
1093 
1094  st = s->streams[stream_index];
1095  *offset = ffstream(st)->mux_ts_offset;
1096 
1097  if (s->output_ts_offset)
1098  *offset += av_rescale_q(s->output_ts_offset, AV_TIME_BASE_Q, st->time_base);
1099 
1100  return 0;
1101 }
1102 
1104 {
1105  FFFormatContext *const si = ffformatcontext(s);
1106  PacketListEntry *pktl = si->packet_buffer.head;
1107  while (pktl) {
1108  if (pktl->pkt.stream_index == stream) {
1109  return &pktl->pkt;
1110  }
1111  pktl = pktl->next;
1112  }
1113  return NULL;
1114 }
1115 
1117 {
1118  int ret;
1119 
1120  if (!(s->flags & AVFMT_FLAG_AUTO_BSF))
1121  return 1;
1122 
1123  if (ffofmt(s->oformat)->check_bitstream) {
1124  if (!sti->bitstream_checked) {
1125  if ((ret = ffofmt(s->oformat)->check_bitstream(s, &sti->pub, pkt)) < 0)
1126  return ret;
1127  else if (ret == 1)
1128  sti->bitstream_checked = 1;
1129  }
1130  }
1131 
1132  return 1;
1133 }
1134 
1136  int flush, int has_packet)
1137 {
1138  FormatContextInternal *const fci = ff_fc_internal(s);
1139 
1140  for (;; ) {
1141  int ret = fci->interleave_packet(s, pkt, flush, has_packet);
1142  if (ret <= 0)
1143  return ret;
1144 
1145  has_packet = 0;
1146 
1147  ret = write_packet(s, pkt);
1149  if (ret < 0)
1150  return ret;
1151  }
1152 }
1153 
1154 static int write_packet_common(AVFormatContext *s, AVStream *st, AVPacket *pkt, int interleaved)
1155 {
1156  int ret;
1157 
1158  if (s->debug & FF_FDEBUG_TS)
1159  av_log(s, AV_LOG_DEBUG, "%s size:%d dts:%s pts:%s\n", __func__,
1161 
1162  guess_pkt_duration(s, st, pkt);
1163 
1164 #if FF_API_COMPUTE_PKT_FIELDS2
1165  if ((ret = compute_muxer_pkt_fields(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
1166  return ret;
1167 #endif
1168 
1169  if (interleaved) {
1170  if (pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
1171  return AVERROR(EINVAL);
1172  return interleaved_write_packet(s, pkt, 0, 1);
1173  } else {
1174  return write_packet(s, pkt);
1175  }
1176 }
1177 
1178 static int write_packets_from_bsfs(AVFormatContext *s, AVStream *st, AVPacket *pkt, int interleaved)
1179 {
1180  FFStream *const sti = ffstream(st);
1181  AVBSFContext *const bsfc = sti->bsfc;
1182  int ret;
1183 
1184  if ((ret = av_bsf_send_packet(bsfc, pkt)) < 0) {
1186  "Failed to send packet to filter %s for stream %d\n",
1187  bsfc->filter->name, st->index);
1188  return ret;
1189  }
1190 
1191  do {
1192  ret = av_bsf_receive_packet(bsfc, pkt);
1193  if (ret < 0) {
1194  if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
1195  return 0;
1196  av_log(s, AV_LOG_ERROR, "Error applying bitstream filters to an output "
1197  "packet for stream #%d: %s\n", st->index, av_err2str(ret));
1198  if (!(s->error_recognition & AV_EF_EXPLODE) && ret != AVERROR(ENOMEM))
1199  continue;
1200  return ret;
1201  }
1203  ret = write_packet_common(s, st, pkt, interleaved);
1204  if (ret >= 0 && !interleaved) // a successful write_packet_common already unrefed pkt for interleaved
1206  } while (ret >= 0);
1207 
1208  return ret;
1209 }
1210 
1211 static int write_packets_common(AVFormatContext *s, AVPacket *pkt, int interleaved)
1212 {
1213  AVStream *st;
1214  FFStream *sti;
1215  int ret = check_packet(s, pkt);
1216  if (ret < 0)
1217  return ret;
1218  st = s->streams[pkt->stream_index];
1219  sti = ffstream(st);
1220 
1221  ret = prepare_input_packet(s, st, pkt);
1222  if (ret < 0)
1223  return ret;
1224 
1225  ret = check_bitstream(s, sti, pkt);
1226  if (ret < 0)
1227  return ret;
1228 
1229  if (sti->bsfc) {
1230  return write_packets_from_bsfs(s, st, pkt, interleaved);
1231  } else {
1232  return write_packet_common(s, st, pkt, interleaved);
1233  }
1234 }
1235 
1237 {
1238  FFFormatContext *const si = ffformatcontext(s);
1239  AVPacket *pkt = si->parse_pkt;
1240  int ret;
1241 
1242  if (!in) {
1243  if (ffofmt(s->oformat)->flags_internal & FF_OFMT_FLAG_ALLOW_FLUSH) {
1244  ret = ffofmt(s->oformat)->write_packet(s, NULL);
1245  flush_if_needed(s);
1246  if (ret >= 0 && s->pb && s->pb->error < 0)
1247  ret = s->pb->error;
1248  return ret;
1249  }
1250  return 1;
1251  }
1252 
1253  if (in->flags & AV_PKT_FLAG_UNCODED_FRAME) {
1254  pkt = in;
1255  } else {
1256  /* We don't own in, so we have to make sure not to modify it.
1257  * (ff_write_chained() relies on this fact.)
1258  * The following avoids copying in's data unnecessarily.
1259  * Copying side data is unavoidable as a bitstream filter
1260  * may change it, e.g. free it on errors. */
1261  pkt->data = in->data;
1262  pkt->size = in->size;
1264  if (ret < 0)
1265  return ret;
1266  if (in->buf) {
1267  pkt->buf = av_buffer_ref(in->buf);
1268  if (!pkt->buf) {
1269  ret = AVERROR(ENOMEM);
1270  goto fail;
1271  }
1272  }
1273  }
1274 
1275  ret = write_packets_common(s, pkt, 0/*non-interleaved*/);
1276 
1277 fail:
1278  // Uncoded frames using the noninterleaved codepath are also freed here
1280  return ret;
1281 }
1282 
1284 {
1285  int ret;
1286 
1287  if (pkt) {
1288  ret = write_packets_common(s, pkt, 1/*interleaved*/);
1289  if (ret < 0)
1291  return ret;
1292  } else {
1293  av_log(s, AV_LOG_TRACE, "av_interleaved_write_frame FLUSH\n");
1294  return interleaved_write_packet(s, ffformatcontext(s)->parse_pkt, 1/*flush*/, 0);
1295  }
1296 }
1297 
1299 {
1300  FFFormatContext *const si = ffformatcontext(s);
1301  AVPacket *const pkt = si->parse_pkt;
1302  int ret1, ret = 0;
1303 
1304  for (unsigned i = 0; i < s->nb_streams; i++) {
1305  AVStream *const st = s->streams[i];
1306  FFStream *const sti = ffstream(st);
1307  if (sti->bsfc) {
1308  ret1 = write_packets_from_bsfs(s, st, pkt, 1/*interleaved*/);
1309  if (ret1 < 0)
1311  if (ret >= 0)
1312  ret = ret1;
1313  }
1314  }
1315  ret1 = interleaved_write_packet(s, pkt, 1, 0);
1316  if (ret >= 0)
1317  ret = ret1;
1318 
1319  if (ffofmt(s->oformat)->write_trailer) {
1320  if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
1322  ret1 = ffofmt(s->oformat)->write_trailer(s);
1323  if (ret >= 0)
1324  ret = ret1;
1325  }
1326 
1327  deinit_muxer(s);
1328 
1329  if (s->pb)
1330  avio_flush(s->pb);
1331  if (ret == 0)
1332  ret = s->pb ? s->pb->error : 0;
1333  for (unsigned i = 0; i < s->nb_streams; i++) {
1334  av_freep(&s->streams[i]->priv_data);
1335  av_freep(&ffstream(s->streams[i])->index_entries);
1336  }
1337  if (s->oformat->priv_class)
1338  av_opt_free(s->priv_data);
1339  av_freep(&s->priv_data);
1340  av_packet_unref(si->pkt);
1341  return ret;
1342 }
1343 
1345  int64_t *dts, int64_t *wall)
1346 {
1347  const FFOutputFormat *const of = ffofmt(s->oformat);
1348  if (!of || !of->get_output_timestamp)
1349  return AVERROR(ENOSYS);
1350  of->get_output_timestamp(s, stream, dts, wall);
1351  return 0;
1352 }
1353 
1354 int ff_stream_add_bitstream_filter(AVStream *st, const char *name, const char *args)
1355 {
1356  int ret;
1357  const AVBitStreamFilter *bsf;
1358  FFStream *const sti = ffstream(st);
1359  AVBSFContext *bsfc;
1360 
1361  av_assert0(!sti->bsfc);
1362 
1363  if (!(bsf = av_bsf_get_by_name(name))) {
1364  av_log(NULL, AV_LOG_ERROR, "Unknown bitstream filter '%s'\n", name);
1365  return AVERROR_BSF_NOT_FOUND;
1366  }
1367 
1368  if ((ret = av_bsf_alloc(bsf, &bsfc)) < 0)
1369  return ret;
1370 
1371  bsfc->time_base_in = st->time_base;
1372  if ((ret = avcodec_parameters_copy(bsfc->par_in, st->codecpar)) < 0) {
1373  av_bsf_free(&bsfc);
1374  return ret;
1375  }
1376 
1377  if (args && bsfc->filter->priv_class) {
1378  if ((ret = av_set_options_string(bsfc->priv_data, args, "=", ":")) < 0) {
1379  av_bsf_free(&bsfc);
1380  return ret;
1381  }
1382  }
1383 
1384  if ((ret = av_bsf_init(bsfc)) < 0) {
1385  av_bsf_free(&bsfc);
1386  return ret;
1387  }
1388 
1389  sti->bsfc = bsfc;
1390 
1392  "Automatically inserted bitstream filter '%s'; args='%s'\n",
1393  name, args ? args : "");
1394  return 1;
1395 }
1396 
1399 {
1400  int64_t pts = pkt->pts, dts = pkt->dts, duration = pkt->duration;
1401  int stream_index = pkt->stream_index;
1402  AVRational time_base = pkt->time_base;
1403  int ret;
1404 
1405  pkt->stream_index = dst_stream;
1406 
1408  src->streams[stream_index]->time_base,
1409  dst->streams[dst_stream]->time_base);
1410 
1411  if (!interleave) {
1412  ret = av_write_frame(dst, pkt);
1413  /* We only have to backup and restore the fields that
1414  * we changed ourselves, because av_write_frame() does not
1415  * modify the packet given to it. */
1416  pkt->pts = pts;
1417  pkt->dts = dts;
1418  pkt->duration = duration;
1419  pkt->stream_index = stream_index;
1420  pkt->time_base = time_base;
1421  } else
1423 
1424  return ret;
1425 }
1426 
1427 static void uncoded_frame_free(void *unused, uint8_t *data)
1428 {
1429  av_frame_free((AVFrame **)data);
1430  av_free(data);
1431 }
1432 
1433 static int write_uncoded_frame_internal(AVFormatContext *s, int stream_index,
1434  AVFrame *frame, int interleaved)
1435 {
1436  FFFormatContext *const si = ffformatcontext(s);
1437  AVPacket *pkt = si->parse_pkt;
1438 
1439  av_assert0(s->oformat);
1440  if (!ffofmt(s->oformat)->write_uncoded_frame) {
1441  av_frame_free(&frame);
1442  return AVERROR(ENOSYS);
1443  }
1444 
1445  if (!frame) {
1446  pkt = NULL;
1447  } else {
1448  size_t bufsize = sizeof(frame) + AV_INPUT_BUFFER_PADDING_SIZE;
1449  AVFrame **framep = av_mallocz(bufsize);
1450 
1451  if (!framep)
1452  goto fail;
1453  pkt->buf = av_buffer_create((void *)framep, bufsize,
1454  uncoded_frame_free, NULL, 0);
1455  if (!pkt->buf) {
1456  av_free(framep);
1457  fail:
1458  av_frame_free(&frame);
1459  return AVERROR(ENOMEM);
1460  }
1461  *framep = frame;
1462 
1463  pkt->data = (void *)framep;
1464  pkt->size = sizeof(frame);
1465  pkt->pts =
1466  pkt->dts = frame->pts;
1467  pkt->duration = frame->duration;
1468  pkt->stream_index = stream_index;
1470  }
1471 
1472  return interleaved ? av_interleaved_write_frame(s, pkt) :
1473  av_write_frame(s, pkt);
1474 }
1475 
1477  AVFrame *frame)
1478 {
1479  return write_uncoded_frame_internal(s, stream_index, frame, 0);
1480 }
1481 
1483  AVFrame *frame)
1484 {
1485  return write_uncoded_frame_internal(s, stream_index, frame, 1);
1486 }
1487 
1489 {
1490  const FFOutputFormat *const of = ffofmt(s->oformat);
1491  av_assert0(of);
1492  if (!of->write_uncoded_frame)
1493  return AVERROR(ENOSYS);
1494  return of->write_uncoded_frame(s, stream_index, NULL,
1496 }
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:32
AV_OPT_SEARCH_CHILDREN
#define AV_OPT_SEARCH_CHILDREN
Search in possible children of the given object first.
Definition: opt.h:605
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: packet.c:430
AV_ROUND_UP
@ AV_ROUND_UP
Round toward +infinity.
Definition: mathematics.h:134
FF_ENABLE_DEPRECATION_WARNINGS
#define FF_ENABLE_DEPRECATION_WARNINGS
Definition: internal.h:73
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:204
AVBSFContext::par_in
AVCodecParameters * par_in
Parameters of the input stream.
Definition: bsf.h:90
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:215
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
LIBAVFORMAT_IDENT
#define LIBAVFORMAT_IDENT
Definition: version.h:45
PacketList::head
PacketListEntry * head
Definition: packet_internal.h:34
AV_EF_EXPLODE
#define AV_EF_EXPLODE
abort decoding on minor error detection
Definition: defs.h:51
av_opt_set_defaults
void av_opt_set_defaults(void *s)
Set the values of all AVOption fields to their default values.
Definition: opt.c:1678
AVOutputFormat::name
const char * name
Definition: avformat.h:510
AVSTREAM_INIT_IN_WRITE_HEADER
#define AVSTREAM_INIT_IN_WRITE_HEADER
stream parameters initialized in avformat_write_header
Definition: avformat.h:2508
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: codec_par.h:51
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
AVFMT_NODIMENSIONS
#define AVFMT_NODIMENSIONS
Format does not need width/height.
Definition: avformat.h:483
FF_FDEBUG_TS
#define FF_FDEBUG_TS
Definition: avformat.h:1579
FFStream::bsfc
struct AVBSFContext * bsfc
bitstream filter to run on stream
Definition: internal.h:150
ff_interleave_packet_per_dts
int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *pkt, int flush, int has_packet)
Interleave an AVPacket per dts so it can be muxed.
Definition: mux.c:960
avformat_alloc_output_context2
int avformat_alloc_output_context2(AVFormatContext **avctx, const AVOutputFormat *oformat, const char *format, const char *filename)
Allocate an AVFormatContext for an output format.
Definition: mux.c:95
comp
static void comp(unsigned char *dst, ptrdiff_t dst_stride, unsigned char *src, ptrdiff_t src_stride, int add)
Definition: eamad.c:81
AVCodecParameters
This struct describes the properties of an encoded stream.
Definition: codec_par.h:47
ffformatcontext
static av_always_inline FFFormatContext * ffformatcontext(AVFormatContext *s)
Definition: internal.h:127
interleaved_write_packet
static int interleaved_write_packet(AVFormatContext *s, AVPacket *pkt, int flush, int has_packet)
Definition: mux.c:1135
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
AV_DISPOSITION_ATTACHED_PIC
#define AV_DISPOSITION_ATTACHED_PIC
The stream is stored in the file as an attached picture/"cover art" (e.g.
Definition: avformat.h:674
AVFMT_NOTIMESTAMPS
#define AVFMT_NOTIMESTAMPS
Format does not need / have any timestamps.
Definition: avformat.h:479
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:264
AVCodecTag::id
enum AVCodecID id
Definition: internal.h:43
AVBitStreamFilter::name
const char * name
Definition: bsf.h:112
int64_t
long long int64_t
Definition: coverity.c:34
init_muxer
static int init_muxer(AVFormatContext *s, AVDictionary **options)
Definition: mux.c:187
AV_CODEC_ID_RAWVIDEO
@ AV_CODEC_ID_RAWVIDEO
Definition: codec_id.h:65
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:162
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:389
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:28
AVPacketSideData
This structure stores auxiliary information for decoding, presenting, or otherwise processing the cod...
Definition: packet.h:390
FFStream::interleaver_chunk_size
int64_t interleaver_chunk_size
Definition: internal.h:193
FFFormatContext::avoid_negative_ts_status
enum FFFormatContext::@391 avoid_negative_ts_status
Whether the timestamp shift offset has already been determined.
internal.h
AVPacket::data
uint8_t * data
Definition: packet.h:539
FFOutputFormat::flags_internal
int flags_internal
Internal flags.
Definition: mux.h:74
AVStream::avg_frame_rate
AVRational avg_frame_rate
Average framerate.
Definition: avformat.h:837
data
const char data[16]
Definition: mxf.c:149
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:75
ff_toupper4
unsigned int ff_toupper4(unsigned int x)
Definition: to_upper4.h:29
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:225
AVPacket::duration
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition: packet.h:557
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: codec_par.h:59
max
#define max(a, b)
Definition: cuda_runtime.h:33
mathematics.h
AVDictionary
Definition: dict.c:34
FF_OFMT_FLAG_ONLY_DEFAULT_CODECS
#define FF_OFMT_FLAG_ONLY_DEFAULT_CODECS
If this flag is set, then the only permitted audio/video/subtitle codec ids are AVOutputFormat....
Definition: mux.h:59
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
av_buffer_ref
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition: buffer.c:103
av_write_uncoded_frame_query
int av_write_uncoded_frame_query(AVFormatContext *s, int stream_index)
Test whether a muxer supports uncoded frame.
Definition: mux.c:1488
avformat_init_output
int avformat_init_output(AVFormatContext *s, AVDictionary **options)
Allocate the stream private data and initialize the codec, but do not write the header.
Definition: mux.c:467
cffstream
static const av_always_inline FFStream * cffstream(const AVStream *st)
Definition: internal.h:363
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:328
av_bsf_free
void av_bsf_free(AVBSFContext **pctx)
Free a bitstream filter context and everything associated with it; write NULL into the supplied point...
Definition: bsf.c:52
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:594
ff_get_muxer_ts_offset
int ff_get_muxer_ts_offset(AVFormatContext *s, int stream_index, int64_t *offset)
Definition: mux.c:1087
AVBSFContext
The bitstream filter state.
Definition: bsf.h:68
FormatContextInternal
Definition: avformat_internal.h:33
FFOutputFormat::p
AVOutputFormat p
The public AVOutputFormat.
Definition: mux.h:65
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:30
avio_write_marker
void avio_write_marker(AVIOContext *s, int64_t time, enum AVIODataMarkerType type)
Mark the written bytestream as a specific type.
Definition: aviobuf.c:461
FFStream::is_intra_only
int is_intra_only
Definition: internal.h:179
AVPacketSideData::size
size_t size
Definition: packet.h:392
avpriv_set_pts_info
void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition: avformat.c:867
bsf.h
deinit_muxer
static void deinit_muxer(AVFormatContext *s)
Definition: mux.c:457
ffstream
static av_always_inline FFStream * ffstream(AVStream *st)
Definition: internal.h:358
fail
#define fail()
Definition: checkasm.h:193
AVFMT_FLAG_AUTO_BSF
#define AVFMT_FLAG_AUTO_BSF
Add bitstream filters as requested by the muxer.
Definition: avformat.h:1474
av_opt_free
void av_opt_free(void *obj)
Free all allocated objects in obj.
Definition: opt.c:1949
avpriv_packet_list_get
int avpriv_packet_list_get(PacketList *pkt_buffer, AVPacket *pkt)
Remove the oldest AVPacket in the list and return it.
Definition: packet.c:583
val
static double val(void *priv, double ch)
Definition: aeval.c:77
AVFMT_AVOID_NEG_TS_MAKE_ZERO
#define AVFMT_AVOID_NEG_TS_MAKE_ZERO
Shift timestamps so that they start at 0.
Definition: avformat.h:1691
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
AV_DISPOSITION_TIMED_THUMBNAILS
#define AV_DISPOSITION_TIMED_THUMBNAILS
The stream is sparse, and contains thumbnail images, often corresponding to chapter markers.
Definition: avformat.h:679
pts
static int64_t pts
Definition: transcode_aac.c:644
FormatContextInternal::streams_initialized
int streams_initialized
Whether or not avformat_init_output fully initialized streams.
Definition: avformat_internal.h:47
AVRational::num
int num
Numerator.
Definition: rational.h:59
av_get_bits_per_sample
int av_get_bits_per_sample(enum AVCodecID codec_id)
Return codec bits per sample.
Definition: utils.c:550
avassert.h
AV_LOG_TRACE
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition: log.h:235
pkt
AVPacket * pkt
Definition: movenc.c:60
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:209
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
AVCodecTag
Definition: internal.h:42
duration
int64_t duration
Definition: movenc.c:65
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:62
AVCodecDescriptor
This struct describes the properties of a single codec described by an AVCodecID.
Definition: codec_desc.h:38
s
#define s(width, name)
Definition: cbs_vp9.c:198
FFFormatContext::packet_buffer
PacketList packet_buffer
This buffer is only needed when packets were already buffered but not decoded, for example to get the...
Definition: internal.h:86
format
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 format(the sample packing is implied by the sample format) and sample rate. The lists are not just lists
AVCodecParameters::sample_aspect_ratio
AVRational sample_aspect_ratio
Video only.
Definition: codec_par.h:144
AVDictionaryEntry::key
char * key
Definition: dict.h:90
frame_size
int frame_size
Definition: mxfenc.c:2429
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
AV_CODEC_ID_VP9
@ AV_CODEC_ID_VP9
Definition: codec_id.h:222
AVCodecParameters::width
int width
Video only.
Definition: codec_par.h:134
av_q2d
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition: rational.h:104
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
av_set_options_string
int av_set_options_string(void *ctx, const char *opts, const char *key_val_sep, const char *pairs_sep)
Parse the key/value pairs list in opts.
Definition: opt.c:1817
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:230
AVPacketSideData::data
uint8_t * data
Definition: packet.h:391
write_packets_from_bsfs
static int write_packets_from_bsfs(AVFormatContext *s, AVStream *st, AVPacket *pkt, int interleaved)
Definition: mux.c:1178
ffofmt
static const FFOutputFormat * ffofmt(const AVOutputFormat *fmt)
Definition: mux.h:167
AVBSFContext::time_base_in
AVRational time_base_in
The timebase used for the timestamps of the input packets.
Definition: bsf.h:102
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
av_bsf_alloc
int av_bsf_alloc(const AVBitStreamFilter *filter, AVBSFContext **pctx)
Allocate a context for a given bitstream filter.
Definition: bsf.c:104
AVOutputFormat::codec_tag
const struct AVCodecTag *const * codec_tag
List of supported codec_id-codec_tag pairs, ordered by "better choice first".
Definition: avformat.h:535
AVCodecParameters::nb_coded_side_data
int nb_coded_side_data
Amount of entries in coded_side_data.
Definition: codec_par.h:86
AVMEDIA_TYPE_DATA
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
Definition: avutil.h:203
AudioData::data
uint8_t * data
samples buffer
Definition: swresample_internal.h:47
FormatContextInternal::interleave_packet
int(* interleave_packet)(struct AVFormatContext *s, AVPacket *pkt, int flush, int has_packet)
The interleavement function in use.
Definition: avformat_internal.h:59
avformat_write_header
int avformat_write_header(AVFormatContext *s, AVDictionary **options)
Allocate the stream private data and write the stream header to an output media file.
Definition: mux.c:488
PacketList::tail
PacketListEntry * tail
Definition: packet_internal.h:34
init_pts
static int init_pts(AVFormatContext *s)
Definition: mux.c:404
if
if(ret)
Definition: filter_design.txt:179
FFFormatContext
Definition: internal.h:64
avio_flush
void avio_flush(AVIOContext *s)
Force flushing of buffered data.
Definition: aviobuf.c:223
compute_muxer_pkt_fields
static FF_DISABLE_DEPRECATION_WARNINGS int compute_muxer_pkt_fields(AVFormatContext *s, AVStream *st, AVPacket *pkt)
Definition: mux.c:530
AVFormatContext
Format I/O context.
Definition: avformat.h:1300
FFStream::pub
AVStream pub
The public context.
Definition: internal.h:136
AVPacket::buf
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
Definition: packet.h:522
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:771
av_bsf_init
int av_bsf_init(AVBSFContext *ctx)
Prepare the filter for use, after all the parameters and options have been set.
Definition: bsf.c:149
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:75
AVFMT_AVOID_NEG_TS_DISABLED
#define AVFMT_AVOID_NEG_TS_DISABLED
Do not shift timestamps even when they are negative.
Definition: avformat.h:1689
av_write_uncoded_frame
int av_write_uncoded_frame(AVFormatContext *s, int stream_index, AVFrame *frame)
Write an uncoded frame to an output media file.
Definition: mux.c:1476
fabs
static __device__ float fabs(float a)
Definition: cuda_runtime.h:182
FFStream::bitstream_checked
int bitstream_checked
Whether or not check_bitstream should still be run on each packet.
Definition: internal.h:155
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:787
NULL
#define NULL
Definition: coverity.c:32
av_buffer_unref
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition: buffer.c:139
av_bsf_receive_packet
int av_bsf_receive_packet(AVBSFContext *ctx, AVPacket *pkt)
Retrieve a filtered packet.
Definition: bsf.c:230
AVIO_DATA_MARKER_TRAILER
@ AVIO_DATA_MARKER_TRAILER
Trailer data, which doesn't contain actual content, but only for finalizing the output file.
Definition: avio.h:139
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
FFOutputFormat::write_packet
int(* write_packet)(AVFormatContext *, AVPacket *pkt)
Write a packet.
Definition: mux.h:84
guess_pkt_duration
static FF_ENABLE_DEPRECATION_WARNINGS void guess_pkt_duration(AVFormatContext *s, AVStream *st, AVPacket *pkt)
Definition: mux.c:626
AVPacketSideData::type
enum AVPacketSideDataType type
Definition: packet.h:393
FFOutputFormat::deinit
void(* deinit)(AVFormatContext *)
Deinitialize format.
Definition: mux.h:154
AVERROR_BSF_NOT_FOUND
#define AVERROR_BSF_NOT_FOUND
Bitstream filter not found.
Definition: error.h:51
flush
void(* flush)(AVBSFContext *ctx)
Definition: dts2pts.c:370
options
Definition: swscale.c:42
AVBitStreamFilter::priv_class
const AVClass * priv_class
A class for the private data, used to declare bitstream filter private AVOptions.
Definition: bsf.h:130
write_packets_common
static int write_packets_common(AVFormatContext *s, AVPacket *pkt, int interleaved)
Definition: mux.c:1211
FFOutputFormat
Definition: mux.h:61
AVOutputFormat::priv_class
const AVClass * priv_class
AVClass for the private context.
Definition: avformat.h:538
av_write_frame
int av_write_frame(AVFormatContext *s, AVPacket *in)
Write a packet to an output media file.
Definition: mux.c:1236
FormatContextInternal::fc
FFFormatContext fc
Definition: avformat_internal.h:34
AVCodecParameters::ch_layout
AVChannelLayout ch_layout
Audio only.
Definition: codec_par.h:180
FFStream::interleaver_chunk_duration
int64_t interleaver_chunk_duration
Definition: internal.h:194
av_packet_move_ref
void av_packet_move_ref(AVPacket *dst, AVPacket *src)
Move every field in src to dst and reset src.
Definition: packet.c:487
PacketListEntry::next
struct PacketListEntry * next
Definition: packet_internal.h:29
AVCodecParameters::sample_rate
int sample_rate
Audio only.
Definition: codec_par.h:184
av_buffer_create
AVBufferRef * av_buffer_create(uint8_t *data, size_t size, void(*free)(void *opaque, uint8_t *data), void *opaque, int flags)
Create an AVBuffer from an existing array.
Definition: buffer.c:55
AVStream::nb_frames
int64_t nb_frames
number of frames in this stream if known or 0
Definition: avformat.h:809
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
validate_codec_tag
static int validate_codec_tag(const AVFormatContext *s, const AVStream *st)
Definition: mux.c:153
AVOutputFormat::flags
int flags
can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS,...
Definition: avformat.h:529
AVOID_NEGATIVE_TS_ENABLED
#define AVOID_NEGATIVE_TS_ENABLED(status)
Definition: internal.h:79
interleave
static void interleave(uint8_t *dst, uint8_t *src, int w, int h, int dst_linesize, int src_linesize, enum FilterMode mode, int swap)
Definition: vf_il.c:113
f
f
Definition: af_crystalizer.c:122
AVPacket::size
int size
Definition: packet.h:540
FFFormatContext::parse_pkt
AVPacket * parse_pkt
The generic code uses this as a temporary packet to parse packets or for muxing, especially flushing.
Definition: internal.h:104
avformat_alloc_context
AVFormatContext * avformat_alloc_context(void)
Allocate an AVFormatContext.
Definition: options.c:162
av_codec_get_tag
unsigned int av_codec_get_tag(const struct AVCodecTag *const *tags, enum AVCodecID id)
Get the codec tag for the given codec id id.
FF_OFMT_FLAG_ALLOW_FLUSH
#define FF_OFMT_FLAG_ALLOW_FLUSH
This flag indicates that the muxer stores data internally and supports flushing it.
Definition: mux.h:38
FFFrac::val
int64_t val
Definition: internal.h:60
FFStream
Definition: internal.h:132
AV_CODEC_PROP_REORDER
#define AV_CODEC_PROP_REORDER
Codec supports frame reordering.
Definition: codec_desc.h:92
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
av_bsf_send_packet
int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt)
Submit a packet for filtering.
Definition: bsf.c:202
uncoded_frame_free
static void uncoded_frame_free(void *unused, uint8_t *data)
Definition: mux.c:1427
av_err2str
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: error.h:122
FFOutputFormat::check_bitstream
int(* check_bitstream)(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
Set up any necessary bitstream filtering and extract any extra data needed for the global header.
Definition: mux.h:163
AV_PKT_FLAG_UNCODED_FRAME
#define AV_PKT_FLAG_UNCODED_FRAME
Definition: mux.c:524
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
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:799
PacketListEntry::pkt
AVPacket pkt
Definition: packet_internal.h:30
AVFMT_NOFILE
#define AVFMT_NOFILE
Demuxer will use avio_open, no opened file should be provided by the caller.
Definition: avformat.h:468
write_uncoded_frame_internal
static int write_uncoded_frame_internal(AVFormatContext *s, int stream_index, AVFrame *frame, int interleaved)
Definition: mux.c:1433
AVStream::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
Definition: avformat.h:826
frame.h
AVFMT_NOSTREAMS
#define AVFMT_NOSTREAMS
Format does not require any streams.
Definition: avformat.h:484
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:538
FF_COMPLIANCE_NORMAL
#define FF_COMPLIANCE_NORMAL
Definition: defs.h:60
FFOutputFormat::interleave_packet
int(* interleave_packet)(AVFormatContext *s, AVPacket *pkt, int flush, int has_packet)
A format-specific function for interleavement.
Definition: mux.h:102
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
prepare_input_packet
static int prepare_input_packet(AVFormatContext *s, AVStream *st, AVPacket *pkt)
Definition: mux.c:798
av_packet_make_refcounted
int av_packet_make_refcounted(AVPacket *pkt)
Ensure the data described by a given packet is reference counted.
Definition: packet.c:493
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:545
av_dict_free
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
Definition: dict.c:223
av_packet_rescale_ts
void av_packet_rescale_ts(AVPacket *pkt, AVRational src_tb, AVRational dst_tb)
Convert valid timing fields (timestamps / durations) in a packet from one timebase to another.
Definition: packet.c:534
FFOutputFormat::priv_data_size
int priv_data_size
size of private data so that it can be allocated in the wrapper
Definition: mux.h:69
avformat_internal.h
avcodec_get_name
const char * avcodec_get_name(enum AVCodecID id)
Get the name of a codec.
Definition: utils.c:409
FFOutputFormat::write_header
int(* write_header)(AVFormatContext *)
Definition: mux.h:76
av_write_trailer
int av_write_trailer(AVFormatContext *s)
Write the stream trailer to an output media file and free the file private data.
Definition: mux.c:1298
av_assert2
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:67
av_packet_copy_props
int av_packet_copy_props(AVPacket *dst, const AVPacket *src)
Copy only "properties" fields from src to dst.
Definition: packet.c:393
ff_is_intra_only
int ff_is_intra_only(enum AVCodecID id)
Definition: avformat.c:940
ff_interleaved_peek
const AVPacket * ff_interleaved_peek(AVFormatContext *s, int stream)
Find the next packet in the interleaving queue for the given stream.
Definition: mux.c:1103
PacketListEntry
Definition: packet_internal.h:28
FFStream::mux_ts_offset
int64_t mux_ts_offset
Timestamp offset added to timestamps before muxing.
Definition: internal.h:247
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
AVOutputFormat
Definition: avformat.h:509
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:532
av_opt_set_dict2
int av_opt_set_dict2(void *obj, AVDictionary **options, int search_flags)
Set all the options from a given dictionary on an object.
Definition: opt.c:1962
AV_CODEC_ID_SMPTE_2038
@ AV_CODEC_ID_SMPTE_2038
Definition: codec_id.h:597
internal.h
FFStream::priv_pts
FFFrac priv_pts
Definition: internal.h:181
AVCodecParameters::height
int height
Definition: codec_par.h:135
AV_TIME_BASE
#define AV_TIME_BASE
Internal time base represented as integer.
Definition: avutil.h:254
AVCodecParameters::block_align
int block_align
Audio only.
Definition: codec_par.h:191
CHUNK_START
#define CHUNK_START
Definition: mux.c:854
check_bitstream
static int check_bitstream(AVFormatContext *s, FFStream *sti, AVPacket *pkt)
Definition: mux.c:1116
ff_interleave_add_packet
int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt, int(*compare)(AVFormatContext *, const AVPacket *, const AVPacket *))
Add packet to an AVFormatContext's packet_buffer list, determining its interleaved position using com...
Definition: mux.c:856
av_get_output_timestamp
int av_get_output_timestamp(struct AVFormatContext *s, int stream, int64_t *dts, int64_t *wall)
Get timing information for the data currently output.
Definition: mux.c:1344
FF_OFMT_FLAG_MAX_ONE_OF_EACH
#define FF_OFMT_FLAG_MAX_ONE_OF_EACH
If this flag is set, it indicates that for each codec type whose corresponding default codec (i....
Definition: mux.h:50
FFStream::reorder
int reorder
Set to 1 if the codec allows reordering, so pts can be different from dts.
Definition: internal.h:143
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:56
AVFMT_AVOID_NEG_TS_MAKE_NON_NEGATIVE
#define AVFMT_AVOID_NEG_TS_MAKE_NON_NEGATIVE
Shift timestamps so they are non negative.
Definition: avformat.h:1690
write_packet
static int write_packet(AVFormatContext *s, AVPacket *pkt)
Shift timestamps and call muxer; the original pts/dts are not kept.
Definition: mux.c:743
AVMEDIA_TYPE_ATTACHMENT
@ AVMEDIA_TYPE_ATTACHMENT
Opaque data information usually sparse.
Definition: avutil.h:205
FFStream::pts_buffer
int64_t pts_buffer[MAX_REORDER_DELAY+1]
Definition: internal.h:286
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:256
av_inv_q
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
Definition: rational.h:159
FormatContextInternal::nb_interleaved_streams
int nb_interleaved_streams
Number of streams relevant for interleaving.
Definition: avformat_internal.h:54
av_rescale
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
Definition: mathematics.c:129
AVBSFContext::time_base_out
AVRational time_base_out
The timebase used for the timestamps of the output packets.
Definition: bsf.h:108
AVCodecParameters::coded_side_data
AVPacketSideData * coded_side_data
Additional data associated with the entire stream.
Definition: codec_par.h:81
FFStream::last_in_packet_buffer
PacketListEntry * last_in_packet_buffer
last packet in packet_buffer for this stream when muxing.
Definition: internal.h:314
AVIO_DATA_MARKER_UNKNOWN
@ AVIO_DATA_MARKER_UNKNOWN
This is any, unlabelled data.
Definition: avio.h:134
AVFMT_TS_NEGATIVE
#define AVFMT_TS_NEGATIVE
Format allows muxing negative timestamps.
Definition: avformat.h:494
AVFMT_TS_NONSTRICT
#define AVFMT_TS_NONSTRICT
Format does not require strictly increasing timestamps, but they must still be monotonic.
Definition: avformat.h:491
av_cmp_q
static int av_cmp_q(AVRational a, AVRational b)
Compare two rationals.
Definition: rational.h:89
version.h
AVBSFContext::priv_data
void * priv_data
Opaque filter-specific private data.
Definition: bsf.h:83
AVStream::disposition
int disposition
Stream disposition - a combination of AV_DISPOSITION_* flags.
Definition: avformat.h:817
FFOutputFormat::get_output_timestamp
void(* get_output_timestamp)(AVFormatContext *s, int stream, int64_t *dts, int64_t *wall)
Definition: mux.h:113
tag
uint32_t tag
Definition: movenc.c:1879
AVFMT_FLAG_BITEXACT
#define AVFMT_FLAG_BITEXACT
When muxing, try to avoid writing any random/volatile data to the output.
Definition: avformat.h:1468
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:748
FFSWAP
#define FFSWAP(type, a, b)
Definition: macros.h:52
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
interleave_compare_dts
static int interleave_compare_dts(AVFormatContext *s, const AVPacket *next, const AVPacket *pkt)
Definition: mux.c:930
avformat.h
dict.h
av_packet_side_data_new
AVPacketSideData * av_packet_side_data_new(AVPacketSideData **psd, int *pnb_sd, enum AVPacketSideDataType type, size_t size, int flags)
Allocate a new packet side data.
Definition: packet.c:707
frac_init
static void frac_init(FFFrac *f, int64_t val, int64_t num, int64_t den)
f = val + (num / den) + 0.5.
Definition: mux.c:57
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
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:28
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:754
compare
static float compare(const AVFrame *haystack, const AVFrame *obj, int offx, int offy)
Definition: vf_find_rect.c:97
AVBitStreamFilter
Definition: bsf.h:111
AVRational::den
int den
Denominator.
Definition: rational.h:60
write_packet_common
static int write_packet_common(AVFormatContext *s, AVStream *st, AVPacket *pkt, int interleaved)
Definition: mux.c:1154
AVIO_DATA_MARKER_HEADER
@ AVIO_DATA_MARKER_HEADER
Header data; this needs to be present for the stream to be decodeable.
Definition: avio.h:114
avformat_free_context
void avformat_free_context(AVFormatContext *s)
Free an AVFormatContext and all its streams.
Definition: avformat.c:149
ff_fc_internal
static av_always_inline FormatContextInternal * ff_fc_internal(AVFormatContext *s)
Definition: avformat_internal.h:107
AV_WRITE_UNCODED_FRAME_QUERY
@ AV_WRITE_UNCODED_FRAME_QUERY
Query whether the feature is possible on this stream.
Definition: mux.h:239
AVSTREAM_INIT_IN_INIT_OUTPUT
#define AVSTREAM_INIT_IN_INIT_OUTPUT
stream parameters initialized in avformat_init_output
Definition: avformat.h:2509
AVPacket::stream_index
int stream_index
Definition: packet.h:541
FFStream::index_entries
AVIndexEntry * index_entries
Only used if the format does not support seeking natively.
Definition: internal.h:188
FF_DISABLE_DEPRECATION_WARNINGS
#define FF_DISABLE_DEPRECATION_WARNINGS
Definition: internal.h:72
AVBSFContext::filter
const struct AVBitStreamFilter * filter
The bitstream filter this context is an instance of.
Definition: bsf.h:77
flush_if_needed
static void flush_if_needed(AVFormatContext *s)
Definition: mux.c:447
av_strdup
char * av_strdup(const char *s)
Duplicate a string.
Definition: mem.c:272
desc
const char * desc
Definition: libsvtav1.c:79
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
av_guess_format
const AVOutputFormat * av_guess_format(const char *short_name, const char *filename, const char *mime_type)
Return the output format in the list of registered output formats which best matches the provided par...
Definition: format.c:79
FFFrac::num
int64_t num
Definition: internal.h:60
mem.h
packet_internal.h
handle_avoid_negative_ts
static void handle_avoid_negative_ts(FFFormatContext *si, FFStream *sti, AVPacket *pkt)
Definition: mux.c:657
AVCodecParameters::video_delay
int video_delay
Video only.
Definition: codec_par.h:175
FFFormatContext::pkt
AVPacket * pkt
Used to hold temporary packets for the generic demuxing code.
Definition: internal.h:111
check_packet
static int check_packet(AVFormatContext *s, AVPacket *pkt)
Definition: mux.c:782
ff_interleave_packet_passthrough
int ff_interleave_packet_passthrough(AVFormatContext *s, AVPacket *pkt, int flush, int has_packet)
Interleave packets directly in the order in which they arrive without any sort of buffering.
Definition: mux.c:1081
av_free
#define av_free(p)
Definition: tableprint_vlc.h:33
AVDictionaryEntry
Definition: dict.h:89
SwrContext::in
AudioData in
input audio data
Definition: swresample_internal.h:146
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:55
av_interleaved_write_uncoded_frame
int av_interleaved_write_uncoded_frame(AVFormatContext *s, int stream_index, AVFrame *frame)
Write an uncoded frame to an output media file.
Definition: mux.c:1482
AVPacket
This structure stores compressed data.
Definition: packet.h:516
av_interleaved_write_frame
int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt)
Write a packet to an output media file ensuring correct interleaving.
Definition: mux.c:1283
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
av_dict_set
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:88
av_dict_copy
int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags)
Copy entries from one AVDictionary struct into another.
Definition: dict.c:237
FFStream::cur_dts
int64_t cur_dts
Definition: internal.h:349
FFOutputFormat::write_trailer
int(* write_trailer)(AVFormatContext *)
Definition: mux.h:85
frac_add
static void frac_add(FFFrac *f, int64_t incr)
Fractional addition to f: f = f + (incr / f->den).
Definition: mux.c:75
timestamp.h
AV_CODEC_ID_VP8
@ AV_CODEC_ID_VP8
Definition: codec_id.h:192
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
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
AVFMT_FLAG_FLUSH_PACKETS
#define AVFMT_FLAG_FLUSH_PACKETS
Flush the AVIOContext every packet.
Definition: avformat.h:1461
MKTAG
#define MKTAG(a, b, c, d)
Definition: macros.h:55
FFOutputFormat::init
int(* init)(AVFormatContext *)
Initialize format.
Definition: mux.h:145
avcodec_descriptor_get
const AVCodecDescriptor * avcodec_descriptor_get(enum AVCodecID id)
Definition: codec_desc.c:3759
AVFMT_AVOID_NEG_TS_AUTO
#define AVFMT_AVOID_NEG_TS_AUTO
Enabled when required by target format.
Definition: avformat.h:1688
av_opt_set_dict
int av_opt_set_dict(void *obj, AVDictionary **options)
Set all the options from a given dictionary on an object.
Definition: opt.c:1986
FFFrac
The exact value of the fractional number is: 'val + num / den'.
Definition: internal.h:59
FFFrac::den
int64_t den
Definition: internal.h:60
AVCodecTag::tag
unsigned int tag
Definition: internal.h:44
codec_desc.h
FFFormatContext::pub
AVFormatContext pub
The public context.
Definition: internal.h:68
ff_stream_add_bitstream_filter
int ff_stream_add_bitstream_filter(AVStream *st, const char *name, const char *args)
Add a bitstream filter to a stream.
Definition: mux.c:1354
FFStream::lowest_ts_allowed
int64_t lowest_ts_allowed
This is the lowest ts allowed in this track; it may be set by the muxer during init or write_header a...
Definition: internal.h:254
av_rescale_q_rnd
int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq, enum AVRounding rnd)
Rescale a 64-bit integer by 2 rational numbers with specified rounding.
Definition: mathematics.c:134
src
#define src
Definition: vp8dsp.c:248
FFOutputFormat::write_uncoded_frame
int(* write_uncoded_frame)(AVFormatContext *, int stream_index, struct AVFrame **frame, unsigned flags)
Write an uncoded AVFrame.
Definition: mux.h:129
FormatContextInternal::initialized
int initialized
Whether or not avformat_init_output has already been called.
Definition: avformat_internal.h:42
avcodec_parameters_copy
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
Copy the contents of src to dst.
Definition: codec_par.c:106
AVPacket::time_base
AVRational time_base
Time base of the packet's timestamps.
Definition: packet.h:583
MAX_REORDER_DELAY
#define MAX_REORDER_DELAY
Definition: hw_base_encode.h:28
AVPacket::side_data_elems
int side_data_elems
Definition: packet.h:551
av_fourcc2str
#define av_fourcc2str(fourcc)
Definition: avutil.h:348
AVIO_DATA_MARKER_FLUSH_POINT
@ AVIO_DATA_MARKER_FLUSH_POINT
A point in the output bytestream where the underlying AVIOContext might flush the buffer depending on...
Definition: avio.h:145
av_bsf_get_by_name
const AVBitStreamFilter * av_bsf_get_by_name(const char *name)
Definition: bitstream_filters.c:87
mux.h
ff_write_chained
int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt, AVFormatContext *src, int interleave)
Write a packet to another muxer than the one the user originally intended.
Definition: mux.c:1397
FFFormatContext::avoid_negative_ts_use_pts
int avoid_negative_ts_use_pts
Definition: internal.h:117