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 
70 
71 
74  ///< dts of the first packet read for this stream (in AV_TIME_BASE units)
76 
77  /* predicted dts of the next packet read for this stream or (when there are
78  * several frames in a packet) of the next frame in current packet (in AV_TIME_BASE units) */
80  ///< dts of the last packet read for this stream (in AV_TIME_BASE units)
82 
84 
87  char dec_name[16];
88  // decoded media properties, as estimated by opening the decoder
90 
92 
93  /* number of packets successfully read for this stream */
94  uint64_t nb_packets;
95  // combined size of all the packets read
96  uint64_t data_size;
97  // latest wallclock time at which packet reading resumed after a stall - used for readrate
99  // timestamp of first packet sent after the latest stall - used for readrate
101  // measure of how far behind packet reading is against spceified readrate
103 } DemuxStream;
104 
105 typedef struct Demuxer {
107 
108  // name used for logging
109  char log_name[32];
110 
112 
113  /**
114  * Extra timestamp offset added by discontinuity handling.
115  */
118 
121 
122  /* number of times input stream should be looped */
123  int loop;
125  /* duration of the looped segment of the input file */
127  /* pts with the smallest/largest values ever seen */
130 
131  /* number of streams that the user was warned of */
133 
134  float readrate;
137 
139 
141 
145 } Demuxer;
146 
147 typedef struct DemuxThreadContext {
148  // packet used for reading from the demuxer
150  // packet for reading from BSFs
153 
155 {
156  return (DemuxStream*)ist;
157 }
158 
160 {
161  return (Demuxer*)f;
162 }
163 
165 {
166  for (InputStream *ist = ist_iter(NULL); ist; ist = ist_iter(ist)) {
167  DemuxStream *ds = ds_from_ist(ist);
168  if (ist->par->codec_type == type && ds->discard &&
169  ist->user_set_discard != AVDISCARD_ALL)
170  return ist;
171  }
172  return NULL;
173 }
174 
175 static void report_new_stream(Demuxer *d, const AVPacket *pkt)
176 {
177  const AVStream *st = d->f.ctx->streams[pkt->stream_index];
178 
179  if (pkt->stream_index < d->nb_streams_warn)
180  return;
182  "New %s stream with index %d at pos:%"PRId64" and DTS:%ss\n",
185  d->nb_streams_warn = pkt->stream_index + 1;
186 }
187 
188 static int seek_to_start(Demuxer *d, Timestamp end_pts)
189 {
190  InputFile *ifile = &d->f;
191  AVFormatContext *is = ifile->ctx;
192  int ret;
193 
194  ret = avformat_seek_file(is, -1, INT64_MIN, is->start_time, is->start_time, 0);
195  if (ret < 0)
196  return ret;
197 
198  if (end_pts.ts != AV_NOPTS_VALUE &&
199  (d->max_pts.ts == AV_NOPTS_VALUE ||
200  av_compare_ts(d->max_pts.ts, d->max_pts.tb, end_pts.ts, end_pts.tb) < 0))
201  d->max_pts = end_pts;
202 
203  if (d->max_pts.ts != AV_NOPTS_VALUE) {
204  int64_t min_pts = d->min_pts.ts == AV_NOPTS_VALUE ? 0 : d->min_pts.ts;
205  d->duration.ts = d->max_pts.ts - av_rescale_q(min_pts, d->min_pts.tb, d->max_pts.tb);
206  }
207  d->duration.tb = d->max_pts.tb;
208 
209  if (d->loop > 0)
210  d->loop--;
211 
212  return ret;
213 }
214 
216  AVPacket *pkt)
217 {
218  InputFile *ifile = &d->f;
219  DemuxStream *ds = ds_from_ist(ist);
220  const int fmt_is_discont = ifile->ctx->iformat->flags & AVFMT_TS_DISCONT;
221  int disable_discontinuity_correction = copy_ts;
224 
225  if (copy_ts && ds->next_dts != AV_NOPTS_VALUE &&
226  fmt_is_discont && ist->st->pts_wrap_bits < 60) {
227  int64_t wrap_dts = av_rescale_q_rnd(pkt->dts + (1LL<<ist->st->pts_wrap_bits),
230  if (FFABS(wrap_dts - ds->next_dts) < FFABS(pkt_dts - ds->next_dts)/10)
231  disable_discontinuity_correction = 0;
232  }
233 
234  if (ds->next_dts != AV_NOPTS_VALUE && !disable_discontinuity_correction) {
235  int64_t delta = pkt_dts - ds->next_dts;
236  if (fmt_is_discont) {
237  if (FFABS(delta) > 1LL * dts_delta_threshold * AV_TIME_BASE ||
238  pkt_dts + AV_TIME_BASE/10 < ds->dts) {
239  d->ts_offset_discont -= delta;
240  av_log(ist, AV_LOG_WARNING,
241  "timestamp discontinuity "
242  "(stream id=%d): %"PRId64", new offset= %"PRId64"\n",
243  ist->st->id, delta, d->ts_offset_discont);
245  if (pkt->pts != AV_NOPTS_VALUE)
247  }
248  } else {
249  if (FFABS(delta) > 1LL * dts_error_threshold * AV_TIME_BASE) {
250  av_log(ist, AV_LOG_WARNING,
251  "DTS %"PRId64", next:%"PRId64" st:%d invalid dropping\n",
252  pkt->dts, ds->next_dts, pkt->stream_index);
254  }
255  if (pkt->pts != AV_NOPTS_VALUE){
257  delta = pkt_pts - ds->next_dts;
258  if (FFABS(delta) > 1LL * dts_error_threshold * AV_TIME_BASE) {
259  av_log(ist, AV_LOG_WARNING,
260  "PTS %"PRId64", next:%"PRId64" invalid dropping st:%d\n",
261  pkt->pts, ds->next_dts, pkt->stream_index);
263  }
264  }
265  }
266  } else if (ds->next_dts == AV_NOPTS_VALUE && !copy_ts &&
267  fmt_is_discont && d->last_ts != AV_NOPTS_VALUE) {
268  int64_t delta = pkt_dts - d->last_ts;
269  if (FFABS(delta) > 1LL * dts_delta_threshold * AV_TIME_BASE) {
270  d->ts_offset_discont -= delta;
271  av_log(ist, AV_LOG_DEBUG,
272  "Inter stream timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
275  if (pkt->pts != AV_NOPTS_VALUE)
277  }
278  }
279 
281 }
282 
284  AVPacket *pkt)
285 {
287  pkt->time_base);
288 
289  // apply previously-detected timestamp-discontinuity offset
290  // (to all streams, not just audio/video)
291  if (pkt->dts != AV_NOPTS_VALUE)
292  pkt->dts += offset;
293  if (pkt->pts != AV_NOPTS_VALUE)
294  pkt->pts += offset;
295 
296  // detect timestamp discontinuities for audio/video
297  if ((ist->par->codec_type == AVMEDIA_TYPE_VIDEO ||
298  ist->par->codec_type == AVMEDIA_TYPE_AUDIO) &&
299  pkt->dts != AV_NOPTS_VALUE)
300  ts_discontinuity_detect(d, ist, pkt);
301 }
302 
304 {
305  InputStream *ist = &ds->ist;
306  const AVCodecParameters *par = ist->par;
307 
308  if (!ds->saw_first_ts) {
309  ds->first_dts =
310  ds->dts = ist->st->avg_frame_rate.num ? - ist->par->video_delay * AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0;
311  if (pkt->pts != AV_NOPTS_VALUE) {
312  ds->first_dts =
314  }
315  ds->saw_first_ts = 1;
316  }
317 
318  if (ds->next_dts == AV_NOPTS_VALUE)
319  ds->next_dts = ds->dts;
320 
321  if (pkt->dts != AV_NOPTS_VALUE)
323 
324  ds->dts = ds->next_dts;
325  switch (par->codec_type) {
326  case AVMEDIA_TYPE_AUDIO:
327  av_assert1(pkt->duration >= 0);
328  if (par->sample_rate) {
329  ds->next_dts += ((int64_t)AV_TIME_BASE * par->frame_size) /
330  par->sample_rate;
331  } else {
333  }
334  break;
335  case AVMEDIA_TYPE_VIDEO:
336  if (ist->framerate.num) {
337  // TODO: Remove work-around for c99-to-c89 issue 7
338  AVRational time_base_q = AV_TIME_BASE_Q;
339  int64_t next_dts = av_rescale_q(ds->next_dts, time_base_q, av_inv_q(ist->framerate));
340  ds->next_dts = av_rescale_q(next_dts + 1, av_inv_q(ist->framerate), time_base_q);
341  } else if (pkt->duration) {
343  } else if (ist->par->framerate.num != 0) {
344  AVRational field_rate = av_mul_q(ist->par->framerate,
345  (AVRational){ 2, 1 });
346  int fields = 2;
347 
348  if (ds->codec_desc &&
350  av_stream_get_parser(ist->st))
352 
353  ds->next_dts += av_rescale_q(fields, av_inv_q(field_rate), AV_TIME_BASE_Q);
354  }
355  break;
356  }
357 
358  fd->dts_est = ds->dts;
359 
360  return 0;
361 }
362 
363 static int ts_fixup(Demuxer *d, AVPacket *pkt, FrameData *fd)
364 {
365  InputFile *ifile = &d->f;
366  InputStream *ist = ifile->streams[pkt->stream_index];
367  DemuxStream *ds = ds_from_ist(ist);
368  const int64_t start_time = ifile->start_time_effective;
370  int ret;
371 
372  pkt->time_base = ist->st->time_base;
373 
374 #define SHOW_TS_DEBUG(tag_) \
375  if (debug_ts) { \
376  av_log(ist, AV_LOG_INFO, "%s -> ist_index:%d:%d type:%s " \
377  "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s duration:%s duration_time:%s\n", \
378  tag_, ifile->index, pkt->stream_index, \
379  av_get_media_type_string(ist->st->codecpar->codec_type), \
380  av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, &pkt->time_base), \
381  av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, &pkt->time_base), \
382  av_ts2str(pkt->duration), av_ts2timestr(pkt->duration, &pkt->time_base)); \
383  }
384 
385  SHOW_TS_DEBUG("demuxer");
386 
388  ist->st->pts_wrap_bits < 64) {
389  int64_t stime, stime2;
390 
392  stime2= stime + (1ULL<<ist->st->pts_wrap_bits);
393  ds->wrap_correction_done = 1;
394 
395  if(stime2 > stime && pkt->dts != AV_NOPTS_VALUE && pkt->dts > stime + (1LL<<(ist->st->pts_wrap_bits-1))) {
396  pkt->dts -= 1ULL<<ist->st->pts_wrap_bits;
397  ds->wrap_correction_done = 0;
398  }
399  if(stime2 > stime && pkt->pts != AV_NOPTS_VALUE && pkt->pts > stime + (1LL<<(ist->st->pts_wrap_bits-1))) {
400  pkt->pts -= 1ULL<<ist->st->pts_wrap_bits;
401  ds->wrap_correction_done = 0;
402  }
403  }
404 
405  if (pkt->dts != AV_NOPTS_VALUE)
407  if (pkt->pts != AV_NOPTS_VALUE)
409 
410  if (pkt->pts != AV_NOPTS_VALUE)
411  pkt->pts *= ds->ts_scale;
412  if (pkt->dts != AV_NOPTS_VALUE)
413  pkt->dts *= ds->ts_scale;
414 
416  if (pkt->pts != AV_NOPTS_VALUE) {
417  // audio decoders take precedence for estimating total file duration
418  int64_t pkt_duration = d->have_audio_dec ? 0 : pkt->duration;
419 
420  pkt->pts += duration;
421 
422  // update max/min pts that will be used to compute total file duration
423  // when using -stream_loop
424  if (d->max_pts.ts == AV_NOPTS_VALUE ||
426  pkt->pts + pkt_duration, pkt->time_base) < 0) {
427  d->max_pts = (Timestamp){ .ts = pkt->pts + pkt_duration,
428  .tb = pkt->time_base };
429  }
430  if (d->min_pts.ts == AV_NOPTS_VALUE ||
432  pkt->pts, pkt->time_base) > 0) {
433  d->min_pts = (Timestamp){ .ts = pkt->pts,
434  .tb = pkt->time_base };
435  }
436  }
437 
438  if (pkt->dts != AV_NOPTS_VALUE)
439  pkt->dts += duration;
440 
441  SHOW_TS_DEBUG("demuxer+tsfixup");
442 
443  // detect and try to correct for timestamp discontinuities
444  ts_discontinuity_process(d, ist, pkt);
445 
446  // update estimated/predicted dts
447  ret = ist_dts_update(ds, pkt, fd);
448  if (ret < 0)
449  return ret;
450 
451  return 0;
452 }
453 
454 static int input_packet_process(Demuxer *d, AVPacket *pkt, unsigned *send_flags)
455 {
456  InputFile *f = &d->f;
457  InputStream *ist = f->streams[pkt->stream_index];
458  DemuxStream *ds = ds_from_ist(ist);
459  FrameData *fd;
460  int ret = 0;
461 
462  fd = packet_data(pkt);
463  if (!fd)
464  return AVERROR(ENOMEM);
465 
466  ret = ts_fixup(d, pkt, fd);
467  if (ret < 0)
468  return ret;
469 
470  if (d->recording_time != INT64_MAX) {
471  int64_t start_time = 0;
472  if (copy_ts) {
473  start_time += f->start_time != AV_NOPTS_VALUE ? f->start_time : 0;
474  start_time += start_at_zero ? 0 : f->start_time_effective;
475  }
476  if (ds->dts >= d->recording_time + start_time)
477  *send_flags |= DEMUX_SEND_STREAMCOPY_EOF;
478  }
479 
480  ds->data_size += pkt->size;
481  ds->nb_packets++;
482 
484 
485  if (debug_ts) {
486  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",
487  f->index, pkt->stream_index,
492  av_ts2str(f->ts_offset), av_ts2timestr(f->ts_offset, &AV_TIME_BASE_Q));
493  }
494 
495  return 0;
496 }
497 
498 static void readrate_sleep(Demuxer *d)
499 {
500  InputFile *f = &d->f;
501  int64_t file_start = copy_ts * (
502  (f->start_time_effective != AV_NOPTS_VALUE ? f->start_time_effective * !start_at_zero : 0) +
503  (f->start_time != AV_NOPTS_VALUE ? f->start_time : 0)
504  );
505  int64_t initial_burst = AV_TIME_BASE * d->readrate_initial_burst;
506  int resume_warn;
507 
508  for (int i = 0; i < f->nb_streams; i++) {
509  InputStream *ist = f->streams[i];
510  DemuxStream *ds = ds_from_ist(ist);
511  int64_t stream_ts_offset, pts, now, wc_elapsed, elapsed, lag, max_pts, limit_pts;
512 
513  if (ds->discard) continue;
514 
515  stream_ts_offset = FFMAX(ds->first_dts != AV_NOPTS_VALUE ? ds->first_dts : 0, file_start);
516  pts = av_rescale(ds->dts, 1000000, AV_TIME_BASE);
517  now = av_gettime_relative();
518  wc_elapsed = now - d->wallclock_start;
519  max_pts = stream_ts_offset + initial_burst + wc_elapsed * d->readrate;
520  lag = FFMAX(max_pts - pts, 0);
521  if ( (!ds->lag && lag > 0.3 * AV_TIME_BASE) || ( lag > ds->lag + 0.3 * AV_TIME_BASE) ) {
522  ds->lag = lag;
523  ds->resume_wc = now;
524  ds->resume_pts = pts;
525  av_log_once(ds, AV_LOG_WARNING, AV_LOG_DEBUG, &resume_warn,
526  "Resumed reading at pts %0.3f with rate %0.3f after a lag of %0.3fs\n",
527  (float)pts/AV_TIME_BASE, d->readrate_catchup, (float)lag/AV_TIME_BASE);
528  }
529  if (ds->lag && !lag)
530  ds->lag = ds->resume_wc = ds->resume_pts = 0;
531  if (ds->resume_wc) {
532  elapsed = now - ds->resume_wc;
533  limit_pts = ds->resume_pts + elapsed * d->readrate_catchup;
534  } else {
535  elapsed = wc_elapsed;
536  limit_pts = max_pts;
537  }
538 
539  if (pts > limit_pts)
540  av_usleep(pts - limit_pts);
541  }
542 }
543 
544 static int do_send(Demuxer *d, DemuxStream *ds, AVPacket *pkt, unsigned flags,
545  const char *pkt_desc)
546 {
547  int ret;
548 
550 
551  ret = sch_demux_send(d->sch, d->f.index, pkt, flags);
552  if (ret == AVERROR_EOF) {
554 
555  av_log(ds, AV_LOG_VERBOSE, "All consumers of this stream are done\n");
556  ds->finished = 1;
557 
558  if (++d->nb_streams_finished == d->nb_streams_used) {
559  av_log(d, AV_LOG_VERBOSE, "All consumers are done\n");
560  return AVERROR_EOF;
561  }
562  } else if (ret < 0) {
563  if (ret != AVERROR_EXIT)
564  av_log(d, AV_LOG_ERROR,
565  "Unable to send %s packet to consumers: %s\n",
566  pkt_desc, av_err2str(ret));
567  return ret;
568  }
569 
570  return 0;
571 }
572 
574  AVPacket *pkt, unsigned flags)
575 {
576  InputFile *f = &d->f;
577  int ret;
578 
579  // pkt can be NULL only when flushing BSFs
580  av_assert0(ds->bsf || pkt);
581 
582  // send heartbeat for sub2video streams
583  if (d->pkt_heartbeat && pkt && pkt->pts != AV_NOPTS_VALUE) {
584  for (int i = 0; i < f->nb_streams; i++) {
585  DemuxStream *ds1 = ds_from_ist(f->streams[i]);
586 
587  if (ds1->finished || !ds1->have_sub2video)
588  continue;
589 
590  d->pkt_heartbeat->pts = pkt->pts;
592  d->pkt_heartbeat->opaque = (void*)(intptr_t)PKT_OPAQUE_SUB_HEARTBEAT;
593 
594  ret = do_send(d, ds1, d->pkt_heartbeat, 0, "heartbeat");
595  if (ret < 0)
596  return ret;
597  }
598  }
599 
600  if (ds->bsf) {
601  if (pkt)
603 
604  ret = av_bsf_send_packet(ds->bsf, pkt);
605  if (ret < 0) {
606  if (pkt)
608  av_log(ds, AV_LOG_ERROR, "Error submitting a packet for filtering: %s\n",
609  av_err2str(ret));
610  return ret;
611  }
612 
613  while (1) {
614  ret = av_bsf_receive_packet(ds->bsf, dt->pkt_bsf);
615  if (ret == AVERROR(EAGAIN))
616  return 0;
617  else if (ret < 0) {
618  if (ret != AVERROR_EOF)
619  av_log(ds, AV_LOG_ERROR,
620  "Error applying bitstream filters to a packet: %s\n",
621  av_err2str(ret));
622  return ret;
623  }
624 
625  dt->pkt_bsf->time_base = ds->bsf->time_base_out;
626 
627  ret = do_send(d, ds, dt->pkt_bsf, 0, "filtered");
628  if (ret < 0) {
630  return ret;
631  }
632  }
633  } else {
634  ret = do_send(d, ds, pkt, flags, "demuxed");
635  if (ret < 0)
636  return ret;
637  }
638 
639  return 0;
640 }
641 
643 {
644  InputFile *f = &d->f;
645  int ret;
646 
647  for (unsigned i = 0; i < f->nb_streams; i++) {
648  DemuxStream *ds = ds_from_ist(f->streams[i]);
649 
650  if (!ds->bsf)
651  continue;
652 
653  ret = demux_send(d, dt, ds, NULL, 0);
654  ret = (ret == AVERROR_EOF) ? 0 : (ret < 0) ? ret : AVERROR_BUG;
655  if (ret < 0) {
656  av_log(ds, AV_LOG_ERROR, "Error flushing BSFs: %s\n",
657  av_err2str(ret));
658  return ret;
659  }
660 
661  av_bsf_flush(ds->bsf);
662  }
663 
664  return 0;
665 }
666 
668 {
669  for (int j = 0; j < ifile->ctx->nb_programs; j++) {
670  AVProgram *p = ifile->ctx->programs[j];
671  int discard = AVDISCARD_ALL;
672 
673  for (int k = 0; k < p->nb_stream_indexes; k++) {
674  DemuxStream *ds = ds_from_ist(ifile->streams[p->stream_index[k]]);
675 
676  if (!ds->discard) {
677  discard = AVDISCARD_DEFAULT;
678  break;
679  }
680  }
681  p->discard = discard;
682  }
683 }
684 
686 {
687  char name[16];
688  snprintf(name, sizeof(name), "dmx%d:%s", f->index, f->ctx->iformat->name);
690 }
691 
693 {
695  av_packet_free(&dt->pkt_bsf);
696 
697  memset(dt, 0, sizeof(*dt));
698 }
699 
701 {
702  memset(dt, 0, sizeof(*dt));
703 
704  dt->pkt_demux = av_packet_alloc();
705  if (!dt->pkt_demux)
706  return AVERROR(ENOMEM);
707 
708  dt->pkt_bsf = av_packet_alloc();
709  if (!dt->pkt_bsf)
710  return AVERROR(ENOMEM);
711 
712  return 0;
713 }
714 
715 static int input_thread(void *arg)
716 {
717  Demuxer *d = arg;
718  InputFile *f = &d->f;
719 
721 
722  int ret = 0;
723 
724  ret = demux_thread_init(&dt);
725  if (ret < 0)
726  goto finish;
727 
729 
731 
732  d->read_started = 1;
734 
735  while (1) {
736  DemuxStream *ds;
737  unsigned send_flags = 0;
738 
739  ret = av_read_frame(f->ctx, dt.pkt_demux);
740 
741  if (ret == AVERROR(EAGAIN)) {
742  av_usleep(10000);
743  continue;
744  }
745  if (ret < 0) {
746  int ret_bsf;
747 
748  if (ret == AVERROR_EOF)
749  av_log(d, AV_LOG_VERBOSE, "EOF while reading input\n");
750  else {
751  av_log(d, AV_LOG_ERROR, "Error during demuxing: %s\n",
752  av_err2str(ret));
753  ret = exit_on_error ? ret : 0;
754  }
755 
756  ret_bsf = demux_bsf_flush(d, &dt);
757  ret = err_merge(ret == AVERROR_EOF ? 0 : ret, ret_bsf);
758 
759  if (d->loop) {
760  /* signal looping to our consumers */
761  dt.pkt_demux->stream_index = -1;
762  ret = sch_demux_send(d->sch, f->index, dt.pkt_demux, 0);
763  if (ret >= 0)
764  ret = seek_to_start(d, (Timestamp){ .ts = dt.pkt_demux->pts,
765  .tb = dt.pkt_demux->time_base });
766  if (ret >= 0)
767  continue;
768 
769  /* fallthrough to the error path */
770  }
771 
772  break;
773  }
774 
775  if (do_pkt_dump) {
777  f->ctx->streams[dt.pkt_demux->stream_index]);
778  }
779 
780  /* the following test is needed in case new streams appear
781  dynamically in stream : we ignore them */
782  ds = dt.pkt_demux->stream_index < f->nb_streams ?
783  ds_from_ist(f->streams[dt.pkt_demux->stream_index]) : NULL;
784  if (!ds || ds->discard || ds->finished) {
787  continue;
788  }
789 
790  if (dt.pkt_demux->flags & AV_PKT_FLAG_CORRUPT) {
792  "corrupt input packet in stream %d\n",
793  dt.pkt_demux->stream_index);
794  if (exit_on_error) {
797  break;
798  }
799  }
800 
801  ret = input_packet_process(d, dt.pkt_demux, &send_flags);
802  if (ret < 0)
803  break;
804 
805  if (d->readrate)
806  readrate_sleep(d);
807 
808  ret = demux_send(d, &dt, ds, dt.pkt_demux, send_flags);
809  if (ret < 0)
810  break;
811  }
812 
813  // EOF/EXIT is normal termination
814  if (ret == AVERROR_EOF || ret == AVERROR_EXIT)
815  ret = 0;
816 
817 finish:
818  demux_thread_uninit(&dt);
819 
820  return ret;
821 }
822 
823 static void demux_final_stats(Demuxer *d)
824 {
825  InputFile *f = &d->f;
826  uint64_t total_packets = 0, total_size = 0;
827 
828  av_log(f, AV_LOG_VERBOSE, "Input file #%d (%s):\n",
829  f->index, f->ctx->url);
830 
831  for (int j = 0; j < f->nb_streams; j++) {
832  InputStream *ist = f->streams[j];
833  DemuxStream *ds = ds_from_ist(ist);
834  enum AVMediaType type = ist->par->codec_type;
835 
836  if (ds->discard || type == AVMEDIA_TYPE_ATTACHMENT)
837  continue;
838 
839  total_size += ds->data_size;
840  total_packets += ds->nb_packets;
841 
842  av_log(f, AV_LOG_VERBOSE, " Input stream #%d:%d (%s): ",
843  f->index, j, av_get_media_type_string(type));
844  av_log(f, AV_LOG_VERBOSE, "%"PRIu64" packets read (%"PRIu64" bytes); ",
845  ds->nb_packets, ds->data_size);
846 
847  if (ds->decoding_needed) {
849  "%"PRIu64" frames decoded; %"PRIu64" decode errors",
851  if (type == AVMEDIA_TYPE_AUDIO)
852  av_log(f, AV_LOG_VERBOSE, " (%"PRIu64" samples)", ist->decoder->samples_decoded);
853  av_log(f, AV_LOG_VERBOSE, "; ");
854  }
855 
856  av_log(f, AV_LOG_VERBOSE, "\n");
857  }
858 
859  av_log(f, AV_LOG_VERBOSE, " Total: %"PRIu64" packets (%"PRIu64" bytes) demuxed\n",
860  total_packets, total_size);
861 }
862 
863 static void ist_free(InputStream **pist)
864 {
865  InputStream *ist = *pist;
866  DemuxStream *ds;
867 
868  if (!ist)
869  return;
870  ds = ds_from_ist(ist);
871 
872  dec_free(&ist->decoder);
873 
875  av_freep(&ist->filters);
877 
879 
881 
882  av_bsf_free(&ds->bsf);
883 
884  av_freep(pist);
885 }
886 
888 {
889  InputFile *f = *pf;
891 
892  if (!f)
893  return;
894 
895  if (d->read_started)
897 
898  for (int i = 0; i < f->nb_streams; i++)
899  ist_free(&f->streams[i]);
900  av_freep(&f->streams);
901 
902  avformat_close_input(&f->ctx);
903 
905 
906  av_freep(pf);
907 }
908 
909 int ist_use(InputStream *ist, int decoding_needed,
910  const ViewSpecifier *vs, SchedulerNode *src)
911 {
912  Demuxer *d = demuxer_from_ifile(ist->file);
913  DemuxStream *ds = ds_from_ist(ist);
914  int ret;
915 
916  if (ist->user_set_discard == AVDISCARD_ALL) {
917  av_log(ist, AV_LOG_ERROR, "Cannot %s a disabled input stream\n",
918  decoding_needed ? "decode" : "streamcopy");
919  return AVERROR(EINVAL);
920  }
921 
922  if (decoding_needed && !ist->dec) {
923  av_log(ist, AV_LOG_ERROR,
924  "Decoding requested, but no decoder found for: %s\n",
925  avcodec_get_name(ist->par->codec_id));
926  return AVERROR(EINVAL);
927  }
928 
929  if (ds->sch_idx_stream < 0) {
930  ret = sch_add_demux_stream(d->sch, d->f.index);
931  if (ret < 0)
932  return ret;
933  ds->sch_idx_stream = ret;
934  }
935 
936  if (ds->discard) {
937  ds->discard = 0;
938  d->nb_streams_used++;
939  }
940 
941  ist->st->discard = ist->user_set_discard;
942  ds->decoding_needed |= decoding_needed;
943  ds->streamcopy_needed |= !decoding_needed;
944 
945  if (decoding_needed && ds->sch_idx_dec < 0) {
946  int is_audio = ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO;
947 
950  (!!(d->loop && is_audio) * DECODER_FLAG_SEND_END_TS)
951 #if FFMPEG_OPT_TOP
953 #endif
954  ;
955 
956  if (ist->framerate.num) {
958  ds->dec_opts.framerate = ist->framerate;
959  } else
960  ds->dec_opts.framerate = ist->st->avg_frame_rate;
961 
962  if (ist->dec->id == AV_CODEC_ID_DVB_SUBTITLE &&
964  av_dict_set(&ds->decoder_opts, "compute_edt", "1", AV_DICT_DONT_OVERWRITE);
966  av_log(ist, AV_LOG_WARNING,
967  "Warning using DVB subtitles for filtering and output at the "
968  "same time is not fully supported, also see -compute_edt [0|1]\n");
969  }
970 
971  snprintf(ds->dec_name, sizeof(ds->dec_name), "%d:%d", ist->file->index, ist->index);
972  ds->dec_opts.name = ds->dec_name;
973 
974  ds->dec_opts.codec = ist->dec;
975  ds->dec_opts.par = ist->par;
976 
977  ds->dec_opts.log_parent = ist;
978 
980  if (!ds->decoded_params)
981  return AVERROR(ENOMEM);
982 
983  ret = dec_init(&ist->decoder, d->sch,
984  &ds->decoder_opts, &ds->dec_opts, ds->decoded_params);
985  if (ret < 0)
986  return ret;
987  ds->sch_idx_dec = ret;
988 
990  SCH_DEC_IN(ds->sch_idx_dec));
991  if (ret < 0)
992  return ret;
993 
994  d->have_audio_dec |= is_audio;
995  }
996 
997  if (decoding_needed && ist->par->codec_type == AVMEDIA_TYPE_VIDEO) {
998  ret = dec_request_view(ist->decoder, vs, src);
999  if (ret < 0)
1000  return ret;
1001  } else {
1002  *src = decoding_needed ?
1003  SCH_DEC_OUT(ds->sch_idx_dec, 0) :
1004  SCH_DSTREAM(d->f.index, ds->sch_idx_stream);
1005  }
1006 
1007  return 0;
1008 }
1009 
1010 int ist_filter_add(InputStream *ist, InputFilter *ifilter, int is_simple,
1012  SchedulerNode *src)
1013 {
1014  Demuxer *d = demuxer_from_ifile(ist->file);
1015  DemuxStream *ds = ds_from_ist(ist);
1016  int64_t tsoffset = 0;
1017  int ret;
1018 
1019  ret = ist_use(ist, is_simple ? DECODING_FOR_OST : DECODING_FOR_FILTER,
1020  vs, src);
1021  if (ret < 0)
1022  return ret;
1023 
1024  ret = GROW_ARRAY(ist->filters, ist->nb_filters);
1025  if (ret < 0)
1026  return ret;
1027 
1028  ist->filters[ist->nb_filters - 1] = ifilter;
1029 
1030  if (ist->par->codec_type == AVMEDIA_TYPE_VIDEO) {
1032  ist->par->nb_coded_side_data,
1034  if (ist->framerate.num > 0 && ist->framerate.den > 0) {
1035  opts->framerate = ist->framerate;
1036  opts->flags |= IFILTER_FLAG_CFR;
1037  } else
1038  opts->framerate = av_guess_frame_rate(d->f.ctx, ist->st, NULL);
1039  if (sd && sd->size >= sizeof(uint32_t) * 4) {
1040  opts->crop_top = AV_RL32(sd->data + 0);
1041  opts->crop_bottom = AV_RL32(sd->data + 4);
1042  opts->crop_left = AV_RL32(sd->data + 8);
1043  opts->crop_right = AV_RL32(sd->data + 12);
1044  if (ds->apply_cropping && ds->apply_cropping != CROP_CODEC &&
1045  (opts->crop_top | opts->crop_bottom | opts->crop_left | opts->crop_right))
1046  opts->flags |= IFILTER_FLAG_CROP;
1047  }
1048  } else if (ist->par->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1049  /* Compute the size of the canvas for the subtitles stream.
1050  If the subtitles codecpar has set a size, use it. Otherwise use the
1051  maximum dimensions of the video streams in the same file. */
1052  opts->sub2video_width = ist->par->width;
1053  opts->sub2video_height = ist->par->height;
1054  if (!(opts->sub2video_width && opts->sub2video_height)) {
1055  for (int j = 0; j < d->f.nb_streams; j++) {
1056  AVCodecParameters *par1 = d->f.streams[j]->par;
1057  if (par1->codec_type == AVMEDIA_TYPE_VIDEO) {
1058  opts->sub2video_width = FFMAX(opts->sub2video_width, par1->width);
1059  opts->sub2video_height = FFMAX(opts->sub2video_height, par1->height);
1060  }
1061  }
1062  }
1063 
1064  if (!(opts->sub2video_width && opts->sub2video_height)) {
1065  opts->sub2video_width = FFMAX(opts->sub2video_width, 720);
1066  opts->sub2video_height = FFMAX(opts->sub2video_height, 576);
1067  }
1068 
1069  if (!d->pkt_heartbeat) {
1071  if (!d->pkt_heartbeat)
1072  return AVERROR(ENOMEM);
1073  }
1074  ds->have_sub2video = 1;
1075  }
1076 
1077  ret = av_frame_copy_props(opts->fallback, ds->decoded_params);
1078  if (ret < 0)
1079  return ret;
1080  opts->fallback->format = ds->decoded_params->format;
1081  opts->fallback->width = ds->decoded_params->width;
1082  opts->fallback->height = ds->decoded_params->height;
1083 
1084  ret = av_channel_layout_copy(&opts->fallback->ch_layout, &ds->decoded_params->ch_layout);
1085  if (ret < 0)
1086  return ret;
1087 
1088  if (copy_ts) {
1089  tsoffset = d->f.start_time == AV_NOPTS_VALUE ? 0 : d->f.start_time;
1090  if (!start_at_zero && d->f.ctx->start_time != AV_NOPTS_VALUE)
1091  tsoffset += d->f.ctx->start_time;
1092  }
1093  opts->trim_start_us = ((d->f.start_time == AV_NOPTS_VALUE) || !d->accurate_seek) ?
1094  AV_NOPTS_VALUE : tsoffset;
1095  opts->trim_end_us = d->recording_time;
1096 
1097  opts->name = av_strdup(ds->dec_name);
1098  if (!opts->name)
1099  return AVERROR(ENOMEM);
1100 
1101  opts->flags |= IFILTER_FLAG_AUTOROTATE * !!(ds->autorotate) |
1103 
1104  return 0;
1105 }
1106 
1107 static int choose_decoder(const OptionsContext *o, void *logctx,
1108  AVFormatContext *s, AVStream *st,
1109  enum HWAccelID hwaccel_id, enum AVHWDeviceType hwaccel_device_type,
1110  const AVCodec **pcodec)
1111 
1112 {
1113  const char *codec_name = NULL;
1114 
1115  opt_match_per_stream_str(logctx, &o->codec_names, s, st, &codec_name);
1116  if (codec_name) {
1117  int ret = find_codec(NULL, codec_name, st->codecpar->codec_type, 0, pcodec);
1118  if (ret < 0)
1119  return ret;
1120  st->codecpar->codec_id = (*pcodec)->id;
1121  if (recast_media && st->codecpar->codec_type != (*pcodec)->type)
1122  st->codecpar->codec_type = (*pcodec)->type;
1123  return 0;
1124  } else {
1125  if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
1126  hwaccel_id == HWACCEL_GENERIC &&
1127  hwaccel_device_type != AV_HWDEVICE_TYPE_NONE) {
1128  const AVCodec *c;
1129  void *i = NULL;
1130 
1131  while ((c = av_codec_iterate(&i))) {
1132  const AVCodecHWConfig *config;
1133 
1134  if (c->id != st->codecpar->codec_id ||
1136  continue;
1137 
1138  for (int j = 0; config = avcodec_get_hw_config(c, j); j++) {
1139  if (config->device_type == hwaccel_device_type) {
1140  av_log(logctx, AV_LOG_VERBOSE, "Selecting decoder '%s' because of requested hwaccel method %s\n",
1141  c->name, av_hwdevice_get_type_name(hwaccel_device_type));
1142  *pcodec = c;
1143  return 0;
1144  }
1145  }
1146  }
1147  }
1148 
1149  *pcodec = avcodec_find_decoder(st->codecpar->codec_id);
1150  return 0;
1151  }
1152 }
1153 
1155  int guess_layout_max)
1156 {
1157  if (par->ch_layout.order == AV_CHANNEL_ORDER_UNSPEC) {
1158  char layout_name[256];
1159 
1160  if (par->ch_layout.nb_channels > guess_layout_max)
1161  return 0;
1164  return 0;
1165  av_channel_layout_describe(&par->ch_layout, layout_name, sizeof(layout_name));
1166  av_log(ist, AV_LOG_WARNING, "Guessed Channel Layout: %s\n", layout_name);
1167  }
1168  return 1;
1169 }
1170 
1173 {
1174  AVStream *st = ist->st;
1175  AVPacketSideData *sd;
1176  double rotation = DBL_MAX;
1177  int hflip = -1, vflip = -1;
1178  int hflip_set = 0, vflip_set = 0, rotation_set = 0;
1179  int32_t *buf;
1180 
1181  opt_match_per_stream_dbl(ist, &o->display_rotations, ctx, st, &rotation);
1182  opt_match_per_stream_int(ist, &o->display_hflips, ctx, st, &hflip);
1183  opt_match_per_stream_int(ist, &o->display_vflips, ctx, st, &vflip);
1184 
1185  rotation_set = rotation != DBL_MAX;
1186  hflip_set = hflip != -1;
1187  vflip_set = vflip != -1;
1188 
1189  if (!rotation_set && !hflip_set && !vflip_set)
1190  return 0;
1191 
1195  sizeof(int32_t) * 9, 0);
1196  if (!sd) {
1197  av_log(ist, AV_LOG_FATAL, "Failed to generate a display matrix!\n");
1198  return AVERROR(ENOMEM);
1199  }
1200 
1201  buf = (int32_t *)sd->data;
1203  rotation_set ? -(rotation) : -0.0f);
1204 
1206  hflip_set ? hflip : 0,
1207  vflip_set ? vflip : 0);
1208 
1209  return 0;
1210 }
1211 
1212 static const char *input_stream_item_name(void *obj)
1213 {
1214  const DemuxStream *ds = obj;
1215 
1216  return ds->log_name;
1217 }
1218 
1219 static const AVClass input_stream_class = {
1220  .class_name = "InputStream",
1221  .version = LIBAVUTIL_VERSION_INT,
1222  .item_name = input_stream_item_name,
1223  .category = AV_CLASS_CATEGORY_DEMUXER,
1224 };
1225 
1227 {
1228  const char *type_str = av_get_media_type_string(st->codecpar->codec_type);
1229  InputFile *f = &d->f;
1230  DemuxStream *ds;
1231 
1232  ds = allocate_array_elem(&f->streams, sizeof(*ds), &f->nb_streams);
1233  if (!ds)
1234  return NULL;
1235 
1236  ds->sch_idx_stream = -1;
1237  ds->sch_idx_dec = -1;
1238 
1239  ds->ist.st = st;
1240  ds->ist.file = f;
1241  ds->ist.index = st->index;
1242  ds->ist.class = &input_stream_class;
1243 
1244  snprintf(ds->log_name, sizeof(ds->log_name), "%cist#%d:%d/%s",
1245  type_str ? *type_str : '?', d->f.index, st->index,
1247 
1248  return ds;
1249 }
1250 
1251 static int ist_add(const OptionsContext *o, Demuxer *d, AVStream *st, AVDictionary **opts_used)
1252 {
1253  AVFormatContext *ic = d->f.ctx;
1254  AVCodecParameters *par = st->codecpar;
1255  DemuxStream *ds;
1256  InputStream *ist;
1257  const char *framerate = NULL, *hwaccel_device = NULL;
1258  const char *hwaccel = NULL;
1259  const char *apply_cropping = NULL;
1260  const char *hwaccel_output_format = NULL;
1261  const char *codec_tag = NULL;
1262  const char *bsfs = NULL;
1263  char *next;
1264  const char *discard_str = NULL;
1265  int ret;
1266 
1267  ds = demux_stream_alloc(d, st);
1268  if (!ds)
1269  return AVERROR(ENOMEM);
1270 
1271  ist = &ds->ist;
1272 
1273  ds->discard = 1;
1274  st->discard = AVDISCARD_ALL;
1275  ds->first_dts = AV_NOPTS_VALUE;
1276  ds->next_dts = AV_NOPTS_VALUE;
1277 
1278  ds->dec_opts.time_base = st->time_base;
1279 
1280  ds->ts_scale = 1.0;
1281  opt_match_per_stream_dbl(ist, &o->ts_scale, ic, st, &ds->ts_scale);
1282 
1283  ds->autorotate = 1;
1284  opt_match_per_stream_int(ist, &o->autorotate, ic, st, &ds->autorotate);
1285 
1286  ds->apply_cropping = CROP_ALL;
1288  if (apply_cropping) {
1289  const AVOption opts[] = {
1290  { "apply_cropping", NULL, 0, AV_OPT_TYPE_INT,
1291  { .i64 = CROP_ALL }, CROP_DISABLED, CROP_CONTAINER, AV_OPT_FLAG_DECODING_PARAM, .unit = "apply_cropping" },
1292  { "none", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CROP_DISABLED }, .unit = "apply_cropping" },
1293  { "all", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CROP_ALL }, .unit = "apply_cropping" },
1294  { "codec", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CROP_CODEC }, .unit = "apply_cropping" },
1295  { "container", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CROP_CONTAINER }, .unit = "apply_cropping" },
1296  { NULL },
1297  };
1298  const AVClass class = {
1299  .class_name = "apply_cropping",
1300  .item_name = av_default_item_name,
1301  .option = opts,
1302  .version = LIBAVUTIL_VERSION_INT,
1303  };
1304  const AVClass *pclass = &class;
1305 
1307  if (ret < 0) {
1308  av_log(ist, AV_LOG_ERROR, "Invalid apply_cropping value '%s'.\n", apply_cropping);
1309  return ret;
1310  }
1311  }
1312 
1313  opt_match_per_stream_str(ist, &o->codec_tags, ic, st, &codec_tag);
1314  if (codec_tag) {
1315  uint32_t tag = strtol(codec_tag, &next, 0);
1316  if (*next) {
1317  uint8_t buf[4] = { 0 };
1318  memcpy(buf, codec_tag, FFMIN(sizeof(buf), strlen(codec_tag)));
1319  tag = AV_RL32(buf);
1320  }
1321 
1322  st->codecpar->codec_tag = tag;
1323  }
1324 
1325  if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
1326  ret = add_display_matrix_to_stream(o, ic, ist);
1327  if (ret < 0)
1328  return ret;
1329 
1330  opt_match_per_stream_str(ist, &o->hwaccels, ic, st, &hwaccel);
1332  &hwaccel_output_format);
1333  if (!hwaccel_output_format && hwaccel && !strcmp(hwaccel, "cuvid")) {
1334  av_log(ist, AV_LOG_WARNING,
1335  "WARNING: defaulting hwaccel_output_format to cuda for compatibility "
1336  "with old commandlines. This behaviour is DEPRECATED and will be removed "
1337  "in the future. Please explicitly set \"-hwaccel_output_format cuda\".\n");
1339  } else if (!hwaccel_output_format && hwaccel && !strcmp(hwaccel, "qsv")) {
1340  av_log(ist, AV_LOG_WARNING,
1341  "WARNING: defaulting hwaccel_output_format to qsv for compatibility "
1342  "with old commandlines. This behaviour is DEPRECATED and will be removed "
1343  "in the future. Please explicitly set \"-hwaccel_output_format qsv\".\n");
1345  } else if (!hwaccel_output_format && hwaccel && !strcmp(hwaccel, "mediacodec")) {
1346  // There is no real AVHWFrameContext implementation. Set
1347  // hwaccel_output_format to avoid av_hwframe_transfer_data error.
1349  } else if (hwaccel_output_format) {
1350  ds->dec_opts.hwaccel_output_format = av_get_pix_fmt(hwaccel_output_format);
1352  av_log(ist, AV_LOG_FATAL, "Unrecognised hwaccel output "
1353  "format: %s", hwaccel_output_format);
1354  }
1355  } else {
1357  }
1358 
1359  if (hwaccel) {
1360  // The NVDEC hwaccels use a CUDA device, so remap the name here.
1361  if (!strcmp(hwaccel, "nvdec") || !strcmp(hwaccel, "cuvid"))
1362  hwaccel = "cuda";
1363 
1364  if (!strcmp(hwaccel, "none"))
1366  else if (!strcmp(hwaccel, "auto"))
1368  else {
1370  if (type != AV_HWDEVICE_TYPE_NONE) {
1373  }
1374 
1375  if (!ds->dec_opts.hwaccel_id) {
1376  av_log(ist, AV_LOG_FATAL, "Unrecognized hwaccel: %s.\n",
1377  hwaccel);
1378  av_log(ist, AV_LOG_FATAL, "Supported hwaccels: ");
1380  while ((type = av_hwdevice_iterate_types(type)) !=
1382  av_log(ist, AV_LOG_FATAL, "%s ",
1384  av_log(ist, AV_LOG_FATAL, "\n");
1385  return AVERROR(EINVAL);
1386  }
1387  }
1388  }
1389 
1390  opt_match_per_stream_str(ist, &o->hwaccel_devices, ic, st, &hwaccel_device);
1391  if (hwaccel_device) {
1392  ds->dec_opts.hwaccel_device = av_strdup(hwaccel_device);
1393  if (!ds->dec_opts.hwaccel_device)
1394  return AVERROR(ENOMEM);
1395  }
1396  }
1397 
1398  ret = choose_decoder(o, ist, ic, st, ds->dec_opts.hwaccel_id,
1399  ds->dec_opts.hwaccel_device_type, &ist->dec);
1400  if (ret < 0)
1401  return ret;
1402 
1403  if (ist->dec) {
1405  ic, st, ist->dec, &ds->decoder_opts, opts_used);
1406  if (ret < 0)
1407  return ret;
1408  }
1409 
1410  ds->reinit_filters = -1;
1411  opt_match_per_stream_int(ist, &o->reinit_filters, ic, st, &ds->reinit_filters);
1412 
1414 
1415  if ((o->video_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) ||
1420 
1421  opt_match_per_stream_str(ist, &o->discard, ic, st, &discard_str);
1422  if (discard_str) {
1423  ret = av_opt_set(ist->st, "discard", discard_str, 0);
1424  if (ret < 0) {
1425  av_log(ist, AV_LOG_ERROR, "Error parsing discard %s.\n", discard_str);
1426  return ret;
1427  }
1428  ist->user_set_discard = ist->st->discard;
1429  }
1430 
1432 
1433  av_dict_set_int(&ds->decoder_opts, "apply_cropping",
1434  ds->apply_cropping && ds->apply_cropping != CROP_CONTAINER, 0);
1435 
1436  /* Attached pics are sparse, therefore we would not want to delay their decoding
1437  * till EOF. */
1439  av_dict_set(&ds->decoder_opts, "thread_type", "-frame", 0);
1440 
1441  switch (par->codec_type) {
1442  case AVMEDIA_TYPE_VIDEO:
1443  opt_match_per_stream_str(ist, &o->frame_rates, ic, st, &framerate);
1444  if (framerate) {
1446  if (ret < 0) {
1447  av_log(ist, AV_LOG_ERROR, "Error parsing framerate %s.\n",
1448  framerate);
1449  return ret;
1450  }
1451  }
1452 
1453 #if FFMPEG_OPT_TOP
1454  ist->top_field_first = -1;
1455  opt_match_per_stream_int(ist, &o->top_field_first, ic, st, &ist->top_field_first);
1456 #endif
1457 
1458  break;
1459  case AVMEDIA_TYPE_AUDIO: {
1460  const char *ch_layout_str = NULL;
1461 
1462  opt_match_per_stream_str(ist, &o->audio_ch_layouts, ic, st, &ch_layout_str);
1463  if (ch_layout_str) {
1464  AVChannelLayout ch_layout;
1465  ret = av_channel_layout_from_string(&ch_layout, ch_layout_str);
1466  if (ret < 0) {
1467  av_log(ist, AV_LOG_ERROR, "Error parsing channel layout %s.\n", ch_layout_str);
1468  return ret;
1469  }
1470  if (par->ch_layout.nb_channels <= 0 || par->ch_layout.nb_channels == ch_layout.nb_channels) {
1472  par->ch_layout = ch_layout;
1473  } else {
1474  av_log(ist, AV_LOG_ERROR,
1475  "Specified channel layout '%s' has %d channels, but input has %d channels.\n",
1476  ch_layout_str, ch_layout.nb_channels, par->ch_layout.nb_channels);
1477  av_channel_layout_uninit(&ch_layout);
1478  return AVERROR(EINVAL);
1479  }
1480  } else {
1481  int guess_layout_max = INT_MAX;
1482  opt_match_per_stream_int(ist, &o->guess_layout_max, ic, st, &guess_layout_max);
1483  guess_input_channel_layout(ist, par, guess_layout_max);
1484  }
1485  break;
1486  }
1487  case AVMEDIA_TYPE_DATA:
1488  case AVMEDIA_TYPE_SUBTITLE: {
1489  const char *canvas_size = NULL;
1490 
1492  opt_match_per_stream_str(ist, &o->canvas_sizes, ic, st, &canvas_size);
1493  if (canvas_size) {
1494  ret = av_parse_video_size(&par->width, &par->height,
1495  canvas_size);
1496  if (ret < 0) {
1497  av_log(ist, AV_LOG_FATAL, "Invalid canvas size: %s.\n", canvas_size);
1498  return ret;
1499  }
1500  }
1501  break;
1502  }
1504  case AVMEDIA_TYPE_UNKNOWN:
1505  break;
1506  default: av_assert0(0);
1507  }
1508 
1509  ist->par = avcodec_parameters_alloc();
1510  if (!ist->par)
1511  return AVERROR(ENOMEM);
1512 
1513  ret = avcodec_parameters_copy(ist->par, par);
1514  if (ret < 0) {
1515  av_log(ist, AV_LOG_ERROR, "Error exporting stream parameters.\n");
1516  return ret;
1517  }
1518 
1519  if (ist->st->sample_aspect_ratio.num)
1521 
1522  opt_match_per_stream_str(ist, &o->bitstream_filters, ic, st, &bsfs);
1523  if (bsfs) {
1524  ret = av_bsf_list_parse_str(bsfs, &ds->bsf);
1525  if (ret < 0) {
1526  av_log(ist, AV_LOG_ERROR,
1527  "Error parsing bitstream filter sequence '%s': %s\n",
1528  bsfs, av_err2str(ret));
1529  return ret;
1530  }
1531 
1532  ret = avcodec_parameters_copy(ds->bsf->par_in, ist->par);
1533  if (ret < 0)
1534  return ret;
1535  ds->bsf->time_base_in = ist->st->time_base;
1536 
1537  ret = av_bsf_init(ds->bsf);
1538  if (ret < 0) {
1539  av_log(ist, AV_LOG_ERROR, "Error initializing bitstream filters: %s\n",
1540  av_err2str(ret));
1541  return ret;
1542  }
1543 
1544  ret = avcodec_parameters_copy(ist->par, ds->bsf->par_out);
1545  if (ret < 0)
1546  return ret;
1547  }
1548 
1550 
1551  return 0;
1552 }
1553 
1554 static int dump_attachment(InputStream *ist, const char *filename)
1555 {
1556  AVStream *st = ist->st;
1557  int ret;
1558  AVIOContext *out = NULL;
1559  const AVDictionaryEntry *e;
1560 
1561  if (!st->codecpar->extradata_size) {
1562  av_log(ist, AV_LOG_WARNING, "No extradata to dump.\n");
1563  return 0;
1564  }
1565  if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
1566  filename = e->value;
1567  if (!*filename) {
1568  av_log(ist, AV_LOG_FATAL, "No filename specified and no 'filename' tag");
1569  return AVERROR(EINVAL);
1570  }
1571 
1572  ret = assert_file_overwrite(filename);
1573  if (ret < 0)
1574  return ret;
1575 
1576  if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
1577  av_log(ist, AV_LOG_FATAL, "Could not open file %s for writing.\n",
1578  filename);
1579  return ret;
1580  }
1581 
1583  ret = avio_close(out);
1584 
1585  if (ret >= 0)
1586  av_log(ist, AV_LOG_INFO, "Wrote attachment (%d bytes) to '%s'\n",
1587  st->codecpar->extradata_size, filename);
1588 
1589  return ret;
1590 }
1591 
1592 static const char *input_file_item_name(void *obj)
1593 {
1594  const Demuxer *d = obj;
1595 
1596  return d->log_name;
1597 }
1598 
1599 static const AVClass input_file_class = {
1600  .class_name = "InputFile",
1601  .version = LIBAVUTIL_VERSION_INT,
1602  .item_name = input_file_item_name,
1603  .category = AV_CLASS_CATEGORY_DEMUXER,
1604 };
1605 
1606 static Demuxer *demux_alloc(void)
1607 {
1609 
1610  if (!d)
1611  return NULL;
1612 
1613  d->f.class = &input_file_class;
1614  d->f.index = nb_input_files - 1;
1615 
1616  snprintf(d->log_name, sizeof(d->log_name), "in#%d", d->f.index);
1617 
1618  return d;
1619 }
1620 
1621 int ifile_open(const OptionsContext *o, const char *filename, Scheduler *sch)
1622 {
1623  Demuxer *d;
1624  InputFile *f;
1625  AVFormatContext *ic;
1626  const AVInputFormat *file_iformat = NULL;
1627  int err, ret = 0;
1628  int64_t timestamp;
1629  AVDictionary *opts_used = NULL;
1630  const char* video_codec_name = NULL;
1631  const char* audio_codec_name = NULL;
1632  const char* subtitle_codec_name = NULL;
1633  const char* data_codec_name = NULL;
1634  int scan_all_pmts_set = 0;
1635 
1637  int64_t start_time_eof = o->start_time_eof;
1638  int64_t stop_time = o->stop_time;
1639  int64_t recording_time = o->recording_time;
1640 
1641  d = demux_alloc();
1642  if (!d)
1643  return AVERROR(ENOMEM);
1644 
1645  f = &d->f;
1646 
1647  ret = sch_add_demux(sch, input_thread, d);
1648  if (ret < 0)
1649  return ret;
1650  d->sch = sch;
1651 
1652  if (stop_time != INT64_MAX && recording_time != INT64_MAX) {
1653  stop_time = INT64_MAX;
1654  av_log(d, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
1655  }
1656 
1657  if (stop_time != INT64_MAX && recording_time == INT64_MAX) {
1658  int64_t start = start_time == AV_NOPTS_VALUE ? 0 : start_time;
1659  if (stop_time <= start) {
1660  av_log(d, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
1661  return AVERROR(EINVAL);
1662  } else {
1663  recording_time = stop_time - start;
1664  }
1665  }
1666 
1667  if (o->format) {
1668  if (!(file_iformat = av_find_input_format(o->format))) {
1669  av_log(d, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
1670  return AVERROR(EINVAL);
1671  }
1672  }
1673 
1674  if (!strcmp(filename, "-"))
1675  filename = "fd:";
1676 
1677  stdin_interaction &= strncmp(filename, "pipe:", 5) &&
1678  strcmp(filename, "fd:") &&
1679  strcmp(filename, "/dev/stdin");
1680 
1681  /* get default parameters from command line */
1682  ic = avformat_alloc_context();
1683  if (!ic)
1684  return AVERROR(ENOMEM);
1685  if (o->audio_sample_rate.nb_opt) {
1686  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);
1687  }
1688  if (o->audio_channels.nb_opt) {
1689  const AVClass *priv_class;
1690  if (file_iformat && (priv_class = file_iformat->priv_class) &&
1691  av_opt_find(&priv_class, "ch_layout", NULL, 0,
1693  char buf[32];
1694  snprintf(buf, sizeof(buf), "%dC", o->audio_channels.opt[o->audio_channels.nb_opt - 1].u.i);
1695  av_dict_set(&o->g->format_opts, "ch_layout", buf, 0);
1696  }
1697  }
1698  if (o->audio_ch_layouts.nb_opt) {
1699  const AVClass *priv_class;
1700  if (file_iformat && (priv_class = file_iformat->priv_class) &&
1701  av_opt_find(&priv_class, "ch_layout", NULL, 0,
1703  av_dict_set(&o->g->format_opts, "ch_layout", o->audio_ch_layouts.opt[o->audio_ch_layouts.nb_opt - 1].u.str, 0);
1704  }
1705  }
1706  if (o->frame_rates.nb_opt) {
1707  const AVClass *priv_class;
1708  /* set the format-level framerate option;
1709  * this is important for video grabbers, e.g. x11 */
1710  if (file_iformat && (priv_class = file_iformat->priv_class) &&
1711  av_opt_find(&priv_class, "framerate", NULL, 0,
1713  av_dict_set(&o->g->format_opts, "framerate",
1714  o->frame_rates.opt[o->frame_rates.nb_opt - 1].u.str, 0);
1715  }
1716  }
1717  if (o->frame_sizes.nb_opt) {
1718  av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes.opt[o->frame_sizes.nb_opt - 1].u.str, 0);
1719  }
1720  if (o->frame_pix_fmts.nb_opt)
1721  av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts.opt[o->frame_pix_fmts.nb_opt - 1].u.str, 0);
1722 
1726  data_codec_name = opt_match_per_type_str(&o->codec_names, 'd');
1727 
1728  if (video_codec_name)
1730  &ic->video_codec));
1731  if (audio_codec_name)
1733  &ic->audio_codec));
1734  if (subtitle_codec_name)
1736  &ic->subtitle_codec));
1737  if (data_codec_name)
1738  ret = err_merge(ret, find_codec(NULL, data_codec_name , AVMEDIA_TYPE_DATA, 0,
1739  &ic->data_codec));
1740  if (ret < 0) {
1742  return ret;
1743  }
1744 
1748  ic->data_codec_id = data_codec_name ? ic->data_codec->id : AV_CODEC_ID_NONE;
1749 
1750  ic->flags |= AVFMT_FLAG_NONBLOCK;
1751  if (o->bitexact)
1752  ic->flags |= AVFMT_FLAG_BITEXACT;
1753  ic->interrupt_callback = int_cb;
1754 
1755  if (!av_dict_get(o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) {
1756  av_dict_set(&o->g->format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE);
1757  scan_all_pmts_set = 1;
1758  }
1759  /* open the input file with generic avformat function */
1760  err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
1761  if (err < 0) {
1762  if (err != AVERROR_EXIT)
1763  av_log(d, AV_LOG_ERROR,
1764  "Error opening input: %s\n", av_err2str(err));
1765  if (err == AVERROR_PROTOCOL_NOT_FOUND)
1766  av_log(d, AV_LOG_ERROR, "Did you mean file:%s?\n", filename);
1767  return err;
1768  }
1769  f->ctx = ic;
1770 
1771  av_strlcat(d->log_name, "/", sizeof(d->log_name));
1772  av_strlcat(d->log_name, ic->iformat->name, sizeof(d->log_name));
1773 
1774  if (scan_all_pmts_set)
1775  av_dict_set(&o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE);
1777 
1779  if (ret < 0)
1780  return ret;
1781 
1782  /* apply forced codec ids */
1783  for (int i = 0; i < ic->nb_streams; i++) {
1784  const AVCodec *dummy;
1786  &dummy);
1787  if (ret < 0)
1788  return ret;
1789  }
1790 
1791  if (o->find_stream_info) {
1792  AVDictionary **opts;
1793  int orig_nb_streams = ic->nb_streams;
1794 
1796  if (ret < 0)
1797  return ret;
1798 
1799  /* If not enough info to get the stream parameters, we decode the
1800  first frames to get it. (used in mpeg case for example) */
1802 
1803  for (int i = 0; i < orig_nb_streams; i++)
1804  av_dict_free(&opts[i]);
1805  av_freep(&opts);
1806 
1807  if (ret < 0) {
1808  av_log(d, AV_LOG_FATAL, "could not find codec parameters\n");
1809  if (ic->nb_streams == 0)
1810  return ret;
1811  }
1812  }
1813 
1814  if (start_time != AV_NOPTS_VALUE && start_time_eof != AV_NOPTS_VALUE) {
1815  av_log(d, AV_LOG_WARNING, "Cannot use -ss and -sseof both, using -ss\n");
1816  start_time_eof = AV_NOPTS_VALUE;
1817  }
1818 
1819  if (start_time_eof != AV_NOPTS_VALUE) {
1820  if (start_time_eof >= 0) {
1821  av_log(d, AV_LOG_ERROR, "-sseof value must be negative; aborting\n");
1822  return AVERROR(EINVAL);
1823  }
1824  if (ic->duration > 0) {
1825  start_time = start_time_eof + ic->duration;
1826  if (start_time < 0) {
1827  av_log(d, AV_LOG_WARNING, "-sseof value seeks to before start of file; ignored\n");
1829  }
1830  } else
1831  av_log(d, AV_LOG_WARNING, "Cannot use -sseof, file duration not known\n");
1832  }
1833  timestamp = (start_time == AV_NOPTS_VALUE) ? 0 : start_time;
1834  /* add the stream start time */
1835  if (!o->seek_timestamp && ic->start_time != AV_NOPTS_VALUE)
1836  timestamp += ic->start_time;
1837 
1838  /* if seeking requested, we execute it */
1839  if (start_time != AV_NOPTS_VALUE) {
1840  int64_t seek_timestamp = timestamp;
1841 
1842  if (!(ic->iformat->flags & AVFMT_SEEK_TO_PTS)) {
1843  int dts_heuristic = 0;
1844  for (int i = 0; i < ic->nb_streams; i++) {
1845  const AVCodecParameters *par = ic->streams[i]->codecpar;
1846  if (par->video_delay) {
1847  dts_heuristic = 1;
1848  break;
1849  }
1850  }
1851  if (dts_heuristic) {
1852  seek_timestamp -= 3*AV_TIME_BASE / 23;
1853  }
1854  }
1855  ret = avformat_seek_file(ic, -1, INT64_MIN, seek_timestamp, seek_timestamp, 0);
1856  if (ret < 0) {
1857  av_log(d, AV_LOG_WARNING, "could not seek to position %0.3f\n",
1858  (double)timestamp / AV_TIME_BASE);
1859  }
1860  }
1861 
1862  f->start_time = start_time;
1863  d->recording_time = recording_time;
1864  f->input_sync_ref = o->input_sync_ref;
1865  f->input_ts_offset = o->input_ts_offset;
1866  f->ts_offset = o->input_ts_offset - (copy_ts ? (start_at_zero && ic->start_time != AV_NOPTS_VALUE ? ic->start_time : 0) : timestamp);
1867  d->accurate_seek = o->accurate_seek;
1868  d->loop = o->loop;
1869  d->nb_streams_warn = ic->nb_streams;
1870 
1871  d->duration = (Timestamp){ .ts = 0, .tb = (AVRational){ 1, 1 } };
1872  d->min_pts = (Timestamp){ .ts = AV_NOPTS_VALUE, .tb = (AVRational){ 1, 1 } };
1873  d->max_pts = (Timestamp){ .ts = AV_NOPTS_VALUE, .tb = (AVRational){ 1, 1 } };
1874 
1875  d->readrate = o->readrate ? o->readrate : 0.0;
1876  if (d->readrate < 0.0f) {
1877  av_log(d, AV_LOG_ERROR, "Option -readrate is %0.3f; it must be non-negative.\n", d->readrate);
1878  return AVERROR(EINVAL);
1879  }
1880  if (o->rate_emu) {
1881  if (d->readrate) {
1882  av_log(d, AV_LOG_WARNING, "Both -readrate and -re set. Using -readrate %0.3f.\n", d->readrate);
1883  } else
1884  d->readrate = 1.0f;
1885  }
1886 
1887  if (d->readrate) {
1889  if (d->readrate_initial_burst < 0.0) {
1890  av_log(d, AV_LOG_ERROR,
1891  "Option -readrate_initial_burst is %0.3f; it must be non-negative.\n",
1893  return AVERROR(EINVAL);
1894  }
1896  if (d->readrate_catchup < d->readrate) {
1897  av_log(d, AV_LOG_ERROR,
1898  "Option -readrate_catchup is %0.3f; it must be at least equal to %0.3f.\n",
1899  d->readrate_catchup, d->readrate);
1900  return AVERROR(EINVAL);
1901  }
1902  } else {
1903  if (o->readrate_initial_burst) {
1904  av_log(d, AV_LOG_WARNING, "Option -readrate_initial_burst ignored "
1905  "since neither -readrate nor -re were given\n");
1906  }
1907  if (o->readrate_catchup) {
1908  av_log(d, AV_LOG_WARNING, "Option -readrate_catchup ignored "
1909  "since neither -readrate nor -re were given\n");
1910  }
1911  }
1912 
1913  /* Add all the streams from the given input file to the demuxer */
1914  for (int i = 0; i < ic->nb_streams; i++) {
1915  ret = ist_add(o, d, ic->streams[i], &opts_used);
1916  if (ret < 0) {
1917  av_dict_free(&opts_used);
1918  return ret;
1919  }
1920  }
1921 
1922  /* dump the file content */
1923  av_dump_format(ic, f->index, filename, 0);
1924 
1925  /* check if all codec options have been used */
1926  ret = check_avoptions_used(o->g->codec_opts, opts_used, d, 1);
1927  av_dict_free(&opts_used);
1928  if (ret < 0)
1929  return ret;
1930 
1931  for (int i = 0; i < o->dump_attachment.nb_opt; i++) {
1932  for (int j = 0; j < f->nb_streams; j++) {
1933  InputStream *ist = f->streams[j];
1934 
1935  if (check_stream_specifier(ic, ist->st, o->dump_attachment.opt[i].specifier) == 1) {
1937  if (ret < 0)
1938  return ret;
1939  }
1940  }
1941  }
1942 
1943  return 0;
1944 }
OptionsContext::readrate
float readrate
Definition: ffmpeg.h:165
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:430
AVCodec
AVCodec.
Definition: codec.h:187
OptionsContext::input_ts_offset
int64_t input_ts_offset
Definition: ffmpeg.h:162
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:204
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:215
InputFile::start_time
int64_t start_time
Definition: ffmpeg.h:483
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:190
demux_final_stats
static void demux_final_stats(Demuxer *d)
Definition: ffmpeg_demux.c:823
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:105
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:1219
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:656
AVProgram::nb_stream_indexes
unsigned int nb_stream_indexes
Definition: avformat.h:1229
check_avoptions
int check_avoptions(AVDictionary *m)
Definition: cmdutils.c:1529
apply_cropping
static int apply_cropping(AVCodecContext *avctx, AVFrame *frame)
Definition: decode.c:761
out
FILE * out
Definition: movenc.c:55
DecoderOpts
Definition: ffmpeg.h:399
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:394
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
AV_DISPOSITION_ATTACHED_PIC
#define AV_DISPOSITION_ATTACHED_PIC
The stream is stored in the file as an attached picture/"cover art" (e.g.
Definition: avformat.h:674
AVStream::discard
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
Definition: avformat.h:819
FrameData::dts_est
int64_t dts_est
Definition: ffmpeg.h:659
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:454
demux_thread_init
static int demux_thread_init(DemuxThreadContext *dt)
Definition: ffmpeg_demux.c:700
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:479
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:264
int64_t
long long int64_t
Definition: coverity.c:34
InputStream::user_set_discard
int user_set_discard
Definition: ffmpeg.h:444
DemuxStream::sch_idx_stream
int sch_idx_stream
Definition: ffmpeg_demux.c:49
OptionsContext::audio_ch_layouts
SpecifierOptList audio_ch_layouts
Definition: ffmpeg.h:153
ist_add
static int ist_add(const OptionsContext *o, Demuxer *d, AVStream *st, AVDictionary **opts_used)
Definition: ffmpeg_demux.c:1251
ist_iter
InputStream * ist_iter(InputStream *prev)
Definition: ffmpeg.c:376
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:163
DemuxStream::finished
int finished
Definition: ffmpeg_demux.c:63
InputFile::index
int index
Definition: ffmpeg.h:472
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:410
pixdesc.h
AVFormatContext::streams
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1368
AVFrame::width
int width
Definition: frame.h:482
DECODER_FLAG_FRAMERATE_FORCED
@ DECODER_FLAG_FRAMERATE_FORCED
Definition: ffmpeg.h:390
AVPacketSideData
This structure stores auxiliary information for decoding, presenting, or otherwise processing the cod...
Definition: packet.h:390
OptionsContext::display_hflips
SpecifierOptList display_hflips
Definition: ffmpeg.h:217
DecoderOpts::par
const AVCodecParameters * par
Definition: ffmpeg.h:406
ifile_close
void ifile_close(InputFile **pf)
Definition: ffmpeg_demux.c:887
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:200
demux_stream_alloc
static DemuxStream * demux_stream_alloc(Demuxer *d, AVStream *st)
Definition: ffmpeg_demux.c:1226
OptionsContext::readrate_catchup
float readrate_catchup
Definition: ffmpeg.h:166
AVOption
AVOption.
Definition: opt.h:429
AVStream::avg_frame_rate
AVRational avg_frame_rate
Average framerate.
Definition: avformat.h:837
DecoderOpts::hwaccel_id
enum HWAccelID hwaccel_id
Definition: ffmpeg.h:409
InputStream::nb_filters
int nb_filters
Definition: ffmpeg.h:466
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:106
ffmpeg.h
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:225
float.h
DemuxStream::decoder_opts
AVDictionary * decoder_opts
Definition: ffmpeg_demux.c:85
AVFormatContext::programs
AVProgram ** programs
Definition: avformat.h:1501
av_hwdevice_iterate_types
enum AVHWDeviceType av_hwdevice_iterate_types(enum AVHWDeviceType prev)
Iterate over supported device types.
Definition: hwcontext.c:125
OptionsContext::bitexact
int bitexact
Definition: ffmpeg.h:196
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:557
ViewSpecifier
Definition: ffmpeg.h:128
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:34
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:1556
AVFormatContext::video_codec_id
enum AVCodecID video_codec_id
Forced video codec_id.
Definition: avformat.h:1507
IFILTER_FLAG_AUTOROTATE
@ IFILTER_FLAG_AUTOROTATE
Definition: ffmpeg.h:261
OptionsContext::format
const char * format
Definition: ffmpeg.h:150
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:396
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:102
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:159
AVBSFContext
The bitstream filter state.
Definition: bsf.h:68
OptionsContext::canvas_sizes
SpecifierOptList canvas_sizes
Definition: ffmpeg.h:237
Demuxer::wallclock_start
int64_t wallclock_start
Definition: ffmpeg_demux.c:111
SpecifierOpt::i
int i
Definition: cmdutils.h:171
InputStream
Definition: ffmpeg.h:435
DecoderOpts::hwaccel_output_format
enum AVPixelFormat hwaccel_output_format
Definition: ffmpeg.h:412
debug_ts
int debug_ts
Definition: ffmpeg_opt.c:69
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:392
AVFormatContext::interrupt_callback
AVIOInterruptCB interrupt_callback
Custom interrupt callbacks for the I/O layer.
Definition: avformat.h:1573
Demuxer
Definition: ffmpeg_demux.c:105
OptionsContext::rate_emu
int rate_emu
Definition: ffmpeg.h:164
CROP_CODEC
@ CROP_CODEC
Definition: ffmpeg.h:579
dts_delta_threshold
float dts_delta_threshold
Definition: ffmpeg_opt.c:55
DemuxStream::data_size
uint64_t data_size
Definition: ffmpeg_demux.c:96
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:503
OptionsContext::g
OptionGroup * g
Definition: ffmpeg.h:144
Demuxer::log_name
char log_name[32]
Definition: ffmpeg_demux.c:109
Decoder::frames_decoded
uint64_t frames_decoded
Definition: ffmpeg.h:430
Demuxer::nb_streams_finished
int nb_streams_finished
Definition: ffmpeg_demux.c:144
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:1227
DecoderOpts::log_parent
void * log_parent
Definition: ffmpeg.h:403
input_file_item_name
static const char * input_file_item_name(void *obj)
Definition: ffmpeg_demux.c:1592
AVDISCARD_NONE
@ AVDISCARD_NONE
discard nothing
Definition: defs.h:215
AVFrame::ch_layout
AVChannelLayout ch_layout
Channel layout of the audio data.
Definition: frame.h:819
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:143
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:65
Demuxer::ts_offset_discont
int64_t ts_offset_discont
Extra timestamp offset added by discontinuity handling.
Definition: ffmpeg_demux.c:116
AVRational::num
int num
Numerator.
Definition: rational.h:59
Demuxer::f
InputFile f
Definition: ffmpeg_demux.c:106
Decoder::samples_decoded
uint64_t samples_decoded
Definition: ffmpeg.h:431
InputFile
Definition: ffmpeg.h:469
DemuxStream::nb_packets
uint64_t nb_packets
Definition: ffmpeg_demux.c:94
Demuxer::nb_streams_used
int nb_streams_used
Definition: ffmpeg_demux.c:143
OptionsContext::recording_time
int64_t recording_time
Definition: ffmpeg.h:189
av_frame_alloc
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:151
AV_CODEC_ID_DVB_SUBTITLE
@ AV_CODEC_ID_DVB_SUBTITLE
Definition: codec_id.h:559
LATENCY_PROBE_DEMUX
@ LATENCY_PROBE_DEMUX
Definition: ffmpeg.h:99
OptionsContext::audio_disable
int audio_disable
Definition: ffmpeg.h:199
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:1336
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:209
ifile_open
int ifile_open(const OptionsContext *o, const char *filename, Scheduler *sch)
Definition: ffmpeg_demux.c:1621
AVInputFormat
Definition: avformat.h:548
AV_PKT_FLAG_CORRUPT
#define AV_PKT_FLAG_CORRUPT
The packet content is corrupted.
Definition: packet.h:595
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:845
OptionsContext::hwaccel_output_formats
SpecifierOptList hwaccel_output_formats
Definition: ffmpeg.h:177
SpecifierOptList::nb_opt
int nb_opt
Definition: cmdutils.h:181
CROP_DISABLED
@ CROP_DISABLED
Definition: ffmpeg.h:577
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:217
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:62
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:84
assert_file_overwrite
int assert_file_overwrite(const char *filename)
Definition: ffmpeg_opt.c:743
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:1825
s
#define s(width, name)
Definition: cbs_vp9.c:198
DemuxStream::first_dts
int64_t first_dts
Definition: ffmpeg_demux.c:75
Demuxer::readrate
float readrate
Definition: ffmpeg_demux.c:134
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:456
AVFormatContext::flags
int flags
Flags modifying the (de)muxer behaviour.
Definition: avformat.h:1451
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:1500
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:553
dec_init
int dec_init(Decoder **pdec, Scheduler *sch, AVDictionary **dec_opts, const DecoderOpts *o, AVFrame *param_out)
Definition: ffmpeg_dec.c:1661
AVFormatContext::iformat
const struct AVInputFormat * iformat
The input container format.
Definition: avformat.h:1312
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
AVCodecParameters::width
int width
Video only.
Definition: codec_par.h:134
OptionsContext::hwaccel_devices
SpecifierOptList hwaccel_devices
Definition: ffmpeg.h:176
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:135
InputFilter
Definition: ffmpeg.h:350
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:40
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:667
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:230
AVPacketSideData::data
uint8_t * data
Definition: packet.h:391
DemuxThreadContext
Definition: ffmpeg_demux.c:147
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:465
demux_send
static int demux_send(Demuxer *d, DemuxThreadContext *dt, DemuxStream *ds, AVPacket *pkt, unsigned flags)
Definition: ffmpeg_demux.c:573
Demuxer::nb_streams_warn
int nb_streams_warn
Definition: ffmpeg_demux.c:132
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:235
DecoderOpts::hwaccel_device
char * hwaccel_device
Definition: ffmpeg.h:411
input_stream_item_name
static const char * input_stream_item_name(void *obj)
Definition: ffmpeg_demux.c:1212
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:116
OptionsContext::accurate_seek
int accurate_seek
Definition: ffmpeg.h:168
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:203
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:564
AVFormatContext::data_codec
const struct AVCodec * data_codec
Forced data codec.
Definition: avformat.h:1849
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:126
DemuxThreadContext::pkt_demux
AVPacket * pkt_demux
Definition: ffmpeg_demux.c:149
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:2785
OptionsContext::start_time
int64_t start_time
Definition: ffmpeg.h:147
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:221
AVFormatContext
Format I/O context.
Definition: avformat.h:1300
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:1513
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:771
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:159
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:75
AVStream::time_base
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition: avformat.h:787
NULL
#define NULL
Definition: coverity.c:32
Demuxer::readrate_catchup
float readrate_catchup
Definition: ffmpeg_demux.c:136
dec_request_view
int dec_request_view(Decoder *dec, const ViewSpecifier *vs, SchedulerNode *src)
Definition: ffmpeg_dec.c:1035
Decoder::decode_errors
uint64_t decode_errors
Definition: ffmpeg.h:432
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:726
InputStream::top_field_first
int top_field_first
Definition: ffmpeg.h:458
InputStream::st
AVStream * st
Definition: ffmpeg.h:443
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:66
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:154
InputFile::start_time_effective
int64_t start_time_effective
Effective format start time based on enabled streams.
Definition: ffmpeg.h:480
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:1350
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:239
Demuxer::recording_time
int64_t recording_time
Definition: ffmpeg_demux.c:119
parseutils.h
AVProgram::stream_index
unsigned int * stream_index
Definition: avformat.h:1228
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:828
OptionsContext::reinit_filters
SpecifierOptList reinit_filters
Definition: ffmpeg.h:234
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:174
InputStream::fix_sub_duration
int fix_sub_duration
Definition: ffmpeg.h:461
FrameData::wallclock
int64_t wallclock[LATENCY_PROBE_NB]
Definition: ffmpeg.h:673
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:218
DemuxThreadContext::pkt_bsf
AVPacket * pkt_bsf
Definition: ffmpeg_demux.c:151
InputFilterOptions
Definition: ffmpeg.h:267
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:142
AVCodecParameters::ch_layout
AVChannelLayout ch_layout
Audio only.
Definition: codec_par.h:180
OptionsContext::input_sync_ref
int input_sync_ref
Definition: ffmpeg.h:170
report_new_stream
static void report_new_stream(Demuxer *d, const AVPacket *pkt)
Definition: ffmpeg_demux.c:175
guess_input_channel_layout
static int guess_input_channel_layout(InputStream *ist, AVCodecParameters *par, int guess_layout_max)
Definition: ffmpeg_demux.c:1154
DECODER_FLAG_FIX_SUB_DURATION
@ DECODER_FLAG_FIX_SUB_DURATION
Definition: ffmpeg.h:385
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:138
find_codec
int find_codec(void *logctx, const char *name, enum AVMediaType type, int encoder, const AVCodec **codec)
Definition: ffmpeg_opt.c:710
AVFormatContext::audio_codec
const struct AVCodec * audio_codec
Forced audio codec.
Definition: avformat.h:1833
InputStream::par
AVCodecParameters * par
Codec parameters - to be used by the decoding/streamcopy code.
Definition: ffmpeg.h:451
input_files
InputFile ** input_files
Definition: ffmpeg.c:104
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:657
avcodec_find_decoder
const AVCodec * avcodec_find_decoder(enum AVCodecID id)
Find a registered decoder with a matching codec ID.
Definition: allcodecs.c:1019
recast_media
int recast_media
Definition: ffmpeg_opt.c:86
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:1356
DemuxStream::dts
int64_t dts
Definition: ffmpeg_demux.c:81
av_codec_is_decoder
int av_codec_is_decoder(const AVCodec *codec)
Definition: utils.c:86
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:2534
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:244
IFILTER_FLAG_REINIT
@ IFILTER_FLAG_REINIT
Definition: ffmpeg.h:262
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:188
AVMediaType
AVMediaType
Definition: avutil.h:199
AVPacket::size
int size
Definition: packet.h:540
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:216
AVChannelLayout
An AVChannelLayout holds information about the channel layout of audio data.
Definition: channel_layout.h:319
FFMPEG_OPT_TOP
#define FFMPEG_OPT_TOP
Definition: ffmpeg.h:57
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:100
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:140
DemuxStream::decoding_needed
int decoding_needed
Definition: ffmpeg_demux.c:55
OptionsContext::apply_cropping
SpecifierOptList apply_cropping
Definition: ffmpeg.h:179
demux_thread_uninit
static void demux_thread_uninit(DemuxThreadContext *dt)
Definition: ffmpeg_demux.c:692
copy_ts
int copy_ts
Definition: ffmpeg_opt.c:66
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:248
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:149
input_file_class
static const AVClass input_file_class
Definition: ffmpeg_demux.c:1599
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:909
AVFrame::format
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
Definition: frame.h:497
AVMEDIA_TYPE_UNKNOWN
@ AVMEDIA_TYPE_UNKNOWN
Usually treated as AVMEDIA_TYPE_DATA.
Definition: avutil.h:200
DemuxStream::bsf
AVBSFContext * bsf
Definition: ffmpeg_demux.c:91
AVStream::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
Definition: avformat.h:826
OptionsContext::readrate_initial_burst
double readrate_initial_burst
Definition: ffmpeg.h:167
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:1467
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:538
avio_write
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
Definition: aviobuf.c:201
OptionsContext::find_stream_info
int find_stream_info
Definition: ffmpeg.h:171
OptionsContext::display_rotations
SpecifierOptList display_rotations
Definition: ffmpeg.h:216
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:545
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:223
OptionsContext::ts_scale
SpecifierOptList ts_scale
Definition: ffmpeg.h:173
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:534
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:220
video_codec_name
static const char * video_codec_name
Definition: ffplay.c:341
DemuxStream::next_dts
int64_t next_dts
dts of the last packet read for this stream (in AV_TIME_BASE units)
Definition: ffmpeg_demux.c:79
AVCodec::id
enum AVCodecID id
Definition: codec.h:201
CROP_CONTAINER
@ CROP_CONTAINER
Definition: ffmpeg.h:580
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:56
avcodec_get_name
const char * avcodec_get_name(enum AVCodecID id)
Get the name of a codec.
Definition: utils.c:409
HWACCEL_AUTO
@ HWACCEL_AUTO
Definition: ffmpeg.h:83
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:578
DemuxStream::dec_name
char dec_name[16]
Definition: ffmpeg_demux.c:87
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:532
OptionsContext::frame_rates
SpecifierOptList frame_rates
Definition: ffmpeg.h:156
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:1418
OptionsContext::codec_names
SpecifierOptList codec_names
Definition: ffmpeg.h:152
packet.h
demux_bsf_flush
static int demux_bsf_flush(Demuxer *d, DemuxThreadContext *dt)
Definition: ffmpeg_demux.c:642
AVFormatContext::subtitle_codec
const struct AVCodec * subtitle_codec
Forced subtitle codec.
Definition: avformat.h:1841
AVCodecParameters::height
int height
Definition: codec_par.h:135
OptionsContext::autorotate
SpecifierOptList autorotate
Definition: ffmpeg.h:178
AV_TIME_BASE
#define AV_TIME_BASE
Internal time base represented as integer.
Definition: avutil.h:254
DecoderOpts::time_base
AVRational time_base
Definition: ffmpeg.h:414
SHOW_TS_DEBUG
#define SHOW_TS_DEBUG(tag_)
OptionsContext::start_time_eof
int64_t start_time_eof
Definition: ffmpeg.h:148
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:70
Demuxer::have_audio_dec
int have_audio_dec
Definition: ffmpeg_demux.c:124
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:56
delta
float delta
Definition: vorbis_enc_data.h:430
AVMEDIA_TYPE_ATTACHMENT
@ AVMEDIA_TYPE_ATTACHMENT
Opaque data information usually sparse.
Definition: avutil.h:205
DemuxStream::resume_wc
int64_t resume_wc
Definition: ffmpeg_demux.c:98
InputFile::ctx
AVFormatContext * ctx
Definition: ffmpeg.h:474
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
OptionsContext::hwaccels
SpecifierOptList hwaccels
Definition: ffmpeg.h:175
AVProgram
New fields can be added to the end with minor version bumps.
Definition: avformat.h:1224
av_inv_q
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
Definition: rational.h:159
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:307
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:1454
av_codec_iterate
const AVCodec * av_codec_iterate(void **opaque)
Iterate over all registered codecs.
Definition: allcodecs.c:970
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:164
Timestamp::tb
AVRational tb
Definition: ffmpeg_utils.h:32
InputStream::decoder
Decoder * decoder
Definition: ffmpeg.h:452
AVStream::disposition
int disposition
Stream disposition - a combination of AV_DISPOSITION_* flags.
Definition: avformat.h:817
DemuxStream::codec_desc
const AVCodecDescriptor * codec_desc
Definition: ffmpeg_demux.c:83
ts_discontinuity_process
static void ts_discontinuity_process(Demuxer *d, InputStream *ist, AVPacket *pkt)
Definition: ffmpeg_demux.c:283
tag
uint32_t tag
Definition: movenc.c:1879
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:760
AVFMT_FLAG_BITEXACT
#define AVFMT_FLAG_BITEXACT
When muxing, try to avoid writing any random/volatile data to the output.
Definition: avformat.h:1468
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:748
AV_LOG_FATAL
#define AV_LOG_FATAL
Something went wrong and recovery is not possible.
Definition: log.h:203
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:763
DemuxStream::wrap_correction_done
int wrap_correction_done
Definition: ffmpeg_demux.c:72
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:80
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:123
InputFile::streams
InputStream ** streams
Definition: ffmpeg.h:488
add_display_matrix_to_stream
static int add_display_matrix_to_stream(const OptionsContext *o, AVFormatContext *ctx, InputStream *ist)
Definition: ffmpeg_demux.c:1171
hwaccel
static const char * hwaccel
Definition: ffplay.c:353
DECODER_FLAG_TOP_FIELD_FIRST
@ DECODER_FLAG_TOP_FIELD_FIRST
Definition: ffmpeg.h:392
Demuxer::accurate_seek
int accurate_seek
Definition: ffmpeg_demux.c:120
avformat.h
HWAccelID
HWAccelID
Definition: ffmpeg.h:81
av_packet_side_data_new
AVPacketSideData * av_packet_side_data_new(AVPacketSideData **psd, int *pnb_sd, enum AVPacketSideDataType type, size_t size, int flags)
Allocate a new packet side data.
Definition: packet.c:707
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:1107
check_avoptions_used
int check_avoptions_used(const AVDictionary *opts, const AVDictionary *opts_used, void *logctx, int decode)
Definition: ffmpeg.c:477
remove_avoptions
void remove_avoptions(AVDictionary **a, AVDictionary *b)
Definition: cmdutils.c:1520
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:3180
AVFormatContext::data_codec_id
enum AVCodecID data_codec_id
Forced Data codec_id.
Definition: avformat.h:1525
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:482
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:754
IFILTER_FLAG_CROP
@ IFILTER_FLAG_CROP
Definition: ffmpeg.h:264
InputFile::class
const AVClass * class
Definition: ffmpeg.h:470
OptionsContext::audio_sample_rate
SpecifierOptList audio_sample_rate
Definition: ffmpeg.h:155
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:215
PKT_OPAQUE_SUB_HEARTBEAT
@ PKT_OPAQUE_SUB_HEARTBEAT
Definition: ffmpeg.h:94
AVInputFormat::flags
int flags
Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS, AVFMT_NOTIMESTAMPS,...
Definition: avformat.h:567
AVRational::den
int den
Denominator.
Definition: rational.h:60
InputStream::file
struct InputFile * file
Definition: ffmpeg.h:439
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:149
IFILTER_FLAG_CFR
@ IFILTER_FLAG_CFR
Definition: ffmpeg.h:263
OptionsContext::frame_sizes
SpecifierOptList frame_sizes
Definition: ffmpeg.h:158
OptionsContext::video_disable
int video_disable
Definition: ffmpeg.h:198
ds_from_ist
static DemuxStream * ds_from_ist(InputStream *ist)
Definition: ffmpeg_demux.c:154
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:144
demux_alloc
static Demuxer * demux_alloc(void)
Definition: ffmpeg_demux.c:1606
AVFormatContext::duration
int64_t duration
Duration of the stream, in AV_TIME_BASE fractional seconds.
Definition: avformat.h:1435
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:541
GROW_ARRAY
#define GROW_ARRAY(array, nb_elems)
Definition: cmdutils.h:532
HWACCEL_NONE
@ HWACCEL_NONE
Definition: ffmpeg.h:82
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:839
ist_dts_update
static int ist_dts_update(DemuxStream *ds, AVPacket *pkt, FrameData *fd)
Definition: ffmpeg_demux.c:303
InputFile::ts_offset
int64_t ts_offset
Definition: ffmpeg.h:481
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:448
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:167
OptionsContext::codec_tags
SpecifierOptList codec_tags
Definition: ffmpeg.h:209
DecoderOpts::flags
int flags
Definition: ffmpeg.h:400
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:201
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:67
AVFMT_TS_DISCONT
#define AVFMT_TS_DISCONT
Format allows timestamp discontinuities.
Definition: avformat.h:481
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:491
DECODER_FLAG_TS_UNRELIABLE
@ DECODER_FLAG_TS_UNRELIABLE
Definition: ffmpeg.h:387
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:405
InputStream::class
const AVClass * class
Definition: ffmpeg.h:436
InputStream::index
int index
Definition: ffmpeg.h:441
readrate_sleep
static void readrate_sleep(Demuxer *d)
Definition: ffmpeg_demux.c:498
ffmpeg_sched.h
AVDictionaryEntry
Definition: dict.h:89
Demuxer::max_pts
Timestamp max_pts
Definition: ffmpeg_demux.c:129
DemuxStream::dec_opts
DecoderOpts dec_opts
Definition: ffmpeg_demux.c:86
stdin_interaction
int stdin_interaction
Definition: ffmpeg_opt.c:73
do_hex_dump
int do_hex_dump
Definition: ffmpeg_opt.c:64
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:516
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:1010
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
av_dict_set
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:88
AVPacket::pos
int64_t pos
byte position in stream, -1 if unknown
Definition: packet.h:559
packet_data
FrameData * packet_data(AVPacket *pkt)
Definition: ffmpeg.c:465
OptionsContext::data_disable
int data_disable
Definition: ffmpeg.h:201
int32_t
int32_t
Definition: audioconvert.c:56
ist_free
static void ist_free(InputStream **pist)
Definition: ffmpeg_demux.c:863
DemuxStream::reinit_filters
int reinit_filters
Definition: ffmpeg_demux.c:67
timestamp.h
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:482
Demuxer::min_pts
Timestamp min_pts
Definition: ffmpeg_demux.c:128
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:363
avio_close
int avio_close(AVIOContext *s)
Close the resource accessed by the AVIOContext s and free it.
Definition: avio.c:616
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:1425
DecoderOpts::framerate
AVRational framerate
Definition: ffmpeg.h:418
dts_error_threshold
float dts_error_threshold
Definition: ffmpeg_opt.c:56
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:345
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:121
avcodec_descriptor_get
const AVCodecDescriptor * avcodec_descriptor_get(enum AVCodecID id)
Definition: codec_desc.c:3780
do_send
static int do_send(Demuxer *d, DemuxStream *ds, AVPacket *pkt, unsigned flags, const char *pkt_desc)
Definition: ffmpeg_demux.c:544
Demuxer::last_ts
int64_t last_ts
Definition: ffmpeg_demux.c:117
DemuxStream::decoded_params
AVFrame * decoded_params
Definition: ffmpeg_demux.c:89
AVDictionaryEntry::value
char * value
Definition: dict.h:91
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:163
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
dts of the first packet read for this stream (in AV_TIME_BASE units)
Definition: ffmpeg_demux.c:73
InputFile::nb_streams
int nb_streams
Definition: ffmpeg.h:489
OptionsContext::guess_layout_max
SpecifierOptList guess_layout_max
Definition: ffmpeg.h:242
AVStream::pts_wrap_bits
int pts_wrap_bits
Number of bits in timestamps.
Definition: avformat.h:923
dump_attachment
static int dump_attachment(InputStream *ist, const char *filename)
Definition: ffmpeg_demux.c:1554
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:453
snprintf
#define snprintf
Definition: snprintf.h:34
DecoderOpts::hwaccel_device_type
enum AVHWDeviceType hwaccel_device_type
Definition: ffmpeg.h:410
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:208
input_thread
static int input_thread(void *arg)
Definition: ffmpeg_demux.c:715
src
#define src
Definition: vp8dsp.c:248
AVInputFormat::priv_class
const AVClass * priv_class
AVClass for the private context.
Definition: avformat.h:578
avcodec_parameters_copy
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
Copy the contents of src to dst.
Definition: codec_par.c:106
AVPacket::time_base
AVRational time_base
Time base of the packet's timestamps.
Definition: packet.h:583
OptionsContext::top_field_first
SpecifierOptList top_field_first
Definition: ffmpeg.h:224
OptionsContext::loop
int loop
Definition: ffmpeg.h:163
thread_set_name
static void thread_set_name(InputFile *f)
Definition: ffmpeg_demux.c:685
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:1519
DecoderOpts::name
char * name
Definition: ffmpeg.h:402