FFmpeg
ffmpeg_demux.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #include <float.h>
20 #include <stdint.h>
21 
22 #include "ffmpeg.h"
23 #include "ffmpeg_sched.h"
24 #include "ffmpeg_utils.h"
25 
26 #include "libavutil/avassert.h"
27 #include "libavutil/avstring.h"
28 #include "libavutil/display.h"
29 #include "libavutil/error.h"
30 #include "libavutil/intreadwrite.h"
31 #include "libavutil/mem.h"
32 #include "libavutil/opt.h"
33 #include "libavutil/parseutils.h"
34 #include "libavutil/pixdesc.h"
35 #include "libavutil/time.h"
36 #include "libavutil/timestamp.h"
37 
38 #include "libavcodec/bsf.h"
39 #include "libavcodec/packet.h"
40 
41 #include "libavformat/avformat.h"
42 
43 typedef struct DemuxStream {
45 
46  // name used for logging
47  char log_name[32];
48 
51 
52  double ts_scale;
53 
54  /* non zero if the packets must be decoded in 'raw_fifo', see DECODING_FOR_* */
56 #define DECODING_FOR_OST 1
57 #define DECODING_FOR_FILTER 2
58 
59  /* true if stream data should be discarded */
60  int discard;
61 
62  // scheduler returned EOF for this stream
63  int finished;
64 
72 
73 
76  /// dts of the first packet read for this stream (in AV_TIME_BASE units)
78 
79  /* predicted dts of the next packet read for this stream or (when there are
80  * several frames in a packet) of the next frame in current packet (in AV_TIME_BASE units) */
82  /// dts of the last packet read for this stream (in AV_TIME_BASE units)
84 
86 
89  char dec_name[16];
90  // decoded media properties, as estimated by opening the decoder
92 
94 
95  /* number of packets successfully read for this stream */
96  uint64_t nb_packets;
97  // combined size of all the packets read
98  uint64_t data_size;
99  // latest wallclock time at which packet reading resumed after a stall - used for readrate
101  // timestamp of first packet sent after the latest stall - used for readrate
103  // measure of how far behind packet reading is against spceified readrate
105 } DemuxStream;
106 
107 typedef struct Demuxer {
109 
110  // name used for logging
111  char log_name[32];
112 
114 
115  /**
116  * Extra timestamp offset added by discontinuity handling.
117  */
120 
123 
124  /* number of times input stream should be looped */
125  int loop;
127  /* duration of the looped segment of the input file */
129  /* pts with the smallest/largest values ever seen */
132 
133  /* number of streams that the user was warned of */
135 
136  float readrate;
139 
141 
143 
147 } Demuxer;
148 
149 typedef struct DemuxThreadContext {
150  // packet used for reading from the demuxer
152  // packet for reading from BSFs
155 
157 {
158  return (DemuxStream*)ist;
159 }
160 
162 {
163  return (Demuxer*)f;
164 }
165 
167 {
168  for (InputStream *ist = ist_iter(NULL); ist; ist = ist_iter(ist)) {
169  DemuxStream *ds = ds_from_ist(ist);
170  if (ist->par->codec_type == type && ds->discard &&
171  ist->user_set_discard != AVDISCARD_ALL)
172  return ist;
173  }
174  return NULL;
175 }
176 
177 static void report_new_stream(Demuxer *d, const AVPacket *pkt)
178 {
179  const AVStream *st = d->f.ctx->streams[pkt->stream_index];
180 
181  if (pkt->stream_index < d->nb_streams_warn)
182  return;
184  "New %s stream with index %d at pos:%"PRId64" and DTS:%ss\n",
187  d->nb_streams_warn = pkt->stream_index + 1;
188 }
189 
190 static int seek_to_start(Demuxer *d, Timestamp end_pts)
191 {
192  InputFile *ifile = &d->f;
193  AVFormatContext *is = ifile->ctx;
194  int ret;
195 
196  ret = avformat_seek_file(is, -1, INT64_MIN, is->start_time, is->start_time, 0);
197  if (ret < 0)
198  return ret;
199 
200  if (end_pts.ts != AV_NOPTS_VALUE &&
201  (d->max_pts.ts == AV_NOPTS_VALUE ||
202  av_compare_ts(d->max_pts.ts, d->max_pts.tb, end_pts.ts, end_pts.tb) < 0))
203  d->max_pts = end_pts;
204 
205  if (d->max_pts.ts != AV_NOPTS_VALUE) {
206  int64_t min_pts = d->min_pts.ts == AV_NOPTS_VALUE ? 0 : d->min_pts.ts;
207  d->duration.ts = d->max_pts.ts - av_rescale_q(min_pts, d->min_pts.tb, d->max_pts.tb);
208  }
209  d->duration.tb = d->max_pts.tb;
210 
211  if (d->loop > 0)
212  d->loop--;
213 
214  return ret;
215 }
216 
218  AVPacket *pkt)
219 {
220  InputFile *ifile = &d->f;
221  DemuxStream *ds = ds_from_ist(ist);
222  const int fmt_is_discont = ifile->ctx->iformat->flags & AVFMT_TS_DISCONT;
223  int disable_discontinuity_correction = copy_ts;
226 
227  if (copy_ts && ds->next_dts != AV_NOPTS_VALUE &&
228  fmt_is_discont && ist->st->pts_wrap_bits < 60) {
229  int64_t wrap_dts = av_rescale_q_rnd(pkt->dts + (1LL<<ist->st->pts_wrap_bits),
232  if (FFABS(wrap_dts - ds->next_dts) < FFABS(pkt_dts - ds->next_dts)/10)
233  disable_discontinuity_correction = 0;
234  }
235 
236  if (ds->next_dts != AV_NOPTS_VALUE && !disable_discontinuity_correction) {
237  int64_t delta = pkt_dts - ds->next_dts;
238  if (fmt_is_discont) {
239  if (FFABS(delta) > 1LL * dts_delta_threshold * AV_TIME_BASE ||
240  pkt_dts + AV_TIME_BASE/10 < ds->dts) {
241  d->ts_offset_discont -= delta;
242  av_log(ist, AV_LOG_WARNING,
243  "timestamp discontinuity "
244  "(stream id=%d): %"PRId64", new offset= %"PRId64"\n",
245  ist->st->id, delta, d->ts_offset_discont);
247  if (pkt->pts != AV_NOPTS_VALUE)
249  }
250  } else {
251  if (FFABS(delta) > 1LL * dts_error_threshold * AV_TIME_BASE) {
252  av_log(ist, AV_LOG_WARNING,
253  "DTS %"PRId64", next:%"PRId64" st:%d invalid dropping\n",
254  pkt->dts, ds->next_dts, pkt->stream_index);
256  }
257  if (pkt->pts != AV_NOPTS_VALUE){
259  delta = pkt_pts - ds->next_dts;
260  if (FFABS(delta) > 1LL * dts_error_threshold * AV_TIME_BASE) {
261  av_log(ist, AV_LOG_WARNING,
262  "PTS %"PRId64", next:%"PRId64" invalid dropping st:%d\n",
263  pkt->pts, ds->next_dts, pkt->stream_index);
265  }
266  }
267  }
268  } else if (ds->next_dts == AV_NOPTS_VALUE && !copy_ts &&
269  fmt_is_discont && d->last_ts != AV_NOPTS_VALUE) {
270  int64_t delta = pkt_dts - d->last_ts;
271  if (FFABS(delta) > 1LL * dts_delta_threshold * AV_TIME_BASE) {
272  d->ts_offset_discont -= delta;
273  av_log(ist, AV_LOG_DEBUG,
274  "Inter stream timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
277  if (pkt->pts != AV_NOPTS_VALUE)
279  }
280  }
281 
283 }
284 
286  AVPacket *pkt)
287 {
289  pkt->time_base);
290 
291  // apply previously-detected timestamp-discontinuity offset
292  // (to all streams, not just audio/video)
293  if (pkt->dts != AV_NOPTS_VALUE)
294  pkt->dts += offset;
295  if (pkt->pts != AV_NOPTS_VALUE)
296  pkt->pts += offset;
297 
298  // detect timestamp discontinuities for audio/video
299  if ((ist->par->codec_type == AVMEDIA_TYPE_VIDEO ||
300  ist->par->codec_type == AVMEDIA_TYPE_AUDIO) &&
301  pkt->dts != AV_NOPTS_VALUE)
302  ts_discontinuity_detect(d, ist, pkt);
303 }
304 
306 {
307  InputStream *ist = &ds->ist;
308  const AVCodecParameters *par = ist->par;
309 
310  if (!ds->saw_first_ts) {
311  ds->first_dts =
312  ds->dts = ist->st->avg_frame_rate.num ? - ist->par->video_delay * AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0;
313  if (pkt->pts != AV_NOPTS_VALUE) {
314  ds->first_dts =
316  }
317  ds->saw_first_ts = 1;
318  }
319 
320  if (ds->next_dts == AV_NOPTS_VALUE)
321  ds->next_dts = ds->dts;
322 
323  if (pkt->dts != AV_NOPTS_VALUE)
325 
326  ds->dts = ds->next_dts;
327  switch (par->codec_type) {
328  case AVMEDIA_TYPE_AUDIO:
329  av_assert1(pkt->duration >= 0);
330  if (par->sample_rate) {
331  ds->next_dts += ((int64_t)AV_TIME_BASE * par->frame_size) /
332  par->sample_rate;
333  } else {
335  }
336  break;
337  case AVMEDIA_TYPE_VIDEO:
338  if (ist->framerate.num) {
339  // TODO: Remove work-around for c99-to-c89 issue 7
340  AVRational time_base_q = AV_TIME_BASE_Q;
341  int64_t next_dts = av_rescale_q(ds->next_dts, time_base_q, av_inv_q(ist->framerate));
342  ds->next_dts = av_rescale_q(next_dts + 1, av_inv_q(ist->framerate), time_base_q);
343  } else if (pkt->duration) {
345  } else if (ist->par->framerate.num != 0) {
346  AVRational field_rate = av_mul_q(ist->par->framerate,
347  (AVRational){ 2, 1 });
348  int fields = 2;
349 
350  if (ds->codec_desc &&
352  av_stream_get_parser(ist->st))
354 
355  ds->next_dts += av_rescale_q(fields, av_inv_q(field_rate), AV_TIME_BASE_Q);
356  }
357  break;
358  }
359 
360  fd->dts_est = ds->dts;
361 
362  return 0;
363 }
364 
365 static int ts_fixup(Demuxer *d, AVPacket *pkt, FrameData *fd)
366 {
367  InputFile *ifile = &d->f;
368  InputStream *ist = ifile->streams[pkt->stream_index];
369  DemuxStream *ds = ds_from_ist(ist);
370  const int64_t start_time = ifile->start_time_effective;
372  int ret;
373 
374  pkt->time_base = ist->st->time_base;
375 
376 #define SHOW_TS_DEBUG(tag_) \
377  if (debug_ts) { \
378  av_log(ist, AV_LOG_INFO, "%s -> ist_index:%d:%d type:%s " \
379  "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s duration:%s duration_time:%s\n", \
380  tag_, ifile->index, pkt->stream_index, \
381  av_get_media_type_string(ist->st->codecpar->codec_type), \
382  av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, &pkt->time_base), \
383  av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, &pkt->time_base), \
384  av_ts2str(pkt->duration), av_ts2timestr(pkt->duration, &pkt->time_base)); \
385  }
386 
387  SHOW_TS_DEBUG("demuxer");
388 
390  ist->st->pts_wrap_bits < 64) {
391  int64_t stime, stime2;
392 
394  stime2= stime + (1ULL<<ist->st->pts_wrap_bits);
395  ds->wrap_correction_done = 1;
396 
397  if(stime2 > stime && pkt->dts != AV_NOPTS_VALUE && pkt->dts > stime + (1LL<<(ist->st->pts_wrap_bits-1))) {
398  pkt->dts -= 1ULL<<ist->st->pts_wrap_bits;
399  ds->wrap_correction_done = 0;
400  }
401  if(stime2 > stime && pkt->pts != AV_NOPTS_VALUE && pkt->pts > stime + (1LL<<(ist->st->pts_wrap_bits-1))) {
402  pkt->pts -= 1ULL<<ist->st->pts_wrap_bits;
403  ds->wrap_correction_done = 0;
404  }
405  }
406 
407  if (pkt->dts != AV_NOPTS_VALUE)
409  if (pkt->pts != AV_NOPTS_VALUE)
411 
412  if (pkt->pts != AV_NOPTS_VALUE)
413  pkt->pts *= ds->ts_scale;
414  if (pkt->dts != AV_NOPTS_VALUE)
415  pkt->dts *= ds->ts_scale;
416 
418  if (pkt->pts != AV_NOPTS_VALUE) {
419  // audio decoders take precedence for estimating total file duration
420  int64_t pkt_duration = d->have_audio_dec ? 0 : pkt->duration;
421 
422  pkt->pts += duration;
423 
424  // update max/min pts that will be used to compute total file duration
425  // when using -stream_loop
426  if (d->max_pts.ts == AV_NOPTS_VALUE ||
428  pkt->pts + pkt_duration, pkt->time_base) < 0) {
429  d->max_pts = (Timestamp){ .ts = pkt->pts + pkt_duration,
430  .tb = pkt->time_base };
431  }
432  if (d->min_pts.ts == AV_NOPTS_VALUE ||
434  pkt->pts, pkt->time_base) > 0) {
435  d->min_pts = (Timestamp){ .ts = pkt->pts,
436  .tb = pkt->time_base };
437  }
438  }
439 
440  if (pkt->dts != AV_NOPTS_VALUE)
441  pkt->dts += duration;
442 
443  SHOW_TS_DEBUG("demuxer+tsfixup");
444 
445  // detect and try to correct for timestamp discontinuities
446  ts_discontinuity_process(d, ist, pkt);
447 
448  // update estimated/predicted dts
449  ret = ist_dts_update(ds, pkt, fd);
450  if (ret < 0)
451  return ret;
452 
453  return 0;
454 }
455 
456 static int input_packet_process(Demuxer *d, AVPacket *pkt, unsigned *send_flags)
457 {
458  InputFile *f = &d->f;
459  InputStream *ist = f->streams[pkt->stream_index];
460  DemuxStream *ds = ds_from_ist(ist);
461  FrameData *fd;
462  int ret = 0;
463 
464  fd = packet_data(pkt);
465  if (!fd)
466  return AVERROR(ENOMEM);
467 
468  ret = ts_fixup(d, pkt, fd);
469  if (ret < 0)
470  return ret;
471 
472  if (d->recording_time != INT64_MAX) {
473  int64_t start_time = 0;
474  if (copy_ts) {
475  start_time += f->start_time != AV_NOPTS_VALUE ? f->start_time : 0;
476  start_time += start_at_zero ? 0 : f->start_time_effective;
477  }
478  if (ds->dts >= d->recording_time + start_time)
479  *send_flags |= DEMUX_SEND_STREAMCOPY_EOF;
480  }
481 
482  ds->data_size += pkt->size;
483  ds->nb_packets++;
484 
486 
487  if (debug_ts) {
488  av_log(ist, AV_LOG_INFO, "demuxer+ffmpeg -> ist_index:%d:%d type:%s pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s duration:%s duration_time:%s off:%s off_time:%s\n",
489  f->index, pkt->stream_index,
494  av_ts2str(f->ts_offset), av_ts2timestr(f->ts_offset, &AV_TIME_BASE_Q));
495  }
496 
497  return 0;
498 }
499 
500 static void readrate_sleep(Demuxer *d)
501 {
502  InputFile *f = &d->f;
503  int64_t file_start = copy_ts * (
504  (f->start_time_effective != AV_NOPTS_VALUE ? f->start_time_effective * !start_at_zero : 0) +
505  (f->start_time != AV_NOPTS_VALUE ? f->start_time : 0)
506  );
507  int64_t initial_burst = AV_TIME_BASE * d->readrate_initial_burst;
508  int resume_warn = 0;
509 
510  for (int i = 0; i < f->nb_streams; i++) {
511  InputStream *ist = f->streams[i];
512  DemuxStream *ds = ds_from_ist(ist);
513  int64_t stream_ts_offset, pts, now, wc_elapsed, elapsed, lag, max_pts, limit_pts;
514 
515  if (ds->discard) continue;
516 
517  stream_ts_offset = FFMAX(ds->first_dts != AV_NOPTS_VALUE ? ds->first_dts : 0, file_start);
518  pts = av_rescale(ds->dts, 1000000, AV_TIME_BASE);
519  now = av_gettime_relative();
520  wc_elapsed = now - d->wallclock_start;
521  max_pts = stream_ts_offset + initial_burst + wc_elapsed * d->readrate;
522  lag = FFMAX(max_pts - pts, 0);
523  if ( (!ds->lag && lag > 0.3 * AV_TIME_BASE) || ( lag > ds->lag + 0.3 * AV_TIME_BASE) ) {
524  ds->lag = lag;
525  ds->resume_wc = now;
526  ds->resume_pts = pts;
527  av_log_once(ds, AV_LOG_WARNING, AV_LOG_DEBUG, &resume_warn,
528  "Resumed reading at pts %0.3f with rate %0.3f after a lag of %0.3fs\n",
529  (float)pts/AV_TIME_BASE, d->readrate_catchup, (float)lag/AV_TIME_BASE);
530  }
531  if (ds->lag && !lag)
532  ds->lag = ds->resume_wc = ds->resume_pts = 0;
533  if (ds->resume_wc) {
534  elapsed = now - ds->resume_wc;
535  limit_pts = ds->resume_pts + elapsed * d->readrate_catchup;
536  } else {
537  elapsed = wc_elapsed;
538  limit_pts = max_pts;
539  }
540 
541  if (pts > limit_pts)
542  av_usleep(pts - limit_pts);
543  }
544 }
545 
546 static int do_send(Demuxer *d, DemuxStream *ds, AVPacket *pkt, unsigned flags,
547  const char *pkt_desc)
548 {
549  int ret;
550 
552 
553  ret = sch_demux_send(d->sch, d->f.index, pkt, flags);
554  if (ret == AVERROR_EOF) {
556 
557  av_log(ds, AV_LOG_VERBOSE, "All consumers of this stream are done\n");
558  ds->finished = 1;
559 
560  if (++d->nb_streams_finished == d->nb_streams_used) {
561  av_log(d, AV_LOG_VERBOSE, "All consumers are done\n");
562  return AVERROR_EOF;
563  }
564  } else if (ret < 0) {
565  if (ret != AVERROR_EXIT)
566  av_log(d, AV_LOG_ERROR,
567  "Unable to send %s packet to consumers: %s\n",
568  pkt_desc, av_err2str(ret));
569  return ret;
570  }
571 
572  return 0;
573 }
574 
576  AVPacket *pkt, unsigned flags)
577 {
578  InputFile *f = &d->f;
579  int ret;
580 
581  // pkt can be NULL only when flushing BSFs
582  av_assert0(ds->bsf || pkt);
583 
584  // send heartbeat for sub2video streams
585  if (d->pkt_heartbeat && pkt && pkt->pts != AV_NOPTS_VALUE) {
586  for (int i = 0; i < f->nb_streams; i++) {
587  DemuxStream *ds1 = ds_from_ist(f->streams[i]);
588 
589  if (ds1->finished || !ds1->have_sub2video)
590  continue;
591 
592  d->pkt_heartbeat->pts = pkt->pts;
594  d->pkt_heartbeat->opaque = (void*)(intptr_t)PKT_OPAQUE_SUB_HEARTBEAT;
595 
596  ret = do_send(d, ds1, d->pkt_heartbeat, 0, "heartbeat");
597  if (ret < 0)
598  return ret;
599  }
600  }
601 
602  if (ds->bsf) {
603  if (pkt)
605 
606  ret = av_bsf_send_packet(ds->bsf, pkt);
607  if (ret < 0) {
608  if (pkt)
610  av_log(ds, AV_LOG_ERROR, "Error submitting a packet for filtering: %s\n",
611  av_err2str(ret));
612  return ret;
613  }
614 
615  while (1) {
616  ret = av_bsf_receive_packet(ds->bsf, dt->pkt_bsf);
617  if (ret == AVERROR(EAGAIN))
618  return 0;
619  else if (ret < 0) {
620  if (ret != AVERROR_EOF)
621  av_log(ds, AV_LOG_ERROR,
622  "Error applying bitstream filters to a packet: %s\n",
623  av_err2str(ret));
624  return ret;
625  }
626 
627  dt->pkt_bsf->time_base = ds->bsf->time_base_out;
628 
629  ret = do_send(d, ds, dt->pkt_bsf, 0, "filtered");
630  if (ret < 0) {
632  return ret;
633  }
634  }
635  } else {
636  ret = do_send(d, ds, pkt, flags, "demuxed");
637  if (ret < 0)
638  return ret;
639  }
640 
641  return 0;
642 }
643 
645 {
646  InputFile *f = &d->f;
647  int ret;
648 
649  for (unsigned i = 0; i < f->nb_streams; i++) {
650  DemuxStream *ds = ds_from_ist(f->streams[i]);
651 
652  if (!ds->bsf)
653  continue;
654 
655  ret = demux_send(d, dt, ds, NULL, 0);
656  ret = (ret == AVERROR_EOF) ? 0 : (ret < 0) ? ret : AVERROR_BUG;
657  if (ret < 0) {
658  av_log(ds, AV_LOG_ERROR, "Error flushing BSFs: %s\n",
659  av_err2str(ret));
660  return ret;
661  }
662 
663  av_bsf_flush(ds->bsf);
664  }
665 
666  return 0;
667 }
668 
670 {
671  for (int j = 0; j < ifile->ctx->nb_programs; j++) {
672  AVProgram *p = ifile->ctx->programs[j];
673  int discard = AVDISCARD_ALL;
674 
675  for (int k = 0; k < p->nb_stream_indexes; k++) {
676  DemuxStream *ds = ds_from_ist(ifile->streams[p->stream_index[k]]);
677 
678  if (!ds->discard) {
679  discard = AVDISCARD_DEFAULT;
680  break;
681  }
682  }
683  p->discard = discard;
684  }
685 }
686 
688 {
689  char name[16];
690  snprintf(name, sizeof(name), "dmx%d:%s", f->index, f->ctx->iformat->name);
692 }
693 
695 {
697  av_packet_free(&dt->pkt_bsf);
698 
699  memset(dt, 0, sizeof(*dt));
700 }
701 
703 {
704  memset(dt, 0, sizeof(*dt));
705 
706  dt->pkt_demux = av_packet_alloc();
707  if (!dt->pkt_demux)
708  return AVERROR(ENOMEM);
709 
710  dt->pkt_bsf = av_packet_alloc();
711  if (!dt->pkt_bsf)
712  return AVERROR(ENOMEM);
713 
714  return 0;
715 }
716 
717 static int input_thread(void *arg)
718 {
719  Demuxer *d = arg;
720  InputFile *f = &d->f;
721 
723 
724  int ret = 0;
725 
726  ret = demux_thread_init(&dt);
727  if (ret < 0)
728  goto finish;
729 
731 
733 
734  d->read_started = 1;
736 
737  while (1) {
738  DemuxStream *ds;
739  unsigned send_flags = 0;
740 
741  ret = av_read_frame(f->ctx, dt.pkt_demux);
742 
743  if (ret == AVERROR(EAGAIN)) {
744  av_usleep(10000);
745  continue;
746  }
747  if (ret < 0) {
748  int ret_bsf;
749 
750  if (ret == AVERROR_EOF)
751  av_log(d, AV_LOG_VERBOSE, "EOF while reading input\n");
752  else {
753  av_log(d, AV_LOG_ERROR, "Error during demuxing: %s\n",
754  av_err2str(ret));
755  ret = exit_on_error ? ret : 0;
756  }
757 
758  ret_bsf = demux_bsf_flush(d, &dt);
759  ret = err_merge(ret == AVERROR_EOF ? 0 : ret, ret_bsf);
760 
761  if (d->loop) {
762  /* signal looping to our consumers */
763  dt.pkt_demux->stream_index = -1;
764  ret = sch_demux_send(d->sch, f->index, dt.pkt_demux, 0);
765  if (ret >= 0)
766  ret = seek_to_start(d, (Timestamp){ .ts = dt.pkt_demux->pts,
767  .tb = dt.pkt_demux->time_base });
768  if (ret >= 0)
769  continue;
770 
771  /* fallthrough to the error path */
772  }
773 
774  break;
775  }
776 
777  if (do_pkt_dump) {
779  f->ctx->streams[dt.pkt_demux->stream_index]);
780  }
781 
782  /* the following test is needed in case new streams appear
783  dynamically in stream : we ignore them */
784  ds = dt.pkt_demux->stream_index < f->nb_streams ?
785  ds_from_ist(f->streams[dt.pkt_demux->stream_index]) : NULL;
786  if (!ds || ds->discard || ds->finished) {
789  continue;
790  }
791 
792  if (dt.pkt_demux->flags & AV_PKT_FLAG_CORRUPT) {
794  "corrupt input packet in stream %d\n",
795  dt.pkt_demux->stream_index);
796  if (exit_on_error) {
799  break;
800  }
801  }
802 
803  ret = input_packet_process(d, dt.pkt_demux, &send_flags);
804  if (ret < 0)
805  break;
806 
807  if (d->readrate)
808  readrate_sleep(d);
809 
810  ret = demux_send(d, &dt, ds, dt.pkt_demux, send_flags);
811  if (ret < 0)
812  break;
813  }
814 
815  // EOF/EXIT is normal termination
816  if (ret == AVERROR_EOF || ret == AVERROR_EXIT)
817  ret = 0;
818 
819 finish:
820  demux_thread_uninit(&dt);
821 
822  return ret;
823 }
824 
825 static void demux_final_stats(Demuxer *d)
826 {
827  InputFile *f = &d->f;
828  uint64_t total_packets = 0, total_size = 0;
829 
830  av_log(f, AV_LOG_VERBOSE, "Input file #%d (%s):\n",
831  f->index, f->ctx->url);
832 
833  for (int j = 0; j < f->nb_streams; j++) {
834  InputStream *ist = f->streams[j];
835  DemuxStream *ds = ds_from_ist(ist);
836  enum AVMediaType type = ist->par->codec_type;
837 
838  if (ds->discard || type == AVMEDIA_TYPE_ATTACHMENT)
839  continue;
840 
841  total_size += ds->data_size;
842  total_packets += ds->nb_packets;
843 
844  av_log(f, AV_LOG_VERBOSE, " Input stream #%d:%d (%s): ",
845  f->index, j, av_get_media_type_string(type));
846  av_log(f, AV_LOG_VERBOSE, "%"PRIu64" packets read (%"PRIu64" bytes); ",
847  ds->nb_packets, ds->data_size);
848 
849  if (ds->decoding_needed) {
851  "%"PRIu64" frames decoded; %"PRIu64" decode errors",
853  if (type == AVMEDIA_TYPE_AUDIO)
854  av_log(f, AV_LOG_VERBOSE, " (%"PRIu64" samples)", ist->decoder->samples_decoded);
855  av_log(f, AV_LOG_VERBOSE, "; ");
856  }
857 
858  av_log(f, AV_LOG_VERBOSE, "\n");
859  }
860 
861  av_log(f, AV_LOG_VERBOSE, " Total: %"PRIu64" packets (%"PRIu64" bytes) demuxed\n",
862  total_packets, total_size);
863 }
864 
865 static void ist_free(InputStream **pist)
866 {
867  InputStream *ist = *pist;
868  DemuxStream *ds;
869 
870  if (!ist)
871  return;
872  ds = ds_from_ist(ist);
873 
874  dec_free(&ist->decoder);
875 
877  av_freep(&ist->filters);
879 
881 
883 
884  av_bsf_free(&ds->bsf);
885 
886  av_freep(pist);
887 }
888 
890 {
891  InputFile *f = *pf;
893 
894  if (!f)
895  return;
896 
897  if (d->read_started)
899 
900  for (int i = 0; i < f->nb_streams; i++)
901  ist_free(&f->streams[i]);
902  av_freep(&f->streams);
903 
904  avformat_close_input(&f->ctx);
905 
907 
908  av_freep(pf);
909 }
910 
911 int ist_use(InputStream *ist, int decoding_needed,
912  const ViewSpecifier *vs, SchedulerNode *src)
913 {
914  Demuxer *d = demuxer_from_ifile(ist->file);
915  DemuxStream *ds = ds_from_ist(ist);
916  int ret;
917 
918  if (ist->user_set_discard == AVDISCARD_ALL) {
919  av_log(ist, AV_LOG_ERROR, "Cannot %s a disabled input stream\n",
920  decoding_needed ? "decode" : "streamcopy");
921  return AVERROR(EINVAL);
922  }
923 
924  if (decoding_needed && !ist->dec) {
925  av_log(ist, AV_LOG_ERROR,
926  "Decoding requested, but no decoder found for: %s\n",
927  avcodec_get_name(ist->par->codec_id));
928  return AVERROR(EINVAL);
929  }
930 
931  if (ds->sch_idx_stream < 0) {
932  ret = sch_add_demux_stream(d->sch, d->f.index);
933  if (ret < 0)
934  return ret;
935  ds->sch_idx_stream = ret;
936  }
937 
938  if (ds->discard) {
939  ds->discard = 0;
940  d->nb_streams_used++;
941  }
942 
943  ist->st->discard = ist->user_set_discard;
944  ds->decoding_needed |= decoding_needed;
945  ds->streamcopy_needed |= !decoding_needed;
946 
947  if (decoding_needed && ds->sch_idx_dec < 0) {
948  int is_audio = ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO;
949  int is_unreliable = !!(d->f.ctx->iformat->flags & AVFMT_NOTIMESTAMPS);
950  int64_t use_wallclock_as_timestamps;
951 
952  ret = av_opt_get_int(d->f.ctx, "use_wallclock_as_timestamps", 0, &use_wallclock_as_timestamps);
953  if (ret < 0)
954  return ret;
955 
956  if (use_wallclock_as_timestamps)
957  is_unreliable = 0;
958 
960  (!!is_unreliable * DECODER_FLAG_TS_UNRELIABLE) |
961  (!!(d->loop && is_audio) * DECODER_FLAG_SEND_END_TS)
962 #if FFMPEG_OPT_TOP
964 #endif
965  ;
966 
967  if (ist->framerate.num) {
969  ds->dec_opts.framerate = ist->framerate;
970  } else
971  ds->dec_opts.framerate = ist->st->avg_frame_rate;
972 
973  if (ist->dec->id == AV_CODEC_ID_DVB_SUBTITLE &&
975  av_dict_set(&ds->decoder_opts, "compute_edt", "1", AV_DICT_DONT_OVERWRITE);
977  av_log(ist, AV_LOG_WARNING,
978  "Warning using DVB subtitles for filtering and output at the "
979  "same time is not fully supported, also see -compute_edt [0|1]\n");
980  }
981 
982  snprintf(ds->dec_name, sizeof(ds->dec_name), "%d:%d", ist->file->index, ist->index);
983  ds->dec_opts.name = ds->dec_name;
984 
985  ds->dec_opts.codec = ist->dec;
986  ds->dec_opts.par = ist->par;
987 
988  ds->dec_opts.log_parent = ist;
989 
991  if (!ds->decoded_params)
992  return AVERROR(ENOMEM);
993 
994  ret = dec_init(&ist->decoder, d->sch,
995  &ds->decoder_opts, &ds->dec_opts, ds->decoded_params);
996  if (ret < 0)
997  return ret;
998  ds->sch_idx_dec = ret;
999 
1001  SCH_DEC_IN(ds->sch_idx_dec));
1002  if (ret < 0)
1003  return ret;
1004 
1005  d->have_audio_dec |= is_audio;
1006  }
1007 
1008  if (decoding_needed && ist->par->codec_type == AVMEDIA_TYPE_VIDEO) {
1009  ret = dec_request_view(ist->decoder, vs, src);
1010  if (ret < 0)
1011  return ret;
1012  } else {
1013  *src = decoding_needed ?
1014  SCH_DEC_OUT(ds->sch_idx_dec, 0) :
1015  SCH_DSTREAM(d->f.index, ds->sch_idx_stream);
1016  }
1017 
1018  return 0;
1019 }
1020 
1021 int ist_filter_add(InputStream *ist, InputFilter *ifilter, int is_simple,
1023  SchedulerNode *src)
1024 {
1025  Demuxer *d = demuxer_from_ifile(ist->file);
1026  DemuxStream *ds = ds_from_ist(ist);
1027  int64_t tsoffset = 0;
1028  int ret;
1029 
1030  ret = ist_use(ist, is_simple ? DECODING_FOR_OST : DECODING_FOR_FILTER,
1031  vs, src);
1032  if (ret < 0)
1033  return ret;
1034 
1035  ret = GROW_ARRAY(ist->filters, ist->nb_filters);
1036  if (ret < 0)
1037  return ret;
1038 
1039  ist->filters[ist->nb_filters - 1] = ifilter;
1040 
1041  if (ist->par->codec_type == AVMEDIA_TYPE_VIDEO) {
1043  ist->par->nb_coded_side_data,
1045  if (ist->framerate.num > 0 && ist->framerate.den > 0) {
1046  opts->framerate = ist->framerate;
1047  opts->flags |= IFILTER_FLAG_CFR;
1048  } else
1049  opts->framerate = av_guess_frame_rate(d->f.ctx, ist->st, NULL);
1050  if (sd && sd->size >= sizeof(uint32_t) * 4) {
1051  opts->crop_top = AV_RL32(sd->data + 0);
1052  opts->crop_bottom = AV_RL32(sd->data + 4);
1053  opts->crop_left = AV_RL32(sd->data + 8);
1054  opts->crop_right = AV_RL32(sd->data + 12);
1055  if (ds->apply_cropping && ds->apply_cropping != CROP_CODEC &&
1056  (opts->crop_top | opts->crop_bottom | opts->crop_left | opts->crop_right))
1057  opts->flags |= IFILTER_FLAG_CROP;
1058  }
1059  } else if (ist->par->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1060  /* Compute the size of the canvas for the subtitles stream.
1061  If the subtitles codecpar has set a size, use it. Otherwise use the
1062  maximum dimensions of the video streams in the same file. */
1063  opts->sub2video_width = ist->par->width;
1064  opts->sub2video_height = ist->par->height;
1065  if (!(opts->sub2video_width && opts->sub2video_height)) {
1066  for (int j = 0; j < d->f.nb_streams; j++) {
1067  AVCodecParameters *par1 = d->f.streams[j]->par;
1068  if (par1->codec_type == AVMEDIA_TYPE_VIDEO) {
1069  opts->sub2video_width = FFMAX(opts->sub2video_width, par1->width);
1070  opts->sub2video_height = FFMAX(opts->sub2video_height, par1->height);
1071  }
1072  }
1073  }
1074 
1075  if (!(opts->sub2video_width && opts->sub2video_height)) {
1076  opts->sub2video_width = FFMAX(opts->sub2video_width, 720);
1077  opts->sub2video_height = FFMAX(opts->sub2video_height, 576);
1078  }
1079 
1080  if (!d->pkt_heartbeat) {
1082  if (!d->pkt_heartbeat)
1083  return AVERROR(ENOMEM);
1084  }
1085  ds->have_sub2video = 1;
1086  }
1087 
1088  ret = av_frame_copy_props(opts->fallback, ds->decoded_params);
1089  if (ret < 0)
1090  return ret;
1091  opts->fallback->format = ds->decoded_params->format;
1092  opts->fallback->width = ds->decoded_params->width;
1093  opts->fallback->height = ds->decoded_params->height;
1094 
1095  ret = av_channel_layout_copy(&opts->fallback->ch_layout, &ds->decoded_params->ch_layout);
1096  if (ret < 0)
1097  return ret;
1098 
1099  if (copy_ts) {
1100  tsoffset = d->f.start_time == AV_NOPTS_VALUE ? 0 : d->f.start_time;
1101  if (!start_at_zero && d->f.ctx->start_time != AV_NOPTS_VALUE)
1102  tsoffset += d->f.ctx->start_time;
1103  }
1104  opts->trim_start_us = ((d->f.start_time == AV_NOPTS_VALUE) || !d->accurate_seek) ?
1105  AV_NOPTS_VALUE : tsoffset;
1106  opts->trim_end_us = d->recording_time;
1107 
1108  opts->name = av_strdup(ds->dec_name);
1109  if (!opts->name)
1110  return AVERROR(ENOMEM);
1111 
1112  opts->flags |= IFILTER_FLAG_AUTOROTATE * !!(ds->autorotate) |
1115 
1116  return 0;
1117 }
1118 
1119 static int choose_decoder(const OptionsContext *o, void *logctx,
1120  AVFormatContext *s, AVStream *st,
1121  enum HWAccelID hwaccel_id, enum AVHWDeviceType hwaccel_device_type,
1122  const AVCodec **pcodec)
1123 
1124 {
1125  const char *codec_name = NULL;
1126 
1127  opt_match_per_stream_str(logctx, &o->codec_names, s, st, &codec_name);
1128  if (codec_name) {
1129  int ret = find_codec(NULL, codec_name, st->codecpar->codec_type, 0, pcodec);
1130  if (ret < 0)
1131  return ret;
1132  st->codecpar->codec_id = (*pcodec)->id;
1133  if (recast_media && st->codecpar->codec_type != (*pcodec)->type)
1134  st->codecpar->codec_type = (*pcodec)->type;
1135  return 0;
1136  } else {
1137  if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
1138  hwaccel_id == HWACCEL_GENERIC &&
1139  hwaccel_device_type != AV_HWDEVICE_TYPE_NONE) {
1140  const AVCodec *c;
1141  void *i = NULL;
1142 
1143  while ((c = av_codec_iterate(&i))) {
1144  const AVCodecHWConfig *config;
1145 
1146  if (c->id != st->codecpar->codec_id ||
1148  continue;
1149 
1150  for (int j = 0; config = avcodec_get_hw_config(c, j); j++) {
1151  if (config->device_type == hwaccel_device_type) {
1152  av_log(logctx, AV_LOG_VERBOSE, "Selecting decoder '%s' because of requested hwaccel method %s\n",
1153  c->name, av_hwdevice_get_type_name(hwaccel_device_type));
1154  *pcodec = c;
1155  return 0;
1156  }
1157  }
1158  }
1159  }
1160 
1161  *pcodec = avcodec_find_decoder(st->codecpar->codec_id);
1162  return 0;
1163  }
1164 }
1165 
1167  int guess_layout_max)
1168 {
1169  if (par->ch_layout.order == AV_CHANNEL_ORDER_UNSPEC) {
1170  char layout_name[256];
1171 
1172  if (par->ch_layout.nb_channels > guess_layout_max)
1173  return 0;
1176  return 0;
1177  av_channel_layout_describe(&par->ch_layout, layout_name, sizeof(layout_name));
1178  av_log(ist, AV_LOG_WARNING, "Guessed Channel Layout: %s\n", layout_name);
1179  }
1180  return 1;
1181 }
1182 
1185 {
1186  AVStream *st = ist->st;
1187  DemuxStream *ds = ds_from_ist(ist);
1188  AVPacketSideData *sd;
1189  double rotation = DBL_MAX;
1190  int hflip = -1, vflip = -1;
1191  int hflip_set = 0, vflip_set = 0, rotation_set = 0;
1192  int32_t *buf;
1193 
1194  opt_match_per_stream_dbl(ist, &o->display_rotations, ctx, st, &rotation);
1195  opt_match_per_stream_int(ist, &o->display_hflips, ctx, st, &hflip);
1196  opt_match_per_stream_int(ist, &o->display_vflips, ctx, st, &vflip);
1197 
1198  rotation_set = rotation != DBL_MAX;
1199  hflip_set = hflip != -1;
1200  vflip_set = vflip != -1;
1201 
1202  if (!rotation_set && !hflip_set && !vflip_set)
1203  return 0;
1204 
1208  sizeof(int32_t) * 9, 0);
1209  if (!sd) {
1210  av_log(ist, AV_LOG_FATAL, "Failed to generate a display matrix!\n");
1211  return AVERROR(ENOMEM);
1212  }
1213 
1214  buf = (int32_t *)sd->data;
1216  rotation_set ? -(rotation) : -0.0f);
1217 
1219  hflip_set ? hflip : 0,
1220  vflip_set ? vflip : 0);
1221 
1222  ds->force_display_matrix = 1;
1223 
1224  return 0;
1225 }
1226 
1227 static const char *input_stream_item_name(void *obj)
1228 {
1229  const DemuxStream *ds = obj;
1230 
1231  return ds->log_name;
1232 }
1233 
1234 static const AVClass input_stream_class = {
1235  .class_name = "InputStream",
1236  .version = LIBAVUTIL_VERSION_INT,
1237  .item_name = input_stream_item_name,
1238  .category = AV_CLASS_CATEGORY_DEMUXER,
1239 };
1240 
1242 {
1243  const char *type_str = av_get_media_type_string(st->codecpar->codec_type);
1244  InputFile *f = &d->f;
1245  DemuxStream *ds;
1246 
1247  ds = allocate_array_elem(&f->streams, sizeof(*ds), &f->nb_streams);
1248  if (!ds)
1249  return NULL;
1250 
1251  ds->sch_idx_stream = -1;
1252  ds->sch_idx_dec = -1;
1253 
1254  ds->ist.st = st;
1255  ds->ist.file = f;
1256  ds->ist.index = st->index;
1257  ds->ist.class = &input_stream_class;
1258 
1259  snprintf(ds->log_name, sizeof(ds->log_name), "%cist#%d:%d/%s",
1260  type_str ? *type_str : '?', d->f.index, st->index,
1262 
1263  return ds;
1264 }
1265 
1266 static int ist_add(const OptionsContext *o, Demuxer *d, AVStream *st, AVDictionary **opts_used)
1267 {
1268  AVFormatContext *ic = d->f.ctx;
1269  AVCodecParameters *par = st->codecpar;
1270  DemuxStream *ds;
1271  InputStream *ist;
1272  const char *framerate = NULL, *hwaccel_device = NULL;
1273  const char *hwaccel = NULL;
1274  const char *apply_cropping = NULL;
1275  const char *hwaccel_output_format = NULL;
1276  const char *codec_tag = NULL;
1277  const char *bsfs = NULL;
1278  char *next;
1279  const char *discard_str = NULL;
1280  int ret;
1281 
1282  ds = demux_stream_alloc(d, st);
1283  if (!ds)
1284  return AVERROR(ENOMEM);
1285 
1286  ist = &ds->ist;
1287 
1288  ds->discard = 1;
1289  st->discard = AVDISCARD_ALL;
1290  ds->first_dts = AV_NOPTS_VALUE;
1291  ds->next_dts = AV_NOPTS_VALUE;
1292 
1293  ds->dec_opts.time_base = st->time_base;
1294 
1295  ds->ts_scale = 1.0;
1296  opt_match_per_stream_dbl(ist, &o->ts_scale, ic, st, &ds->ts_scale);
1297 
1298  ds->autorotate = 1;
1299  opt_match_per_stream_int(ist, &o->autorotate, ic, st, &ds->autorotate);
1300 
1301  ds->apply_cropping = CROP_ALL;
1303  if (apply_cropping) {
1304  const AVOption opts[] = {
1305  { "apply_cropping", NULL, 0, AV_OPT_TYPE_INT,
1306  { .i64 = CROP_ALL }, CROP_DISABLED, CROP_CONTAINER, AV_OPT_FLAG_DECODING_PARAM, .unit = "apply_cropping" },
1307  { "none", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CROP_DISABLED }, .unit = "apply_cropping" },
1308  { "all", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CROP_ALL }, .unit = "apply_cropping" },
1309  { "codec", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CROP_CODEC }, .unit = "apply_cropping" },
1310  { "container", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CROP_CONTAINER }, .unit = "apply_cropping" },
1311  { NULL },
1312  };
1313  const AVClass class = {
1314  .class_name = "apply_cropping",
1315  .item_name = av_default_item_name,
1316  .option = opts,
1317  .version = LIBAVUTIL_VERSION_INT,
1318  };
1319  const AVClass *pclass = &class;
1320 
1322  if (ret < 0) {
1323  av_log(ist, AV_LOG_ERROR, "Invalid apply_cropping value '%s'.\n", apply_cropping);
1324  return ret;
1325  }
1326  }
1327 
1328  opt_match_per_stream_str(ist, &o->codec_tags, ic, st, &codec_tag);
1329  if (codec_tag) {
1330  uint32_t tag = strtol(codec_tag, &next, 0);
1331  if (*next) {
1332  uint8_t buf[4] = { 0 };
1333  memcpy(buf, codec_tag, FFMIN(sizeof(buf), strlen(codec_tag)));
1334  tag = AV_RL32(buf);
1335  }
1336 
1337  st->codecpar->codec_tag = tag;
1338  }
1339 
1340  if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
1341  ret = add_display_matrix_to_stream(o, ic, ist);
1342  if (ret < 0)
1343  return ret;
1344 
1345  opt_match_per_stream_str(ist, &o->hwaccels, ic, st, &hwaccel);
1347  &hwaccel_output_format);
1348  if (!hwaccel_output_format && hwaccel && !strcmp(hwaccel, "cuvid")) {
1349  av_log(ist, AV_LOG_WARNING,
1350  "WARNING: defaulting hwaccel_output_format to cuda for compatibility "
1351  "with old commandlines. This behaviour is DEPRECATED and will be removed "
1352  "in the future. Please explicitly set \"-hwaccel_output_format cuda\".\n");
1354  } else if (!hwaccel_output_format && hwaccel && !strcmp(hwaccel, "qsv")) {
1355  av_log(ist, AV_LOG_WARNING,
1356  "WARNING: defaulting hwaccel_output_format to qsv for compatibility "
1357  "with old commandlines. This behaviour is DEPRECATED and will be removed "
1358  "in the future. Please explicitly set \"-hwaccel_output_format qsv\".\n");
1360  } else if (!hwaccel_output_format && hwaccel && !strcmp(hwaccel, "mediacodec")) {
1361  // There is no real AVHWFrameContext implementation. Set
1362  // hwaccel_output_format to avoid av_hwframe_transfer_data error.
1364  } else if (hwaccel_output_format) {
1365  ds->dec_opts.hwaccel_output_format = av_get_pix_fmt(hwaccel_output_format);
1367  av_log(ist, AV_LOG_FATAL, "Unrecognised hwaccel output "
1368  "format: %s", hwaccel_output_format);
1369  }
1370  } else {
1372  }
1373 
1374  if (hwaccel) {
1375  // The NVDEC hwaccels use a CUDA device, so remap the name here.
1376  if (!strcmp(hwaccel, "nvdec") || !strcmp(hwaccel, "cuvid"))
1377  hwaccel = "cuda";
1378 
1379  if (!strcmp(hwaccel, "none"))
1381  else if (!strcmp(hwaccel, "auto"))
1383  else {
1385  if (type != AV_HWDEVICE_TYPE_NONE) {
1388  }
1389 
1390  if (!ds->dec_opts.hwaccel_id) {
1391  av_log(ist, AV_LOG_FATAL, "Unrecognized hwaccel: %s.\n",
1392  hwaccel);
1393  av_log(ist, AV_LOG_FATAL, "Supported hwaccels: ");
1395  while ((type = av_hwdevice_iterate_types(type)) !=
1397  av_log(ist, AV_LOG_FATAL, "%s ",
1399  av_log(ist, AV_LOG_FATAL, "\n");
1400  return AVERROR(EINVAL);
1401  }
1402  }
1403  }
1404 
1405  opt_match_per_stream_str(ist, &o->hwaccel_devices, ic, st, &hwaccel_device);
1406  if (hwaccel_device) {
1407  ds->dec_opts.hwaccel_device = av_strdup(hwaccel_device);
1408  if (!ds->dec_opts.hwaccel_device)
1409  return AVERROR(ENOMEM);
1410  }
1411  }
1412 
1413  ret = choose_decoder(o, ist, ic, st, ds->dec_opts.hwaccel_id,
1414  ds->dec_opts.hwaccel_device_type, &ist->dec);
1415  if (ret < 0)
1416  return ret;
1417 
1418  if (ist->dec) {
1420  ic, st, ist->dec, &ds->decoder_opts, opts_used);
1421  if (ret < 0)
1422  return ret;
1423  }
1424 
1425  ds->reinit_filters = -1;
1426  opt_match_per_stream_int(ist, &o->reinit_filters, ic, st, &ds->reinit_filters);
1427 
1428  ds->drop_changed = 0;
1429  opt_match_per_stream_int(ist, &o->drop_changed, ic, st, &ds->drop_changed);
1430 
1431  if (ds->drop_changed && ds->reinit_filters) {
1432  if (ds->reinit_filters > 0) {
1433  av_log(ist, AV_LOG_ERROR, "drop_changed and reinit_filters both enabled. These are mutually exclusive.\n");
1434  return AVERROR(EINVAL);
1435  }
1436  ds->reinit_filters = 0;
1437  }
1438 
1440 
1441  if ((o->video_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) ||
1446 
1447  opt_match_per_stream_str(ist, &o->discard, ic, st, &discard_str);
1448  if (discard_str) {
1449  ret = av_opt_set(ist->st, "discard", discard_str, 0);
1450  if (ret < 0) {
1451  av_log(ist, AV_LOG_ERROR, "Error parsing discard %s.\n", discard_str);
1452  return ret;
1453  }
1454  ist->user_set_discard = ist->st->discard;
1455  }
1456 
1458 
1459  av_dict_set_int(&ds->decoder_opts, "apply_cropping",
1460  ds->apply_cropping && ds->apply_cropping != CROP_CONTAINER, 0);
1461 
1462  if (ds->force_display_matrix) {
1463  char buf[32];
1464  if (av_dict_get(ds->decoder_opts, "side_data_prefer_packet", NULL, 0))
1465  buf[0] = ',';
1466  else
1467  buf[0] = '\0';
1468  av_strlcat(buf, "displaymatrix", sizeof(buf));
1469  av_dict_set(&ds->decoder_opts, "side_data_prefer_packet", buf, AV_DICT_APPEND);
1470  }
1471  /* Attached pics are sparse, therefore we would not want to delay their decoding
1472  * till EOF. */
1474  av_dict_set(&ds->decoder_opts, "thread_type", "-frame", 0);
1475 
1476  switch (par->codec_type) {
1477  case AVMEDIA_TYPE_VIDEO:
1478  opt_match_per_stream_str(ist, &o->frame_rates, ic, st, &framerate);
1479  if (framerate) {
1481  if (ret < 0) {
1482  av_log(ist, AV_LOG_ERROR, "Error parsing framerate %s.\n",
1483  framerate);
1484  return ret;
1485  }
1486  }
1487 
1488 #if FFMPEG_OPT_TOP
1489  ist->top_field_first = -1;
1490  opt_match_per_stream_int(ist, &o->top_field_first, ic, st, &ist->top_field_first);
1491 #endif
1492 
1493  break;
1494  case AVMEDIA_TYPE_AUDIO: {
1495  const char *ch_layout_str = NULL;
1496 
1497  opt_match_per_stream_str(ist, &o->audio_ch_layouts, ic, st, &ch_layout_str);
1498  if (ch_layout_str) {
1499  AVChannelLayout ch_layout;
1500  ret = av_channel_layout_from_string(&ch_layout, ch_layout_str);
1501  if (ret < 0) {
1502  av_log(ist, AV_LOG_ERROR, "Error parsing channel layout %s.\n", ch_layout_str);
1503  return ret;
1504  }
1505  if (par->ch_layout.nb_channels <= 0 || par->ch_layout.nb_channels == ch_layout.nb_channels) {
1507  par->ch_layout = ch_layout;
1508  } else {
1509  av_log(ist, AV_LOG_ERROR,
1510  "Specified channel layout '%s' has %d channels, but input has %d channels.\n",
1511  ch_layout_str, ch_layout.nb_channels, par->ch_layout.nb_channels);
1512  av_channel_layout_uninit(&ch_layout);
1513  return AVERROR(EINVAL);
1514  }
1515  } else {
1516  int guess_layout_max = INT_MAX;
1517  opt_match_per_stream_int(ist, &o->guess_layout_max, ic, st, &guess_layout_max);
1518  guess_input_channel_layout(ist, par, guess_layout_max);
1519  }
1520  break;
1521  }
1522  case AVMEDIA_TYPE_DATA:
1523  case AVMEDIA_TYPE_SUBTITLE: {
1524  const char *canvas_size = NULL;
1525 
1527  opt_match_per_stream_str(ist, &o->canvas_sizes, ic, st, &canvas_size);
1528  if (canvas_size) {
1529  ret = av_parse_video_size(&par->width, &par->height,
1530  canvas_size);
1531  if (ret < 0) {
1532  av_log(ist, AV_LOG_FATAL, "Invalid canvas size: %s.\n", canvas_size);
1533  return ret;
1534  }
1535  }
1536  break;
1537  }
1539  case AVMEDIA_TYPE_UNKNOWN:
1540  break;
1541  default: av_assert0(0);
1542  }
1543 
1544  ist->par = avcodec_parameters_alloc();
1545  if (!ist->par)
1546  return AVERROR(ENOMEM);
1547 
1548  ret = avcodec_parameters_copy(ist->par, par);
1549  if (ret < 0) {
1550  av_log(ist, AV_LOG_ERROR, "Error exporting stream parameters.\n");
1551  return ret;
1552  }
1553 
1554  if (ist->st->sample_aspect_ratio.num)
1556 
1557  opt_match_per_stream_str(ist, &o->bitstream_filters, ic, st, &bsfs);
1558  if (bsfs) {
1559  ret = av_bsf_list_parse_str(bsfs, &ds->bsf);
1560  if (ret < 0) {
1561  av_log(ist, AV_LOG_ERROR,
1562  "Error parsing bitstream filter sequence '%s': %s\n",
1563  bsfs, av_err2str(ret));
1564  return ret;
1565  }
1566 
1567  ret = avcodec_parameters_copy(ds->bsf->par_in, ist->par);
1568  if (ret < 0)
1569  return ret;
1570  ds->bsf->time_base_in = ist->st->time_base;
1571 
1572  ret = av_bsf_init(ds->bsf);
1573  if (ret < 0) {
1574  av_log(ist, AV_LOG_ERROR, "Error initializing bitstream filters: %s\n",
1575  av_err2str(ret));
1576  return ret;
1577  }
1578 
1579  ret = avcodec_parameters_copy(ist->par, ds->bsf->par_out);
1580  if (ret < 0)
1581  return ret;
1582  }
1583 
1585 
1586  return 0;
1587 }
1588 
1589 static int dump_attachment(InputStream *ist, const char *filename)
1590 {
1591  AVStream *st = ist->st;
1592  int ret;
1593  AVIOContext *out = NULL;
1594  const AVDictionaryEntry *e;
1595 
1596  if (!st->codecpar->extradata_size) {
1597  av_log(ist, AV_LOG_WARNING, "No extradata to dump.\n");
1598  return 0;
1599  }
1600  if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
1601  filename = e->value;
1602  if (!*filename) {
1603  av_log(ist, AV_LOG_FATAL, "No filename specified and no 'filename' tag");
1604  return AVERROR(EINVAL);
1605  }
1606 
1607  ret = assert_file_overwrite(filename);
1608  if (ret < 0)
1609  return ret;
1610 
1611  if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
1612  av_log(ist, AV_LOG_FATAL, "Could not open file %s for writing.\n",
1613  filename);
1614  return ret;
1615  }
1616 
1618  ret = avio_close(out);
1619 
1620  if (ret >= 0)
1621  av_log(ist, AV_LOG_INFO, "Wrote attachment (%d bytes) to '%s'\n",
1622  st->codecpar->extradata_size, filename);
1623 
1624  return ret;
1625 }
1626 
1627 static const char *input_file_item_name(void *obj)
1628 {
1629  const Demuxer *d = obj;
1630 
1631  return d->log_name;
1632 }
1633 
1634 static const AVClass input_file_class = {
1635  .class_name = "InputFile",
1636  .version = LIBAVUTIL_VERSION_INT,
1637  .item_name = input_file_item_name,
1638  .category = AV_CLASS_CATEGORY_DEMUXER,
1639 };
1640 
1641 static Demuxer *demux_alloc(void)
1642 {
1644 
1645  if (!d)
1646  return NULL;
1647 
1648  d->f.class = &input_file_class;
1649  d->f.index = nb_input_files - 1;
1650 
1651  snprintf(d->log_name, sizeof(d->log_name), "in#%d", d->f.index);
1652 
1653  return d;
1654 }
1655 
1656 int ifile_open(const OptionsContext *o, const char *filename, Scheduler *sch)
1657 {
1658  Demuxer *d;
1659  InputFile *f;
1660  AVFormatContext *ic;
1661  const AVInputFormat *file_iformat = NULL;
1662  int err, ret = 0;
1663  int64_t timestamp;
1664  AVDictionary *opts_used = NULL;
1665  const char* video_codec_name = NULL;
1666  const char* audio_codec_name = NULL;
1667  const char* subtitle_codec_name = NULL;
1668  const char* data_codec_name = NULL;
1669  int scan_all_pmts_set = 0;
1670 
1672  int64_t start_time_eof = o->start_time_eof;
1673  int64_t stop_time = o->stop_time;
1674  int64_t recording_time = o->recording_time;
1675 
1676  d = demux_alloc();
1677  if (!d)
1678  return AVERROR(ENOMEM);
1679 
1680  f = &d->f;
1681 
1682  ret = sch_add_demux(sch, input_thread, d);
1683  if (ret < 0)
1684  return ret;
1685  d->sch = sch;
1686 
1687  if (stop_time != INT64_MAX && recording_time != INT64_MAX) {
1688  stop_time = INT64_MAX;
1689  av_log(d, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
1690  }
1691 
1692  if (stop_time != INT64_MAX && recording_time == INT64_MAX) {
1693  int64_t start = start_time == AV_NOPTS_VALUE ? 0 : start_time;
1694  if (stop_time <= start) {
1695  av_log(d, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
1696  return AVERROR(EINVAL);
1697  } else {
1698  recording_time = stop_time - start;
1699  }
1700  }
1701 
1702  if (o->format) {
1703  if (!(file_iformat = av_find_input_format(o->format))) {
1704  av_log(d, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
1705  return AVERROR(EINVAL);
1706  }
1707  }
1708 
1709  if (!strcmp(filename, "-"))
1710  filename = "fd:";
1711 
1712  stdin_interaction &= strncmp(filename, "pipe:", 5) &&
1713  strcmp(filename, "fd:") &&
1714  strcmp(filename, "/dev/stdin");
1715 
1716  /* get default parameters from command line */
1717  ic = avformat_alloc_context();
1718  if (!ic)
1719  return AVERROR(ENOMEM);
1720  if (o->audio_sample_rate.nb_opt) {
1721  av_dict_set_int(&o->g->format_opts, "sample_rate", o->audio_sample_rate.opt[o->audio_sample_rate.nb_opt - 1].u.i, 0);
1722  }
1723  if (o->audio_channels.nb_opt) {
1724  const AVClass *priv_class;
1725  if (file_iformat && (priv_class = file_iformat->priv_class) &&
1726  av_opt_find(&priv_class, "ch_layout", NULL, 0,
1728  char buf[32];
1729  snprintf(buf, sizeof(buf), "%dC", o->audio_channels.opt[o->audio_channels.nb_opt - 1].u.i);
1730  av_dict_set(&o->g->format_opts, "ch_layout", buf, 0);
1731  }
1732  }
1733  if (o->audio_ch_layouts.nb_opt) {
1734  const AVClass *priv_class;
1735  if (file_iformat && (priv_class = file_iformat->priv_class) &&
1736  av_opt_find(&priv_class, "ch_layout", NULL, 0,
1738  av_dict_set(&o->g->format_opts, "ch_layout", o->audio_ch_layouts.opt[o->audio_ch_layouts.nb_opt - 1].u.str, 0);
1739  }
1740  }
1741  if (o->frame_rates.nb_opt) {
1742  const AVClass *priv_class;
1743  /* set the format-level framerate option;
1744  * this is important for video grabbers, e.g. x11 */
1745  if (file_iformat && (priv_class = file_iformat->priv_class) &&
1746  av_opt_find(&priv_class, "framerate", NULL, 0,
1748  av_dict_set(&o->g->format_opts, "framerate",
1749  o->frame_rates.opt[o->frame_rates.nb_opt - 1].u.str, 0);
1750  }
1751  }
1752  if (o->frame_sizes.nb_opt) {
1753  av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes.opt[o->frame_sizes.nb_opt - 1].u.str, 0);
1754  }
1755  if (o->frame_pix_fmts.nb_opt)
1756  av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts.opt[o->frame_pix_fmts.nb_opt - 1].u.str, 0);
1757 
1762 
1763  if (video_codec_name)
1765  &ic->video_codec));
1766  if (audio_codec_name)
1768  &ic->audio_codec));
1769  if (subtitle_codec_name)
1771  &ic->subtitle_codec));
1772  if (data_codec_name)
1774  &ic->data_codec));
1775  if (ret < 0) {
1777  return ret;
1778  }
1779 
1784 
1785  ic->flags |= AVFMT_FLAG_NONBLOCK;
1786  if (o->bitexact)
1787  ic->flags |= AVFMT_FLAG_BITEXACT;
1788  ic->interrupt_callback = int_cb;
1789 
1790  if (!av_dict_get(o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) {
1791  av_dict_set(&o->g->format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE);
1792  scan_all_pmts_set = 1;
1793  }
1794  /* open the input file with generic avformat function */
1795  err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
1796  if (err < 0) {
1797  if (err != AVERROR_EXIT)
1798  av_log(d, AV_LOG_ERROR,
1799  "Error opening input: %s\n", av_err2str(err));
1800  if (err == AVERROR_PROTOCOL_NOT_FOUND)
1801  av_log(d, AV_LOG_ERROR, "Did you mean file:%s?\n", filename);
1802  return err;
1803  }
1804  f->ctx = ic;
1805 
1806  av_strlcat(d->log_name, "/", sizeof(d->log_name));
1807  av_strlcat(d->log_name, ic->iformat->name, sizeof(d->log_name));
1808 
1809  if (scan_all_pmts_set)
1810  av_dict_set(&o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE);
1812 
1814  if (ret < 0)
1815  return ret;
1816 
1817  /* apply forced codec ids */
1818  for (int i = 0; i < ic->nb_streams; i++) {
1819  const AVCodec *dummy;
1821  &dummy);
1822  if (ret < 0)
1823  return ret;
1824  }
1825 
1826  if (o->find_stream_info) {
1827  AVDictionary **opts;
1828  int orig_nb_streams = ic->nb_streams;
1829 
1831  if (ret < 0)
1832  return ret;
1833 
1834  /* If not enough info to get the stream parameters, we decode the
1835  first frames to get it. (used in mpeg case for example) */
1837 
1838  for (int i = 0; i < orig_nb_streams; i++)
1839  av_dict_free(&opts[i]);
1840  av_freep(&opts);
1841 
1842  if (ret < 0) {
1843  av_log(d, AV_LOG_FATAL, "could not find codec parameters\n");
1844  if (ic->nb_streams == 0)
1845  return ret;
1846  }
1847  }
1848 
1849  if (start_time != AV_NOPTS_VALUE && start_time_eof != AV_NOPTS_VALUE) {
1850  av_log(d, AV_LOG_WARNING, "Cannot use -ss and -sseof both, using -ss\n");
1851  start_time_eof = AV_NOPTS_VALUE;
1852  }
1853 
1854  if (start_time_eof != AV_NOPTS_VALUE) {
1855  if (start_time_eof >= 0) {
1856  av_log(d, AV_LOG_ERROR, "-sseof value must be negative; aborting\n");
1857  return AVERROR(EINVAL);
1858  }
1859  if (ic->duration > 0) {
1860  start_time = start_time_eof + ic->duration;
1861  if (start_time < 0) {
1862  av_log(d, AV_LOG_WARNING, "-sseof value seeks to before start of file; ignored\n");
1864  }
1865  } else
1866  av_log(d, AV_LOG_WARNING, "Cannot use -sseof, file duration not known\n");
1867  }
1868  timestamp = (start_time == AV_NOPTS_VALUE) ? 0 : start_time;
1869  /* add the stream start time */
1870  if (!o->seek_timestamp && ic->start_time != AV_NOPTS_VALUE)
1871  timestamp += ic->start_time;
1872 
1873  /* if seeking requested, we execute it */
1874  if (start_time != AV_NOPTS_VALUE) {
1875  int64_t seek_timestamp = timestamp;
1876 
1877  if (!(ic->iformat->flags & AVFMT_SEEK_TO_PTS)) {
1878  int dts_heuristic = 0;
1879  for (int i = 0; i < ic->nb_streams; i++) {
1880  const AVCodecParameters *par = ic->streams[i]->codecpar;
1881  if (par->video_delay) {
1882  dts_heuristic = 1;
1883  break;
1884  }
1885  }
1886  if (dts_heuristic) {
1887  seek_timestamp -= 3*AV_TIME_BASE / 23;
1888  }
1889  }
1890  ret = avformat_seek_file(ic, -1, INT64_MIN, seek_timestamp, seek_timestamp, 0);
1891  if (ret < 0) {
1892  av_log(d, AV_LOG_WARNING, "could not seek to position %0.3f\n",
1893  (double)timestamp / AV_TIME_BASE);
1894  }
1895  }
1896 
1897  f->start_time = start_time;
1898  d->recording_time = recording_time;
1899  f->input_sync_ref = o->input_sync_ref;
1900  f->input_ts_offset = o->input_ts_offset;
1901  f->ts_offset = o->input_ts_offset - (copy_ts ? (start_at_zero && ic->start_time != AV_NOPTS_VALUE ? ic->start_time : 0) : timestamp);
1902  d->accurate_seek = o->accurate_seek;
1903  d->loop = o->loop;
1904  d->nb_streams_warn = ic->nb_streams;
1905 
1906  d->duration = (Timestamp){ .ts = 0, .tb = (AVRational){ 1, 1 } };
1907  d->min_pts = (Timestamp){ .ts = AV_NOPTS_VALUE, .tb = (AVRational){ 1, 1 } };
1908  d->max_pts = (Timestamp){ .ts = AV_NOPTS_VALUE, .tb = (AVRational){ 1, 1 } };
1909 
1910  d->readrate = o->readrate ? o->readrate : 0.0;
1911  if (d->readrate < 0.0f) {
1912  av_log(d, AV_LOG_ERROR, "Option -readrate is %0.3f; it must be non-negative.\n", d->readrate);
1913  return AVERROR(EINVAL);
1914  }
1915  if (o->rate_emu) {
1916  if (d->readrate) {
1917  av_log(d, AV_LOG_WARNING, "Both -readrate and -re set. Using -readrate %0.3f.\n", d->readrate);
1918  } else
1919  d->readrate = 1.0f;
1920  }
1921 
1922  if (d->readrate) {
1924  if (d->readrate_initial_burst < 0.0) {
1925  av_log(d, AV_LOG_ERROR,
1926  "Option -readrate_initial_burst is %0.3f; it must be non-negative.\n",
1928  return AVERROR(EINVAL);
1929  }
1931  if (d->readrate_catchup < d->readrate) {
1932  av_log(d, AV_LOG_ERROR,
1933  "Option -readrate_catchup is %0.3f; it must be at least equal to %0.3f.\n",
1934  d->readrate_catchup, d->readrate);
1935  return AVERROR(EINVAL);
1936  }
1937  } else {
1938  if (o->readrate_initial_burst) {
1939  av_log(d, AV_LOG_WARNING, "Option -readrate_initial_burst ignored "
1940  "since neither -readrate nor -re were given\n");
1941  }
1942  if (o->readrate_catchup) {
1943  av_log(d, AV_LOG_WARNING, "Option -readrate_catchup ignored "
1944  "since neither -readrate nor -re were given\n");
1945  }
1946  }
1947 
1948  /* Add all the streams from the given input file to the demuxer */
1949  for (int i = 0; i < ic->nb_streams; i++) {
1950  ret = ist_add(o, d, ic->streams[i], &opts_used);
1951  if (ret < 0) {
1952  av_dict_free(&opts_used);
1953  return ret;
1954  }
1955  }
1956 
1957  /* dump the file content */
1958  av_dump_format(ic, f->index, filename, 0);
1959 
1960  /* check if all codec options have been used */
1961  ret = check_avoptions_used(o->g->codec_opts, opts_used, d, 1);
1962  av_dict_free(&opts_used);
1963  if (ret < 0)
1964  return ret;
1965 
1966  for (int i = 0; i < o->dump_attachment.nb_opt; i++) {
1967  for (int j = 0; j < f->nb_streams; j++) {
1968  InputStream *ist = f->streams[j];
1969 
1970  if (check_stream_specifier(ic, ist->st, o->dump_attachment.opt[i].specifier) == 1) {
1972  if (ret < 0)
1973  return ret;
1974  }
1975  }
1976  }
1977 
1978  return 0;
1979 }
OptionsContext::readrate
float readrate
Definition: ffmpeg.h:166
flags
const SwsFlags flags[]
Definition: swscale.c:61
AV_PKT_DATA_DISPLAYMATRIX
@ AV_PKT_DATA_DISPLAYMATRIX
This side data contains a 3x3 transformation matrix describing an affine transformation that needs to...
Definition: packet.h:105
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: packet.c:433
AVCodec
AVCodec.
Definition: codec.h:172
OptionsContext::input_ts_offset
int64_t input_ts_offset
Definition: ffmpeg.h:163
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:203
DemuxStream::ist
InputStream ist
Definition: ffmpeg_demux.c:44
av_gettime_relative
int64_t av_gettime_relative(void)
Get the current time in microseconds since some unspecified starting point.
Definition: time.c:56
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:216
InputFile::start_time
int64_t start_time
Definition: ffmpeg.h:508
AV_PIX_FMT_CUDA
@ AV_PIX_FMT_CUDA
HW acceleration through CUDA.
Definition: pixfmt.h:260
AVCodecParameters::extradata
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: codec_par.h:69
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
OptionsContext::stop_time
int64_t stop_time
Definition: ffmpeg.h:191
demux_final_stats
static void demux_final_stats(Demuxer *d)
Definition: ffmpeg_demux.c:825
err_merge
static int err_merge(int err0, int err1)
Merge two return codes - return one of the error codes if at least one of them was negative,...
Definition: ffmpeg_utils.h:39
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
nb_input_files
int nb_input_files
Definition: ffmpeg.c:106
opt.h
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:51
input_stream_class
static const AVClass input_stream_class
Definition: ffmpeg_demux.c:1234
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
FrameData
Definition: ffmpeg.h:681
AVProgram::nb_stream_indexes
unsigned int nb_stream_indexes
Definition: avformat.h:1193
check_avoptions
int check_avoptions(AVDictionary *m)
Definition: cmdutils.c:1535
apply_cropping
static int apply_cropping(AVCodecContext *avctx, AVFrame *frame)
Definition: decode.c:737
out
FILE * out
Definition: movenc.c:55
DemuxStream::drop_changed
int drop_changed
Definition: ffmpeg_demux.c:71
DecoderOpts
Definition: ffmpeg.h:424
is
The official guide to swscale for confused that is
Definition: swscale.txt:28
AV_PKT_DATA_FRAME_CROPPING
@ AV_PKT_DATA_FRAME_CROPPING
The number of pixels to discard from the top/bottom/left/right border of the decoded frame to obtain ...
Definition: packet.h:340
AVCodecParameters
This struct describes the properties of an encoded stream.
Definition: codec_par.h:47
DECODER_FLAG_SEND_END_TS
@ DECODER_FLAG_SEND_END_TS
Definition: ffmpeg.h:419
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:670
AVStream::discard
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
Definition: avformat.h:815
FrameData::dts_est
int64_t dts_est
Definition: ffmpeg.h:684
sch_add_demux
int sch_add_demux(Scheduler *sch, SchThreadFunc func, void *ctx)
Add a demuxer to the scheduler.
Definition: ffmpeg_sched.c:680
input_packet_process
static int input_packet_process(Demuxer *d, AVPacket *pkt, unsigned *send_flags)
Definition: ffmpeg_demux.c:456
demux_thread_init
static int demux_thread_init(DemuxThreadContext *dt)
Definition: ffmpeg_demux.c:702
SCH_DSTREAM
#define SCH_DSTREAM(file, stream)
Definition: ffmpeg_sched.h:111
AVFMT_NOTIMESTAMPS
#define AVFMT_NOTIMESTAMPS
Format does not need / have any timestamps.
Definition: avformat.h:478
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:263
int64_t
long long int64_t
Definition: coverity.c:34
InputStream::user_set_discard
int user_set_discard
Definition: ffmpeg.h:469
DemuxStream::sch_idx_stream
int sch_idx_stream
Definition: ffmpeg_demux.c:49
OptionsContext::audio_ch_layouts
SpecifierOptList audio_ch_layouts
Definition: ffmpeg.h:154
ist_add
static int ist_add(const OptionsContext *o, Demuxer *d, AVStream *st, AVDictionary **opts_used)
Definition: ffmpeg_demux.c:1266
ist_iter
InputStream * ist_iter(InputStream *prev)
Definition: ffmpeg.c:383
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:64
DemuxStream::finished
int finished
Definition: ffmpeg_demux.c:63
InputFile::index
int index
Definition: ffmpeg.h:497
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:427
pixdesc.h
AVFormatContext::streams
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1332
AVFrame::width
int width
Definition: frame.h:499
DECODER_FLAG_FRAMERATE_FORCED
@ DECODER_FLAG_FRAMERATE_FORCED
Definition: ffmpeg.h:415
AVPacketSideData
This structure stores auxiliary information for decoding, presenting, or otherwise processing the cod...
Definition: packet.h:409
OptionsContext::display_hflips
SpecifierOptList display_hflips
Definition: ffmpeg.h:218
DecoderOpts::par
const AVCodecParameters * par
Definition: ffmpeg.h:431
ifile_close
void ifile_close(InputFile **pf)
Definition: ffmpeg_demux.c:889
DemuxStream::streamcopy_needed
int streamcopy_needed
Definition: ffmpeg_demux.c:65
av_display_matrix_flip
void av_display_matrix_flip(int32_t matrix[9], int hflip, int vflip)
Flip the input matrix horizontally and/or vertically.
Definition: display.c:66
subtitle_codec_name
static const char * subtitle_codec_name
Definition: ffplay.c:340
AV_HWDEVICE_TYPE_NONE
@ AV_HWDEVICE_TYPE_NONE
Definition: hwcontext.h:28
OptionsContext::subtitle_disable
int subtitle_disable
Definition: ffmpeg.h:201
demux_stream_alloc
static DemuxStream * demux_stream_alloc(Demuxer *d, AVStream *st)
Definition: ffmpeg_demux.c:1241
OptionsContext::readrate_catchup
float readrate_catchup
Definition: ffmpeg.h:167
AVOption
AVOption.
Definition: opt.h:429
AVStream::avg_frame_rate
AVRational avg_frame_rate
Average framerate.
Definition: avformat.h:833
DecoderOpts::hwaccel_id
enum HWAccelID hwaccel_id
Definition: ffmpeg.h:434
InputStream::nb_filters
int nb_filters
Definition: ffmpeg.h:491
AV_DICT_APPEND
#define AV_DICT_APPEND
If the entry already exists, append to it.
Definition: dict.h:82
AVCodecParameters::framerate
AVRational framerate
Video only.
Definition: codec_par.h:156
av_hwdevice_find_type_by_name
enum AVHWDeviceType av_hwdevice_find_type_by_name(const char *name)
Look up an AVHWDeviceType by name.
Definition: hwcontext.c:110
ffmpeg.h
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
float.h
DemuxStream::decoder_opts
AVDictionary * decoder_opts
Definition: ffmpeg_demux.c:87
AVFormatContext::programs
AVProgram ** programs
Definition: avformat.h:1462
av_hwdevice_iterate_types
enum AVHWDeviceType av_hwdevice_iterate_types(enum AVHWDeviceType prev)
Iterate over supported device types.
Definition: hwcontext.c:129
OptionsContext::bitexact
int bitexact
Definition: ffmpeg.h:197
av_display_rotation_set
void av_display_rotation_set(int32_t matrix[9], double angle)
Initialize a transformation matrix describing a pure clockwise rotation by the specified angle (in de...
Definition: display.c:51
AVPacket::duration
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition: packet.h:576
ViewSpecifier
Definition: ffmpeg.h:129
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: codec_par.h:59
AVDictionary
Definition: dict.c:32
AVChannelLayout::order
enum AVChannelOrder order
Channel order used in this layout.
Definition: channel_layout.h:324
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
av_read_frame
int av_read_frame(AVFormatContext *s, AVPacket *pkt)
Return the next frame of a stream.
Definition: demux.c:1534
AVFormatContext::video_codec_id
enum AVCodecID video_codec_id
Forced video codec_id.
Definition: avformat.h:1468
IFILTER_FLAG_AUTOROTATE
@ IFILTER_FLAG_AUTOROTATE
Definition: ffmpeg.h:263
OptionsContext::format
const char * format
Definition: ffmpeg.h:151
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:329
DECODER_FLAG_BITEXACT
@ DECODER_FLAG_BITEXACT
Definition: ffmpeg.h:421
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
Timestamp::ts
int64_t ts
Definition: ffmpeg_utils.h:31
tf_sess_config.config
config
Definition: tf_sess_config.py:33
file_iformat
static const AVInputFormat * file_iformat
Definition: ffplay.c:305
DemuxStream::lag
int64_t lag
Definition: ffmpeg_demux.c:104
av_packet_free
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
Definition: packet.c:75
OptionsContext::frame_pix_fmts
SpecifierOptList frame_pix_fmts
Definition: ffmpeg.h:160
AVBSFContext
The bitstream filter state.
Definition: bsf.h:68
OptionsContext::canvas_sizes
SpecifierOptList canvas_sizes
Definition: ffmpeg.h:239
Demuxer::wallclock_start
int64_t wallclock_start
Definition: ffmpeg_demux.c:113
SpecifierOpt::i
int i
Definition: cmdutils.h:171
InputStream
Definition: ffmpeg.h:460
DecoderOpts::hwaccel_output_format
enum AVPixelFormat hwaccel_output_format
Definition: ffmpeg.h:437
debug_ts
int debug_ts
Definition: ffmpeg_opt.c:70
avformat_close_input
void avformat_close_input(AVFormatContext **s)
Close an opened input AVFormatContext.
Definition: demux.c:367
AVPacketSideData::size
size_t size
Definition: packet.h:411
AVFormatContext::interrupt_callback
AVIOInterruptCB interrupt_callback
Custom interrupt callbacks for the I/O layer.
Definition: avformat.h:1534
Demuxer
Definition: ffmpeg_demux.c:107
OptionsContext::rate_emu
int rate_emu
Definition: ffmpeg.h:165
CROP_CODEC
@ CROP_CODEC
Definition: ffmpeg.h:604
dts_delta_threshold
float dts_delta_threshold
Definition: ffmpeg_opt.c:56
DemuxStream::data_size
uint64_t data_size
Definition: ffmpeg_demux.c:98
finish
static void finish(void)
Definition: movenc.c:374
bsf.h
AVFMT_SEEK_TO_PTS
#define AVFMT_SEEK_TO_PTS
Seeking is based on PTS.
Definition: avformat.h:499
OptionsContext::g
OptionGroup * g
Definition: ffmpeg.h:145
Demuxer::log_name
char log_name[32]
Definition: ffmpeg_demux.c:111
Decoder::frames_decoded
uint64_t frames_decoded
Definition: ffmpeg.h:455
Demuxer::nb_streams_finished
int nb_streams_finished
Definition: ffmpeg_demux.c:146
opt_match_per_stream_int
void opt_match_per_stream_int(void *logctx, const SpecifierOptList *sol, AVFormatContext *fc, AVStream *st, int *out)
dummy
int dummy
Definition: motion.c:66
AVProgram::discard
enum AVDiscard discard
selects which program to discard and which to feed to the caller
Definition: avformat.h:1191
DecoderOpts::log_parent
void * log_parent
Definition: ffmpeg.h:428
input_file_item_name
static const char * input_file_item_name(void *obj)
Definition: ffmpeg_demux.c:1627
AVDISCARD_NONE
@ AVDISCARD_NONE
discard nothing
Definition: defs.h:226
AVFrame::ch_layout
AVChannelLayout ch_layout
Channel layout of the audio data.
Definition: frame.h:770
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
pts
static int64_t pts
Definition: transcode_aac.c:644
OptionsContext
Definition: ffmpeg.h:144
AVBSFContext::par_out
AVCodecParameters * par_out
Parameters of the output stream.
Definition: bsf.h:96
av_opt_set
int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
Definition: opt.c:835
do_pkt_dump
int do_pkt_dump
Definition: ffmpeg_opt.c:66
Demuxer::ts_offset_discont
int64_t ts_offset_discont
Extra timestamp offset added by discontinuity handling.
Definition: ffmpeg_demux.c:118
AVRational::num
int num
Numerator.
Definition: rational.h:59
Demuxer::f
InputFile f
Definition: ffmpeg_demux.c:108
Decoder::samples_decoded
uint64_t samples_decoded
Definition: ffmpeg.h:456
InputFile
Definition: ffmpeg.h:494
DemuxStream::nb_packets
uint64_t nb_packets
Definition: ffmpeg_demux.c:96
Demuxer::nb_streams_used
int nb_streams_used
Definition: ffmpeg_demux.c:145
OptionsContext::recording_time
int64_t recording_time
Definition: ffmpeg.h:190
av_frame_alloc
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:52
AV_CODEC_ID_DVB_SUBTITLE
@ AV_CODEC_ID_DVB_SUBTITLE
Definition: codec_id.h:563
LATENCY_PROBE_DEMUX
@ LATENCY_PROBE_DEMUX
Definition: ffmpeg.h:100
OptionsContext::audio_disable
int audio_disable
Definition: ffmpeg.h:200
check_stream_specifier
int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec)
Check if the given stream matches a stream specifier.
Definition: cmdutils.c:1339
avassert.h
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:210
ifile_open
int ifile_open(const OptionsContext *o, const char *filename, Scheduler *sch)
Definition: ffmpeg_demux.c:1656
AVInputFormat
Definition: avformat.h:544
AV_PKT_FLAG_CORRUPT
#define AV_PKT_FLAG_CORRUPT
The packet content is corrupted.
Definition: packet.h:614
OptionGroup::codec_opts
AVDictionary * codec_opts
Definition: cmdutils.h:343
av_dump_format
void av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output)
Print detailed information about the input or output format, such as duration, bitrate,...
Definition: dump.c:848
OptionsContext::hwaccel_output_formats
SpecifierOptList hwaccel_output_formats
Definition: ffmpeg.h:178
SpecifierOptList::nb_opt
int nb_opt
Definition: cmdutils.h:181
CROP_DISABLED
@ CROP_DISABLED
Definition: ffmpeg.h:602
duration
int64_t duration
Definition: movenc.c:65
avformat_open_input
int avformat_open_input(AVFormatContext **ps, const char *url, const AVInputFormat *fmt, AVDictionary **options)
Open an input stream and read the header.
Definition: demux.c:221
AVCodecParameters::frame_size
int frame_size
Audio only.
Definition: codec_par.h:195
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:60
av_channel_layout_describe
int av_channel_layout_describe(const AVChannelLayout *channel_layout, char *buf, size_t buf_size)
Get a human-readable string describing the channel layout properties.
Definition: channel_layout.c:653
HWACCEL_GENERIC
@ HWACCEL_GENERIC
Definition: ffmpeg.h:85
assert_file_overwrite
int assert_file_overwrite(const char *filename)
Definition: ffmpeg_opt.c:748
SpecifierOpt::specifier
char * specifier
Definition: cmdutils.h:165
AVCodecDescriptor
This struct describes the properties of a single codec described by an AVCodecID.
Definition: codec_desc.h:38
intreadwrite.h
AVFormatContext::video_codec
const struct AVCodec * video_codec
Forced video codec.
Definition: avformat.h:1786
s
#define s(width, name)
Definition: cbs_vp9.c:198
DemuxStream::first_dts
int64_t first_dts
dts of the first packet read for this stream (in AV_TIME_BASE units)
Definition: ffmpeg_demux.c:77
Demuxer::readrate
float readrate
Definition: ffmpeg_demux.c:136
av_bsf_flush
void av_bsf_flush(AVBSFContext *ctx)
Reset the internal bitstream filter state.
Definition: bsf.c:190
InputStream::framerate
AVRational framerate
Definition: ffmpeg.h:481
AVFormatContext::flags
int flags
Flags modifying the (de)muxer behaviour.
Definition: avformat.h:1415
AVCodecParameters::sample_aspect_ratio
AVRational sample_aspect_ratio
Video only.
Definition: codec_par.h:144
AVFormatContext::nb_programs
unsigned int nb_programs
Definition: avformat.h:1461
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:549
dec_init
int dec_init(Decoder **pdec, Scheduler *sch, AVDictionary **dec_opts, const DecoderOpts *o, AVFrame *param_out)
Definition: ffmpeg_dec.c:1652
AVFormatContext::iformat
const struct AVInputFormat * iformat
The input container format.
Definition: avformat.h:1276
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:201
AVCodecParameters::width
int width
Video only.
Definition: codec_par.h:134
OptionsContext::hwaccel_devices
SpecifierOptList hwaccel_devices
Definition: ffmpeg.h:177
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:119
sch_add_demux_stream
int sch_add_demux_stream(Scheduler *sch, unsigned demux_idx)
Add a demuxed stream for a previously added demuxer.
Definition: ffmpeg_sched.c:707
av_q2d
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition: rational.h:104
Demuxer::readrate_initial_burst
double readrate_initial_burst
Definition: ffmpeg_demux.c:137
InputFilter
Definition: ffmpeg.h:355
DemuxStream::ts_scale
double ts_scale
Definition: ffmpeg_demux.c:52
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:41
AVHWDeviceType
AVHWDeviceType
Definition: hwcontext.h:27
AVIO_FLAG_WRITE
#define AVIO_FLAG_WRITE
write-only
Definition: avio.h:618
discard_unused_programs
static void discard_unused_programs(InputFile *ifile)
Definition: ffmpeg_demux.c:669
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
AVPacketSideData::data
uint8_t * data
Definition: packet.h:410
DemuxThreadContext
Definition: ffmpeg_demux.c:149
ctx
AVFormatContext * ctx
Definition: movenc.c:49
AVBSFContext::time_base_in
AVRational time_base_in
The timebase used for the timestamps of the input packets.
Definition: bsf.h:102
InputStream::filters
InputFilter ** filters
Definition: ffmpeg.h:490
demux_send
static int demux_send(Demuxer *d, DemuxThreadContext *dt, DemuxStream *ds, AVPacket *pkt, unsigned flags)
Definition: ffmpeg_demux.c:575
Demuxer::nb_streams_warn
int nb_streams_warn
Definition: ffmpeg_demux.c:134
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
OptionsContext::fix_sub_duration
SpecifierOptList fix_sub_duration
Definition: ffmpeg.h:237
DecoderOpts::hwaccel_device
char * hwaccel_device
Definition: ffmpeg.h:436
input_stream_item_name
static const char * input_stream_item_name(void *obj)
Definition: ffmpeg_demux.c:1227
ffmpeg_utils.h
av_hwdevice_get_type_name
const char * av_hwdevice_get_type_name(enum AVHWDeviceType type)
Get the string name of an AVHWDeviceType.
Definition: hwcontext.c:120
OptionsContext::accurate_seek
int accurate_seek
Definition: ffmpeg.h:169
av_usleep
int av_usleep(unsigned usec)
Sleep for a period of time.
Definition: time.c:84
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:202
AV_ROUND_NEAR_INF
@ AV_ROUND_NEAR_INF
Round to nearest and halfway cases away from zero.
Definition: mathematics.h:135
AVPacket::opaque
void * opaque
for some private data of the user
Definition: packet.h:583
AVFormatContext::data_codec
const struct AVCodec * data_codec
Forced data codec.
Definition: avformat.h:1810
SCH_DEC_IN
#define SCH_DEC_IN(decoder)
Definition: ffmpeg_sched.h:117
AV_ROUND_PASS_MINMAX
@ AV_ROUND_PASS_MINMAX
Flag telling rescaling functions to pass INT64_MIN/MAX through unchanged, avoiding special cases for ...
Definition: mathematics.h:159
Demuxer::duration
Timestamp duration
Definition: ffmpeg_demux.c:128
DemuxThreadContext::pkt_demux
AVPacket * pkt_demux
Definition: ffmpeg_demux.c:151
AV_PIX_FMT_MEDIACODEC
@ AV_PIX_FMT_MEDIACODEC
hardware decoding through MediaCodec
Definition: pixfmt.h:316
arg
const char * arg
Definition: jacosubdec.c:67
AV_CLASS_CATEGORY_DEMUXER
@ AV_CLASS_CATEGORY_DEMUXER
Definition: log.h:33
AVCodecDescriptor::props
int props
Codec properties, a combination of AV_CODEC_PROP_* flags.
Definition: codec_desc.h:54
fields
the definition of that something depends on the semantic of the filter The callback must examine the status of the filter s links and proceed accordingly The status of output links is stored in the status_in and status_out fields and tested by the then the processing requires a frame on this link and the filter is expected to make efforts in that direction The status of input links is stored by the fifo and status_out fields
Definition: filter_design.txt:155
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:74
AVCodecParserContext::repeat_pict
int repeat_pict
This field is used for proper frame duration computation in lavf.
Definition: avcodec.h:2593
OptionsContext::start_time
int64_t start_time
Definition: ffmpeg.h:148
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:232
AVFormatContext
Format I/O context.
Definition: avformat.h:1264
DECODING_FOR_OST
#define DECODING_FOR_OST
Definition: ffmpeg_demux.c:56
AVFormatContext::audio_codec_id
enum AVCodecID audio_codec_id
Forced audio codec_id.
Definition: avformat.h:1474
OptionGroup::format_opts
AVDictionary * format_opts
Definition: cmdutils.h:344
opts
AVDictionary * opts
Definition: movenc.c:51
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:767
framerate
float framerate
Definition: av1_levels.c:29
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
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
demuxer_from_ifile
static Demuxer * demuxer_from_ifile(InputFile *f)
Definition: ffmpeg_demux.c:161
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
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:783
NULL
#define NULL
Definition: coverity.c:32
Demuxer::readrate_catchup
float readrate_catchup
Definition: ffmpeg_demux.c:138
dec_request_view
int dec_request_view(Decoder *dec, const ViewSpecifier *vs, SchedulerNode *src)
Definition: ffmpeg_dec.c:1025
Decoder::decode_errors
uint64_t decode_errors
Definition: ffmpeg.h:457
av_frame_copy_props
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition: frame.c:599
InputStream::top_field_first
int top_field_first
Definition: ffmpeg.h:483
InputStream::st
AVStream * st
Definition: ffmpeg.h:468
avcodec_parameters_free
void avcodec_parameters_free(AVCodecParameters **ppar)
Free an AVCodecParameters instance and everything associated with it and write NULL to the supplied p...
Definition: codec_par.c:67
av_bsf_receive_packet
int av_bsf_receive_packet(AVBSFContext *ctx, AVPacket *pkt)
Retrieve a filtered packet.
Definition: bsf.c:230
OptionsContext::audio_channels
SpecifierOptList audio_channels
Definition: ffmpeg.h:155
InputFile::start_time_effective
int64_t start_time_effective
Effective format start time based on enabled streams.
Definition: ffmpeg.h:505
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
filter_codec_opts
int filter_codec_opts(const AVDictionary *opts, enum AVCodecID codec_id, AVFormatContext *s, AVStream *st, const AVCodec *codec, AVDictionary **dst, AVDictionary **opts_used)
Filter out options for given codec.
Definition: cmdutils.c:1353
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:241
Demuxer::recording_time
int64_t recording_time
Definition: ffmpeg_demux.c:121
parseutils.h
AVProgram::stream_index
unsigned int * stream_index
Definition: avformat.h:1192
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:824
OptionsContext::reinit_filters
SpecifierOptList reinit_filters
Definition: ffmpeg.h:235
AV_OPT_SEARCH_FAKE_OBJ
#define AV_OPT_SEARCH_FAKE_OBJ
The obj passed to av_opt_find() is fake – only a double pointer to AVClass instead of a required poin...
Definition: opt.h:613
OptionsContext::dump_attachment
SpecifierOptList dump_attachment
Definition: ffmpeg.h:175
InputStream::fix_sub_duration
int fix_sub_duration
Definition: ffmpeg.h:486
FrameData::wallclock
int64_t wallclock[LATENCY_PROBE_NB]
Definition: ffmpeg.h:698
AV_DICT_DONT_OVERWRITE
#define AV_DICT_DONT_OVERWRITE
Don't overwrite existing entries.
Definition: dict.h:81
time.h
DEMUX_SEND_STREAMCOPY_EOF
@ DEMUX_SEND_STREAMCOPY_EOF
Treat the packet as an EOF for SCH_NODE_TYPE_MUX destinations send normally to other types.
Definition: ffmpeg_sched.h:338
OptionsContext::display_vflips
SpecifierOptList display_vflips
Definition: ffmpeg.h:219
DemuxThreadContext::pkt_bsf
AVPacket * pkt_bsf
Definition: ffmpeg_demux.c:153
InputFilterOptions
Definition: ffmpeg.h:270
av_opt_get_int
int av_opt_get_int(void *obj, const char *name, int search_flags, int64_t *out_val)
Definition: opt.c:1273
AV_PIX_FMT_QSV
@ AV_PIX_FMT_QSV
HW acceleration through QSV, data[3] contains a pointer to the mfxFrameSurface1 structure.
Definition: pixfmt.h:247
Demuxer::read_started
int read_started
Definition: ffmpeg_demux.c:144
AVCodecParameters::ch_layout
AVChannelLayout ch_layout
Audio only.
Definition: codec_par.h:180
OptionsContext::input_sync_ref
int input_sync_ref
Definition: ffmpeg.h:171
report_new_stream
static void report_new_stream(Demuxer *d, const AVPacket *pkt)
Definition: ffmpeg_demux.c:177
guess_input_channel_layout
static int guess_input_channel_layout(InputStream *ist, AVCodecParameters *par, int guess_layout_max)
Definition: ffmpeg_demux.c:1166
DECODER_FLAG_FIX_SUB_DURATION
@ DECODER_FLAG_FIX_SUB_DURATION
Definition: ffmpeg.h:410
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
AVCodecParameters::sample_rate
int sample_rate
Audio only.
Definition: codec_par.h:184
Demuxer::sch
Scheduler * sch
Definition: ffmpeg_demux.c:140
find_codec
int find_codec(void *logctx, const char *name, enum AVMediaType type, int encoder, const AVCodec **codec)
Definition: ffmpeg_opt.c:715
AVFormatContext::audio_codec
const struct AVCodec * audio_codec
Forced audio codec.
Definition: avformat.h:1794
InputStream::par
AVCodecParameters * par
Codec parameters - to be used by the decoding/streamcopy code.
Definition: ffmpeg.h:476
input_files
InputFile ** input_files
Definition: ffmpeg.c:105
error.h
Scheduler
Definition: ffmpeg_sched.c:275
av_packet_side_data_get
const AVPacketSideData * av_packet_side_data_get(const AVPacketSideData *sd, int nb_sd, enum AVPacketSideDataType type)
Get side information from a side data array.
Definition: packet.c:660
avcodec_find_decoder
const AVCodec * avcodec_find_decoder(enum AVCodecID id)
Find a registered decoder with a matching codec ID.
Definition: allcodecs.c:1027
recast_media
int recast_media
Definition: ffmpeg_opt.c:91
AVCodecParameters::extradata_size
int extradata_size
Size of the extradata content in bytes.
Definition: codec_par.h:73
AVFormatContext::nb_streams
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
Definition: avformat.h:1320
DemuxStream::dts
int64_t dts
dts of the last packet read for this stream (in AV_TIME_BASE units)
Definition: ffmpeg_demux.c:83
av_codec_is_decoder
int av_codec_is_decoder(const AVCodec *codec)
Definition: utils.c:85
avformat_find_stream_info
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
Read packets of a media file to get stream information.
Definition: demux.c:2512
av_opt_find
const AVOption * av_opt_find(void *obj, const char *name, const char *unit, int opt_flags, int search_flags)
Look for an option in an object.
Definition: opt.c:1991
OptionsContext::discard
SpecifierOptList discard
Definition: ffmpeg.h:246
IFILTER_FLAG_REINIT
@ IFILTER_FLAG_REINIT
Definition: ffmpeg.h:264
f
f
Definition: af_crystalizer.c:122
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
av_ts2timestr
#define av_ts2timestr(ts, tb)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: timestamp.h:83
seek_to_start
static int seek_to_start(Demuxer *d, Timestamp end_pts)
Definition: ffmpeg_demux.c:190
AVMediaType
AVMediaType
Definition: avutil.h:198
AVPacket::size
int size
Definition: packet.h:559
avformat_alloc_context
AVFormatContext * avformat_alloc_context(void)
Allocate an AVFormatContext.
Definition: options.c:162
AVDISCARD_DEFAULT
@ AVDISCARD_DEFAULT
discard useless packets like 0 size packets in avi
Definition: defs.h:227
AVChannelLayout
An AVChannelLayout holds information about the channel layout of audio data.
Definition: channel_layout.h:319
DemuxStream::have_sub2video
int have_sub2video
Definition: ffmpeg_demux.c:66
av_bsf_send_packet
int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt)
Submit a packet for filtering.
Definition: bsf.c:202
DemuxStream::resume_pts
int64_t resume_pts
Definition: ffmpeg_demux.c:102
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
start_time
static int64_t start_time
Definition: ffplay.c:326
Demuxer::pkt_heartbeat
AVPacket * pkt_heartbeat
Definition: ffmpeg_demux.c:142
DemuxStream::decoding_needed
int decoding_needed
Definition: ffmpeg_demux.c:55
OptionsContext::apply_cropping
SpecifierOptList apply_cropping
Definition: ffmpeg.h:180
demux_thread_uninit
static void demux_thread_uninit(DemuxThreadContext *dt)
Definition: ffmpeg_demux.c:694
copy_ts
int copy_ts
Definition: ffmpeg_opt.c:67
avformat_seek_file
int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
Seek to timestamp ts.
Definition: seek.c:664
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:247
AV_CODEC_PROP_FIELDS
#define AV_CODEC_PROP_FIELDS
Video codec supports separate coding of fields in interlaced frames.
Definition: codec_desc.h:97
OptionsContext::seek_timestamp
int seek_timestamp
Definition: ffmpeg.h:150
input_file_class
static const AVClass input_file_class
Definition: ffmpeg_demux.c:1634
DECODING_FOR_FILTER
#define DECODING_FOR_FILTER
Definition: ffmpeg_demux.c:57
ist_use
int ist_use(InputStream *ist, int decoding_needed, const ViewSpecifier *vs, SchedulerNode *src)
Definition: ffmpeg_demux.c:911
AVFrame::format
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
Definition: frame.h:514
AVMEDIA_TYPE_UNKNOWN
@ AVMEDIA_TYPE_UNKNOWN
Usually treated as AVMEDIA_TYPE_DATA.
Definition: avutil.h:199
DemuxStream::bsf
AVBSFContext * bsf
Definition: ffmpeg_demux.c:93
AVStream::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
Definition: avformat.h:822
OptionsContext::readrate_initial_burst
double readrate_initial_burst
Definition: ffmpeg.h:168
allocate_array_elem
void * allocate_array_elem(void *ptr, size_t elem_size, int *nb_elems)
Atomically add a new element to an array of pointers, i.e.
Definition: cmdutils.c:1470
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:557
avio_write
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
Definition: aviobuf.c:206
OptionsContext::find_stream_info
int find_stream_info
Definition: ffmpeg.h:172
OptionsContext::display_rotations
SpecifierOptList display_rotations
Definition: ffmpeg.h:217
DemuxStream::autorotate
int autorotate
Definition: ffmpeg_demux.c:68
DemuxStream::sch_idx_dec
int sch_idx_dec
Definition: ffmpeg_demux.c:50
SpecifierOptList::opt
SpecifierOpt * opt
Definition: cmdutils.h:180
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
opt_match_per_stream_dbl
void opt_match_per_stream_dbl(void *logctx, const SpecifierOptList *sol, AVFormatContext *fc, AVStream *st, double *out)
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:564
av_packet_alloc
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
Definition: packet.c:64
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:233
OptionsContext::ts_scale
SpecifierOptList ts_scale
Definition: ffmpeg.h:174
av_parse_video_size
int av_parse_video_size(int *width_ptr, int *height_ptr, const char *str)
Parse str and put in width_ptr and height_ptr the detected values.
Definition: parseutils.c:150
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:537
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:221
video_codec_name
static const char * video_codec_name
Definition: ffplay.c:341
DemuxStream::next_dts
int64_t next_dts
Definition: ffmpeg_demux.c:81
AVCodec::id
enum AVCodecID id
Definition: codec.h:186
CROP_CONTAINER
@ CROP_CONTAINER
Definition: ffmpeg.h:605
av_channel_layout_default
void av_channel_layout_default(AVChannelLayout *ch_layout, int nb_channels)
Get the default channel layout for a given number of channels.
Definition: channel_layout.c:839
avcodec_parameters_alloc
AVCodecParameters * avcodec_parameters_alloc(void)
Allocate a new AVCodecParameters and set its fields to default values (unknown/invalid/0).
Definition: codec_par.c:57
avcodec_get_name
const char * avcodec_get_name(enum AVCodecID id)
Get the name of a codec.
Definition: utils.c:406
HWACCEL_AUTO
@ HWACCEL_AUTO
Definition: ffmpeg.h:84
DemuxStream
Definition: ffmpeg_demux.c:43
av_parse_video_rate
int av_parse_video_rate(AVRational *rate, const char *arg)
Parse str and store the detected values in *rate.
Definition: parseutils.c:181
CROP_ALL
@ CROP_ALL
Definition: ffmpeg.h:603
DemuxStream::dec_name
char dec_name[16]
Definition: ffmpeg_demux.c:89
av_channel_layout_from_string
int av_channel_layout_from_string(AVChannelLayout *channel_layout, const char *str)
Initialize a channel layout from a given string description.
Definition: channel_layout.c:312
DemuxStream::apply_cropping
int apply_cropping
Definition: ffmpeg_demux.c:69
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
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:551
OptionsContext::frame_rates
SpecifierOptList frame_rates
Definition: ffmpeg.h:157
setup_find_stream_info_opts
int setup_find_stream_info_opts(AVFormatContext *s, AVDictionary *local_codec_opts, AVDictionary ***dst)
Setup AVCodecContext options for avformat_find_stream_info().
Definition: cmdutils.c:1421
OptionsContext::codec_names
SpecifierOptList codec_names
Definition: ffmpeg.h:153
packet.h
demux_bsf_flush
static int demux_bsf_flush(Demuxer *d, DemuxThreadContext *dt)
Definition: ffmpeg_demux.c:644
AVFormatContext::subtitle_codec
const struct AVCodec * subtitle_codec
Forced subtitle codec.
Definition: avformat.h:1802
AVCodecParameters::height
int height
Definition: codec_par.h:135
OptionsContext::autorotate
SpecifierOptList autorotate
Definition: ffmpeg.h:179
AV_TIME_BASE
#define AV_TIME_BASE
Internal time base represented as integer.
Definition: avutil.h:253
DecoderOpts::time_base
AVRational time_base
Definition: ffmpeg.h:439
SHOW_TS_DEBUG
#define SHOW_TS_DEBUG(tag_)
OptionsContext::start_time_eof
int64_t start_time_eof
Definition: ffmpeg.h:149
display.h
SCH_DEC_OUT
#define SCH_DEC_OUT(decoder, out_idx)
Definition: ffmpeg_sched.h:120
exit_on_error
int exit_on_error
Definition: ffmpeg_opt.c:71
Demuxer::have_audio_dec
int have_audio_dec
Definition: ffmpeg_demux.c:126
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:57
DemuxStream::force_display_matrix
int force_display_matrix
Definition: ffmpeg_demux.c:70
delta
float delta
Definition: vorbis_enc_data.h:430
AVMEDIA_TYPE_ATTACHMENT
@ AVMEDIA_TYPE_ATTACHMENT
Opaque data information usually sparse.
Definition: avutil.h:204
DemuxStream::resume_wc
int64_t resume_wc
Definition: ffmpeg_demux.c:100
InputFile::ctx
AVFormatContext * ctx
Definition: ffmpeg.h:499
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
OptionsContext::hwaccels
SpecifierOptList hwaccels
Definition: ffmpeg.h:176
AVProgram
New fields can be added to the end with minor version bumps.
Definition: avformat.h:1188
av_inv_q
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
Definition: rational.h:159
IFILTER_FLAG_DROPCHANGED
@ IFILTER_FLAG_DROPCHANGED
Definition: ffmpeg.h:267
SchedulerNode
Definition: ffmpeg_sched.h:103
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
int_cb
const AVIOInterruptCB int_cb
Definition: ffmpeg.c:308
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
DemuxStream::discard
int discard
Definition: ffmpeg_demux.c:60
AVFMT_FLAG_NONBLOCK
#define AVFMT_FLAG_NONBLOCK
Do not block when reading packets from input.
Definition: avformat.h:1418
av_codec_iterate
const AVCodec * av_codec_iterate(void **opaque)
Iterate over all registered codecs.
Definition: allcodecs.c:978
sch_connect
int sch_connect(Scheduler *sch, SchedulerNode src, SchedulerNode dst)
Definition: ffmpeg_sched.c:919
ist_find_unused
InputStream * ist_find_unused(enum AVMediaType type)
Find an unused input stream of given type.
Definition: ffmpeg_demux.c:166
Timestamp::tb
AVRational tb
Definition: ffmpeg_utils.h:32
InputStream::decoder
Decoder * decoder
Definition: ffmpeg.h:477
AVStream::disposition
int disposition
Stream disposition - a combination of AV_DISPOSITION_* flags.
Definition: avformat.h:813
DemuxStream::codec_desc
const AVCodecDescriptor * codec_desc
Definition: ffmpeg_demux.c:85
ts_discontinuity_process
static void ts_discontinuity_process(Demuxer *d, InputStream *ist, AVPacket *pkt)
Definition: ffmpeg_demux.c:285
tag
uint32_t tag
Definition: movenc.c:1957
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:756
AVFMT_FLAG_BITEXACT
#define AVFMT_FLAG_BITEXACT
When muxing, try to avoid writing any random/volatile data to the output.
Definition: avformat.h:1432
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:744
AV_LOG_FATAL
#define AV_LOG_FATAL
Something went wrong and recovery is not possible.
Definition: log.h:204
dec_free
void dec_free(Decoder **pdec)
Definition: ffmpeg_dec.c:118
av_guess_frame_rate
AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *frame)
Guess the frame rate, based on both the container and codec information.
Definition: avformat.c:683
DemuxStream::wrap_correction_done
int wrap_correction_done
Definition: ffmpeg_demux.c:74
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:81
av_strlcat
size_t av_strlcat(char *dst, const char *src, size_t size)
Append the string src to the string dst, but to a total length of no more than size - 1 bytes,...
Definition: avstring.c:95
av_opt_eval_int
int av_opt_eval_int(void *obj, const AVOption *o, const char *val, int *int_out)
Demuxer::loop
int loop
Definition: ffmpeg_demux.c:125
InputFile::streams
InputStream ** streams
Definition: ffmpeg.h:513
add_display_matrix_to_stream
static int add_display_matrix_to_stream(const OptionsContext *o, AVFormatContext *ctx, InputStream *ist)
Definition: ffmpeg_demux.c:1183
hwaccel
static const char * hwaccel
Definition: ffplay.c:353
DECODER_FLAG_TOP_FIELD_FIRST
@ DECODER_FLAG_TOP_FIELD_FIRST
Definition: ffmpeg.h:417
Demuxer::accurate_seek
int accurate_seek
Definition: ffmpeg_demux.c:122
avformat.h
HWAccelID
HWAccelID
Definition: ffmpeg.h:82
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:710
choose_decoder
static int choose_decoder(const OptionsContext *o, void *logctx, AVFormatContext *s, AVStream *st, enum HWAccelID hwaccel_id, enum AVHWDeviceType hwaccel_device_type, const AVCodec **pcodec)
Definition: ffmpeg_demux.c:1119
OptionsContext::drop_changed
SpecifierOptList drop_changed
Definition: ffmpeg.h:236
check_avoptions_used
int check_avoptions_used(const AVDictionary *opts, const AVDictionary *opts_used, void *logctx, int decode)
Definition: ffmpeg.c:484
remove_avoptions
void remove_avoptions(AVDictionary **a, AVDictionary *b)
Definition: cmdutils.c:1526
AV_DICT_MATCH_CASE
#define AV_DICT_MATCH_CASE
Only get an entry with exact-case key match.
Definition: dict.h:74
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
av_get_pix_fmt
enum AVPixelFormat av_get_pix_fmt(const char *name)
Return the pixel format corresponding to name.
Definition: pixdesc.c:3379
AVFormatContext::data_codec_id
enum AVCodecID data_codec_id
Forced Data codec_id.
Definition: avformat.h:1486
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
AVFrame::height
int height
Definition: frame.h:499
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:750
IFILTER_FLAG_CROP
@ IFILTER_FLAG_CROP
Definition: ffmpeg.h:266
InputFile::class
const AVClass * class
Definition: ffmpeg.h:495
OptionsContext::audio_sample_rate
SpecifierOptList audio_sample_rate
Definition: ffmpeg.h:156
audio_codec_name
static const char * audio_codec_name
Definition: ffplay.c:339
sch_demux_send
int sch_demux_send(Scheduler *sch, unsigned demux_idx, AVPacket *pkt, unsigned flags)
Called by demuxer tasks to communicate with their downstreams.
Definition: ffmpeg_sched.c:2029
ts_discontinuity_detect
static void ts_discontinuity_detect(Demuxer *d, InputStream *ist, AVPacket *pkt)
Definition: ffmpeg_demux.c:217
PKT_OPAQUE_SUB_HEARTBEAT
@ PKT_OPAQUE_SUB_HEARTBEAT
Definition: ffmpeg.h:95
AVInputFormat::flags
int flags
Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS, AVFMT_NOTIMESTAMPS,...
Definition: avformat.h:563
AVRational::den
int den
Denominator.
Definition: rational.h:60
InputStream::file
struct InputFile * file
Definition: ffmpeg.h:464
SpecifierOpt::str
uint8_t * str
Definition: cmdutils.h:170
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
av_channel_layout_uninit
void av_channel_layout_uninit(AVChannelLayout *channel_layout)
Free any allocated data in the channel layout and reset the channel count to 0.
Definition: channel_layout.c:442
avformat_free_context
void avformat_free_context(AVFormatContext *s)
Free an AVFormatContext and all its streams.
Definition: avformat.c:141
IFILTER_FLAG_CFR
@ IFILTER_FLAG_CFR
Definition: ffmpeg.h:265
OptionsContext::frame_sizes
SpecifierOptList frame_sizes
Definition: ffmpeg.h:159
OptionsContext::video_disable
int video_disable
Definition: ffmpeg.h:199
ds_from_ist
static DemuxStream * ds_from_ist(InputStream *ist)
Definition: ffmpeg_demux.c:156
av_find_input_format
const AVInputFormat * av_find_input_format(const char *short_name)
Find AVInputFormat based on the short name of the input format.
Definition: format.c:146
demux_alloc
static Demuxer * demux_alloc(void)
Definition: ffmpeg_demux.c:1641
AVFormatContext::duration
int64_t duration
Duration of the stream, in AV_TIME_BASE fractional seconds.
Definition: avformat.h:1399
av_mul_q
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
Definition: rational.c:80
AVPacket::stream_index
int stream_index
Definition: packet.h:560
GROW_ARRAY
#define GROW_ARRAY(array, nb_elems)
Definition: cmdutils.h:532
HWACCEL_NONE
@ HWACCEL_NONE
Definition: ffmpeg.h:83
avcodec_get_hw_config
const AVCodecHWConfig * avcodec_get_hw_config(const AVCodec *codec, int index)
Retrieve supported hardware configurations for a codec.
Definition: utils.c:837
ist_dts_update
static int ist_dts_update(DemuxStream *ds, AVPacket *pkt, FrameData *fd)
Definition: ffmpeg_demux.c:305
data_codec_name
static const char * data_codec_name
Definition: ffprobe.c:135
InputFile::ts_offset
int64_t ts_offset
Definition: ffmpeg.h:506
av_channel_layout_copy
int av_channel_layout_copy(AVChannelLayout *dst, const AVChannelLayout *src)
Make a copy of a channel layout.
Definition: channel_layout.c:449
av_log_once
void av_log_once(void *avcl, int initial_level, int subsequent_level, int *state, const char *fmt,...)
Definition: log.c:450
av_dict_set_int
int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags)
Convenience wrapper for av_dict_set() that converts the value to a string and stores it.
Definition: dict.c:177
OptionsContext::codec_tags
SpecifierOptList codec_tags
Definition: ffmpeg.h:210
DecoderOpts::flags
int flags
Definition: ffmpeg.h:425
av_strdup
char * av_strdup(const char *s)
Duplicate a string.
Definition: mem.c:272
AV_OPT_FLAG_DECODING_PARAM
#define AV_OPT_FLAG_DECODING_PARAM
A generic parameter which can be set by the user for demuxing or decoding.
Definition: opt.h:356
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
av_bsf_list_parse_str
int av_bsf_list_parse_str(const char *str, AVBSFContext **bsf_lst)
Parse string describing list of bitstream filters and create single AVBSFContext describing the whole...
Definition: bsf.c:526
start_at_zero
int start_at_zero
Definition: ffmpeg_opt.c:68
AVFMT_TS_DISCONT
#define AVFMT_TS_DISCONT
Format allows timestamp discontinuities.
Definition: avformat.h:480
mem.h
SpecifierOpt::u
union SpecifierOpt::@0 u
avio_open2
int avio_open2(AVIOContext **s, const char *filename, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options)
Create and initialize a AVIOContext for accessing the resource indicated by url.
Definition: avio.c:492
DECODER_FLAG_TS_UNRELIABLE
@ DECODER_FLAG_TS_UNRELIABLE
Definition: ffmpeg.h:412
AVCodecParameters::video_delay
int video_delay
Video only.
Definition: codec_par.h:175
DemuxStream::log_name
char log_name[32]
Definition: ffmpeg_demux.c:47
DecoderOpts::codec
const AVCodec * codec
Definition: ffmpeg.h:430
InputStream::class
const AVClass * class
Definition: ffmpeg.h:461
InputStream::index
int index
Definition: ffmpeg.h:466
readrate_sleep
static void readrate_sleep(Demuxer *d)
Definition: ffmpeg_demux.c:500
ffmpeg_sched.h
AVDictionaryEntry
Definition: dict.h:90
Demuxer::max_pts
Timestamp max_pts
Definition: ffmpeg_demux.c:131
DemuxStream::dec_opts
DecoderOpts dec_opts
Definition: ffmpeg_demux.c:88
stdin_interaction
int stdin_interaction
Definition: ffmpeg_opt.c:74
do_hex_dump
int do_hex_dump
Definition: ffmpeg_opt.c:65
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:55
AVPacket
This structure stores compressed data.
Definition: packet.h:535
ist_filter_add
int ist_filter_add(InputStream *ist, InputFilter *ifilter, int is_simple, const ViewSpecifier *vs, InputFilterOptions *opts, SchedulerNode *src)
Definition: ffmpeg_demux.c:1021
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
av_dict_set
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:86
AVPacket::pos
int64_t pos
byte position in stream, -1 if unknown
Definition: packet.h:578
packet_data
FrameData * packet_data(AVPacket *pkt)
Definition: ffmpeg.c:472
OptionsContext::data_disable
int data_disable
Definition: ffmpeg.h:202
int32_t
int32_t
Definition: audioconvert.c:56
ist_free
static void ist_free(InputStream **pist)
Definition: ffmpeg_demux.c:865
DemuxStream::reinit_filters
int reinit_filters
Definition: ffmpeg_demux.c:67
timestamp.h
Demuxer::min_pts
Timestamp min_pts
Definition: ffmpeg_demux.c:130
AVERROR_BUG
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition: error.h:52
ts_fixup
static int ts_fixup(Demuxer *d, AVPacket *pkt, FrameData *fd)
Definition: ffmpeg_demux.c:365
avio_close
int avio_close(AVIOContext *s)
Close the resource accessed by the AVIOContext s and free it.
Definition: avio.c:617
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVFormatContext::start_time
int64_t start_time
Position of the first frame of the component, in AV_TIME_BASE fractional seconds.
Definition: avformat.h:1389
DecoderOpts::framerate
AVRational framerate
Definition: ffmpeg.h:443
dts_error_threshold
float dts_error_threshold
Definition: ffmpeg_opt.c:57
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
av_stream_get_parser
struct AVCodecParserContext * av_stream_get_parser(const AVStream *s)
Definition: demux_utils.c:33
AVCodecHWConfig
Definition: codec.h:330
AVERROR_EXIT
#define AVERROR_EXIT
Immediate exit was requested; the called function should not be restarted.
Definition: error.h:58
av_pkt_dump_log2
void av_pkt_dump_log2(void *avcl, int level, const AVPacket *pkt, int dump_payload, const AVStream *st)
Send a nice dump of a packet to the log.
Definition: dump.c:122
avcodec_descriptor_get
const AVCodecDescriptor * avcodec_descriptor_get(enum AVCodecID id)
Definition: codec_desc.c:3815
do_send
static int do_send(Demuxer *d, DemuxStream *ds, AVPacket *pkt, unsigned flags, const char *pkt_desc)
Definition: ffmpeg_demux.c:546
Demuxer::last_ts
int64_t last_ts
Definition: ffmpeg_demux.c:119
DemuxStream::decoded_params
AVFrame * decoded_params
Definition: ffmpeg_demux.c:91
AVDictionaryEntry::value
char * value
Definition: dict.h:92
avstring.h
Timestamp
Definition: ffmpeg_utils.h:30
opt_match_per_type_str
const char * opt_match_per_type_str(const SpecifierOptList *sol, char mediatype)
Definition: ffmpeg_opt.c:168
opt_match_per_stream_str
void opt_match_per_stream_str(void *logctx, const SpecifierOptList *sol, AVFormatContext *fc, AVStream *st, const char **out)
DemuxStream::saw_first_ts
int saw_first_ts
Definition: ffmpeg_demux.c:75
InputFile::nb_streams
int nb_streams
Definition: ffmpeg.h:514
OptionsContext::guess_layout_max
SpecifierOptList guess_layout_max
Definition: ffmpeg.h:244
AVStream::pts_wrap_bits
int pts_wrap_bits
Number of bits in timestamps.
Definition: avformat.h:887
dump_attachment
static int dump_attachment(InputStream *ist, const char *filename)
Definition: ffmpeg_demux.c:1589
AVERROR_PROTOCOL_NOT_FOUND
#define AVERROR_PROTOCOL_NOT_FOUND
Protocol not found.
Definition: error.h:65
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:299
InputStream::dec
const AVCodec * dec
Definition: ffmpeg.h:478
snprintf
#define snprintf
Definition: snprintf.h:34
DecoderOpts::hwaccel_device_type
enum AVHWDeviceType hwaccel_device_type
Definition: ffmpeg.h:435
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
OptionsContext::bitstream_filters
SpecifierOptList bitstream_filters
Definition: ffmpeg.h:209
input_thread
static int input_thread(void *arg)
Definition: ffmpeg_demux.c:717
src
#define src
Definition: vp8dsp.c:248
AVInputFormat::priv_class
const AVClass * priv_class
AVClass for the private context.
Definition: avformat.h:574
avcodec_parameters_copy
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
Copy the contents of src to dst.
Definition: codec_par.c:107
AVPacket::time_base
AVRational time_base
Time base of the packet's timestamps.
Definition: packet.h:602
OptionsContext::top_field_first
SpecifierOptList top_field_first
Definition: ffmpeg.h:225
OptionsContext::loop
int loop
Definition: ffmpeg.h:164
thread_set_name
static void thread_set_name(InputFile *f)
Definition: ffmpeg_demux.c:687
ff_thread_setname
static int ff_thread_setname(const char *name)
Definition: thread.h:216
AVFormatContext::subtitle_codec_id
enum AVCodecID subtitle_codec_id
Forced subtitle codec_id.
Definition: avformat.h:1480
DecoderOpts::name
char * name
Definition: ffmpeg.h:427