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