FFmpeg
ffmpeg_demux.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #include <float.h>
20 #include <stdint.h>
21 
22 #include "ffmpeg.h"
23 #include "ffmpeg_sched.h"
24 #include "ffmpeg_utils.h"
25 
26 #include "libavutil/avassert.h"
27 #include "libavutil/avstring.h"
28 #include "libavutil/display.h"
29 #include "libavutil/error.h"
30 #include "libavutil/intreadwrite.h"
31 #include "libavutil/mem.h"
32 #include "libavutil/opt.h"
33 #include "libavutil/parseutils.h"
34 #include "libavutil/pixdesc.h"
35 #include "libavutil/time.h"
36 #include "libavutil/timestamp.h"
37 
38 #include "libavcodec/bsf.h"
39 #include "libavcodec/packet.h"
40 
41 #include "libavformat/avformat.h"
42 
43 typedef struct DemuxStream {
45 
46  // name used for logging
47  char log_name[32];
48 
51 
52  double ts_scale;
53 
54  /* non zero if the packets must be decoded in 'raw_fifo', see DECODING_FOR_* */
56 #define DECODING_FOR_OST 1
57 #define DECODING_FOR_FILTER 2
58 
59  /* true if stream data should be discarded */
60  int discard;
61 
62  // scheduler returned EOF for this stream
63  int finished;
64 
72 
73 
76  /// dts of the first packet read for this stream (in AV_TIME_BASE units)
78 
79  /* predicted dts of the next packet read for this stream or (when there are
80  * several frames in a packet) of the next frame in current packet (in AV_TIME_BASE units) */
82  /// dts of the last packet read for this stream (in AV_TIME_BASE units)
84 
86 
89  char dec_name[16];
90  // decoded media properties, as estimated by opening the decoder
92 
94 
95  /* number of packets successfully read for this stream */
96  uint64_t nb_packets;
97  // combined size of all the packets read
98  uint64_t data_size;
99 } DemuxStream;
100 
101 typedef struct DemuxStreamGroup {
103 
104  // name used for logging
105  char log_name[32];
107 
108 typedef struct Demuxer {
110 
111  // name used for logging
112  char log_name[32];
113 
115 
116  /**
117  * Extra timestamp offset added by discontinuity handling.
118  */
121 
124 
125  /* number of times input stream should be looped */
126  int loop;
128  /* duration of the looped segment of the input file */
130  /* pts with the smallest/largest values ever seen */
133 
134  /* number of streams that the user was warned of */
136 
137  float readrate;
140 
141  // latest wallclock time at which packet reading resumed after a stall - used for readrate
143  // relative timestamp of first packet sent after the latest stall - used for readrate
145  // measure of how far behind packet reading is against spceified readrate
147 
149 
151 
155 } Demuxer;
156 
157 typedef struct DemuxThreadContext {
158  // packet used for reading from the demuxer
160  // packet for reading from BSFs
163 
165 {
166  return (DemuxStream*)ist;
167 }
168 
170 {
171  return (Demuxer*)f;
172 }
173 
175 {
176  for (InputStream *ist = ist_iter(NULL); ist; ist = ist_iter(ist)) {
177  DemuxStream *ds = ds_from_ist(ist);
178  if (ist->par->codec_type == type && ds->discard &&
179  ist->user_set_discard != AVDISCARD_ALL)
180  return ist;
181  }
182  return NULL;
183 }
184 
185 static void report_new_stream(Demuxer *d, const AVPacket *pkt)
186 {
187  const AVStream *st = d->f.ctx->streams[pkt->stream_index];
188 
189  if (pkt->stream_index < d->nb_streams_warn)
190  return;
192  "New %s stream with index %d at pos:%"PRId64" and DTS:%ss\n",
195  d->nb_streams_warn = pkt->stream_index + 1;
196 }
197 
198 static int seek_to_start(Demuxer *d, Timestamp end_pts)
199 {
200  InputFile *ifile = &d->f;
201  AVFormatContext *is = ifile->ctx;
202  int ret;
203 
204  ret = avformat_seek_file(is, -1, INT64_MIN, is->start_time, is->start_time, 0);
205  if (ret < 0)
206  return ret;
207 
208  if (end_pts.ts != AV_NOPTS_VALUE &&
209  (d->max_pts.ts == AV_NOPTS_VALUE ||
210  av_compare_ts(d->max_pts.ts, d->max_pts.tb, end_pts.ts, end_pts.tb) < 0))
211  d->max_pts = end_pts;
212 
213  if (d->max_pts.ts != AV_NOPTS_VALUE) {
214  int64_t min_pts = d->min_pts.ts == AV_NOPTS_VALUE ? 0 : d->min_pts.ts;
215  d->duration.ts = d->max_pts.ts - av_rescale_q(min_pts, d->min_pts.tb, d->max_pts.tb);
216  }
217  d->duration.tb = d->max_pts.tb;
218 
219  if (d->loop > 0)
220  d->loop--;
221 
222  return ret;
223 }
224 
226  AVPacket *pkt)
227 {
228  InputFile *ifile = &d->f;
229  DemuxStream *ds = ds_from_ist(ist);
230  const int fmt_is_discont = ifile->ctx->iformat->flags & AVFMT_TS_DISCONT;
231  int disable_discontinuity_correction = copy_ts;
234 
235  if (copy_ts && ds->next_dts != AV_NOPTS_VALUE &&
236  fmt_is_discont && ist->st->pts_wrap_bits < 60) {
237  int64_t wrap_dts = av_rescale_q_rnd(pkt->dts + (1LL<<ist->st->pts_wrap_bits),
240  if (FFABS(wrap_dts - ds->next_dts) < FFABS(pkt_dts - ds->next_dts)/10)
241  disable_discontinuity_correction = 0;
242  }
243 
244  if (ds->next_dts != AV_NOPTS_VALUE && !disable_discontinuity_correction) {
245  int64_t delta = pkt_dts - ds->next_dts;
246  if (fmt_is_discont) {
247  if (FFABS(delta) > 1LL * dts_delta_threshold * AV_TIME_BASE ||
248  pkt_dts + AV_TIME_BASE/10 < ds->dts) {
249  d->ts_offset_discont -= delta;
250  av_log(ist, AV_LOG_WARNING,
251  "timestamp discontinuity "
252  "(stream id=%d): %"PRId64", new offset= %"PRId64"\n",
253  ist->st->id, delta, d->ts_offset_discont);
255  if (pkt->pts != AV_NOPTS_VALUE)
257  }
258  } else {
259  if (FFABS(delta) > 1LL * dts_error_threshold * AV_TIME_BASE) {
260  av_log(ist, AV_LOG_WARNING,
261  "DTS %"PRId64", next:%"PRId64" st:%d invalid dropping\n",
262  pkt->dts, ds->next_dts, pkt->stream_index);
264  }
265  if (pkt->pts != AV_NOPTS_VALUE){
267  delta = pkt_pts - ds->next_dts;
268  if (FFABS(delta) > 1LL * dts_error_threshold * AV_TIME_BASE) {
269  av_log(ist, AV_LOG_WARNING,
270  "PTS %"PRId64", next:%"PRId64" invalid dropping st:%d\n",
271  pkt->pts, ds->next_dts, pkt->stream_index);
273  }
274  }
275  }
276  } else if (ds->next_dts == AV_NOPTS_VALUE && !copy_ts &&
277  fmt_is_discont && d->last_ts != AV_NOPTS_VALUE) {
278  int64_t delta = pkt_dts - d->last_ts;
279  if (FFABS(delta) > 1LL * dts_delta_threshold * AV_TIME_BASE) {
280  d->ts_offset_discont -= delta;
281  av_log(ist, AV_LOG_DEBUG,
282  "Inter stream timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
285  if (pkt->pts != AV_NOPTS_VALUE)
287  }
288  }
289 
291 }
292 
294  AVPacket *pkt)
295 {
297  pkt->time_base);
298 
299  // apply previously-detected timestamp-discontinuity offset
300  // (to all streams, not just audio/video)
301  if (pkt->dts != AV_NOPTS_VALUE)
302  pkt->dts += offset;
303  if (pkt->pts != AV_NOPTS_VALUE)
304  pkt->pts += offset;
305 
306  // detect timestamp discontinuities for audio/video
307  if ((ist->par->codec_type == AVMEDIA_TYPE_VIDEO ||
308  ist->par->codec_type == AVMEDIA_TYPE_AUDIO) &&
309  pkt->dts != AV_NOPTS_VALUE)
310  ts_discontinuity_detect(d, ist, pkt);
311 }
312 
314 {
315  InputStream *ist = &ds->ist;
316  const AVCodecParameters *par = ist->par;
317 
318  if (!ds->saw_first_ts) {
319  ds->first_dts =
320  ds->dts = ist->st->avg_frame_rate.num ? - ist->par->video_delay * AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0;
321  if (pkt->pts != AV_NOPTS_VALUE) {
322  ds->first_dts =
324  }
325  ds->saw_first_ts = 1;
326  }
327 
328  if (ds->next_dts == AV_NOPTS_VALUE)
329  ds->next_dts = ds->dts;
330 
331  if (pkt->dts != AV_NOPTS_VALUE)
333 
334  ds->dts = ds->next_dts;
335  switch (par->codec_type) {
336  case AVMEDIA_TYPE_AUDIO:
337  av_assert1(pkt->duration >= 0);
338  if (par->sample_rate) {
339  ds->next_dts += ((int64_t)AV_TIME_BASE * par->frame_size) /
340  par->sample_rate;
341  } else {
343  }
344  break;
345  case AVMEDIA_TYPE_VIDEO:
346  if (ist->framerate.num) {
347  // TODO: Remove work-around for c99-to-c89 issue 7
348  AVRational time_base_q = AV_TIME_BASE_Q;
349  int64_t next_dts = av_rescale_q(ds->next_dts, time_base_q, av_inv_q(ist->framerate));
350  ds->next_dts = av_rescale_q(next_dts + 1, av_inv_q(ist->framerate), time_base_q);
351  } else if (pkt->duration) {
353  } else if (ist->par->framerate.num != 0) {
354  AVRational field_rate = av_mul_q(ist->par->framerate,
355  (AVRational){ 2, 1 });
356  int fields = 2;
357 
358  if (ds->codec_desc &&
360  av_stream_get_parser(ist->st))
362 
363  ds->next_dts += av_rescale_q(fields, av_inv_q(field_rate), AV_TIME_BASE_Q);
364  }
365  break;
366  }
367 
368  fd->dts_est = ds->dts;
369 
370  return 0;
371 }
372 
373 static int ts_fixup(Demuxer *d, AVPacket *pkt, FrameData *fd)
374 {
375  InputFile *ifile = &d->f;
376  InputStream *ist = ifile->streams[pkt->stream_index];
377  DemuxStream *ds = ds_from_ist(ist);
378  const int64_t start_time = ifile->start_time_effective;
380  int ret;
381 
382  pkt->time_base = ist->st->time_base;
383 
384 #define SHOW_TS_DEBUG(tag_) \
385  if (debug_ts) { \
386  av_log(ist, AV_LOG_INFO, "%s -> ist_index:%d:%d type:%s " \
387  "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s duration:%s duration_time:%s\n", \
388  tag_, ifile->index, pkt->stream_index, \
389  av_get_media_type_string(ist->st->codecpar->codec_type), \
390  av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, &pkt->time_base), \
391  av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, &pkt->time_base), \
392  av_ts2str(pkt->duration), av_ts2timestr(pkt->duration, &pkt->time_base)); \
393  }
394 
395  SHOW_TS_DEBUG("demuxer");
396 
398  ist->st->pts_wrap_bits < 64) {
399  int64_t stime, stime2;
400 
402  stime2= stime + (1ULL<<ist->st->pts_wrap_bits);
403  ds->wrap_correction_done = 1;
404 
405  if(stime2 > stime && pkt->dts != AV_NOPTS_VALUE && pkt->dts > stime + (1LL<<(ist->st->pts_wrap_bits-1))) {
406  pkt->dts -= 1ULL<<ist->st->pts_wrap_bits;
407  ds->wrap_correction_done = 0;
408  }
409  if(stime2 > stime && pkt->pts != AV_NOPTS_VALUE && pkt->pts > stime + (1LL<<(ist->st->pts_wrap_bits-1))) {
410  pkt->pts -= 1ULL<<ist->st->pts_wrap_bits;
411  ds->wrap_correction_done = 0;
412  }
413  }
414 
415  if (pkt->dts != AV_NOPTS_VALUE)
417  if (pkt->pts != AV_NOPTS_VALUE)
419 
420  if (pkt->pts != AV_NOPTS_VALUE)
421  pkt->pts *= ds->ts_scale;
422  if (pkt->dts != AV_NOPTS_VALUE)
423  pkt->dts *= ds->ts_scale;
424 
426  if (pkt->pts != AV_NOPTS_VALUE) {
427  // audio decoders take precedence for estimating total file duration
428  int64_t pkt_duration = d->have_audio_dec ? 0 : pkt->duration;
429 
430  pkt->pts += duration;
431 
432  // update max/min pts that will be used to compute total file duration
433  // when using -stream_loop
434  if (d->max_pts.ts == AV_NOPTS_VALUE ||
436  pkt->pts + pkt_duration, pkt->time_base) < 0) {
437  d->max_pts = (Timestamp){ .ts = pkt->pts + pkt_duration,
438  .tb = pkt->time_base };
439  }
440  if (d->min_pts.ts == AV_NOPTS_VALUE ||
442  pkt->pts, pkt->time_base) > 0) {
443  d->min_pts = (Timestamp){ .ts = pkt->pts,
444  .tb = pkt->time_base };
445  }
446  }
447 
448  if (pkt->dts != AV_NOPTS_VALUE)
449  pkt->dts += duration;
450 
451  SHOW_TS_DEBUG("demuxer+tsfixup");
452 
453  // detect and try to correct for timestamp discontinuities
454  ts_discontinuity_process(d, ist, pkt);
455 
456  // update estimated/predicted dts
457  ret = ist_dts_update(ds, pkt, fd);
458  if (ret < 0)
459  return ret;
460 
461  return 0;
462 }
463 
464 static int input_packet_process(Demuxer *d, AVPacket *pkt, unsigned *send_flags)
465 {
466  InputFile *f = &d->f;
467  InputStream *ist = f->streams[pkt->stream_index];
468  DemuxStream *ds = ds_from_ist(ist);
469  FrameData *fd;
470  int ret = 0;
471 
472  fd = packet_data(pkt);
473  if (!fd)
474  return AVERROR(ENOMEM);
475 
476  ret = ts_fixup(d, pkt, fd);
477  if (ret < 0)
478  return ret;
479 
480  if (d->recording_time != INT64_MAX) {
481  int64_t start_time = 0;
482  if (copy_ts) {
483  start_time += f->start_time != AV_NOPTS_VALUE ? f->start_time : 0;
484  start_time += start_at_zero ? 0 : f->start_time_effective;
485  }
486  if (ds->dts >= d->recording_time + start_time)
487  *send_flags |= DEMUX_SEND_STREAMCOPY_EOF;
488  }
489 
490  ds->data_size += pkt->size;
491  ds->nb_packets++;
492 
494 
495  if (debug_ts) {
496  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",
497  f->index, pkt->stream_index,
502  av_ts2str(f->ts_offset), av_ts2timestr(f->ts_offset, &AV_TIME_BASE_Q));
503  }
504 
505  return 0;
506 }
507 
508 static void readrate_sleep(Demuxer *d)
509 {
510  InputFile *f = &d->f;
511  int64_t file_start = copy_ts * (
512  (f->start_time_effective != AV_NOPTS_VALUE ? f->start_time_effective * !start_at_zero : 0) +
513  (f->start_time != AV_NOPTS_VALUE ? f->start_time : 0)
514  );
515  int64_t initial_burst = AV_TIME_BASE * d->readrate_initial_burst;
516  int resume_warn = 0;
517 
518  DemuxStream *slowest = NULL;
519  int64_t progress = INT64_MAX;
520 
521  for (int i = 0; i < f->nb_streams; i++) {
522  InputStream *ist = f->streams[i];
523  DemuxStream *ds = ds_from_ist(ist);
524  int64_t stream_ts_offset, pts, pts_diff;
525  if (ds->discard || ds->finished || ds->first_dts == AV_NOPTS_VALUE)
526  continue;
527 
528  stream_ts_offset = FFMAX(ds->first_dts, file_start);
529  pts = av_rescale(ds->dts, 1000000, AV_TIME_BASE);
530  pts_diff = pts - stream_ts_offset;
531  if (pts_diff < progress) {
532  progress = pts_diff;
533  slowest = ds;
534  }
535  }
536 
537  if (!slowest || progress <= initial_burst)
538  return;
539 
541  int64_t wc_elapsed = now - d->wallclock_start;
542  int64_t max_prog = initial_burst + (int64_t)(wc_elapsed * d->readrate);
543  int64_t lag = FFMAX(max_prog - progress, 0);
544  int64_t limit;
545 
546  if ( (!d->lag && lag > 0.3 * AV_TIME_BASE) || ( lag > d->lag + 0.3 * AV_TIME_BASE) ) {
547  d->lag = lag;
548  d->resume_wc = now;
549  d->resume_progress = progress;
550 
551  int64_t pts = FFMAX(slowest->first_dts, file_start) + progress;
552  av_log_once(slowest, AV_LOG_WARNING, AV_LOG_DEBUG, &resume_warn,
553  "Resumed reading at pts %0.3f with rate %0.3f after a lag of %0.3fs\n",
554  (float)pts/AV_TIME_BASE, d->readrate_catchup, (float)lag/AV_TIME_BASE);
555  }
556  if (d->lag && !lag)
557  d->lag = d->resume_wc = d->resume_progress = 0;
558  if (d->resume_wc) {
559  int64_t elapsed = now - d->resume_wc;
560  limit = d->resume_progress + (int64_t)(elapsed * d->readrate_catchup);
561  } else {
562  limit = max_prog;
563  }
564 
565  if (progress > limit)
566  av_usleep(progress - limit);
567 }
568 
569 static int do_send(Demuxer *d, DemuxStream *ds, AVPacket *pkt, unsigned flags,
570  const char *pkt_desc)
571 {
572  int ret;
573 
575 
576  ret = sch_demux_send(d->sch, d->f.index, pkt, flags);
577  if (ret == AVERROR_EOF) {
579 
580  av_log(ds, AV_LOG_VERBOSE, "All consumers of this stream are done\n");
581  ds->finished = 1;
582 
583  if (++d->nb_streams_finished == d->nb_streams_used) {
584  av_log(d, AV_LOG_VERBOSE, "All consumers are done\n");
585  return AVERROR_EOF;
586  }
587  } else if (ret < 0) {
588  if (ret != AVERROR_EXIT)
589  av_log(d, AV_LOG_ERROR,
590  "Unable to send %s packet to consumers: %s\n",
591  pkt_desc, av_err2str(ret));
592  return ret;
593  }
594 
595  return 0;
596 }
597 
599  AVPacket *pkt, unsigned flags)
600 {
601  InputFile *f = &d->f;
602  int ret;
603 
604  // pkt can be NULL only when flushing BSFs
605  av_assert0(ds->bsf || pkt);
606 
607  // send heartbeat for sub2video streams
608  if (d->pkt_heartbeat && pkt && pkt->pts != AV_NOPTS_VALUE) {
609  for (int i = 0; i < f->nb_streams; i++) {
610  DemuxStream *ds1 = ds_from_ist(f->streams[i]);
611 
612  if (ds1->finished || !ds1->have_sub2video)
613  continue;
614 
615  d->pkt_heartbeat->pts = pkt->pts;
617  d->pkt_heartbeat->opaque = (void*)(intptr_t)PKT_OPAQUE_SUB_HEARTBEAT;
618 
619  ret = do_send(d, ds1, d->pkt_heartbeat, 0, "heartbeat");
620  if (ret < 0)
621  return ret;
622  }
623  }
624 
625  if (ds->bsf) {
626  if (pkt)
628 
629  ret = av_bsf_send_packet(ds->bsf, pkt);
630  if (ret < 0) {
631  if (pkt)
633  av_log(ds, AV_LOG_ERROR, "Error submitting a packet for filtering: %s\n",
634  av_err2str(ret));
635  return ret;
636  }
637 
638  while (1) {
639  ret = av_bsf_receive_packet(ds->bsf, dt->pkt_bsf);
640  if (ret == AVERROR(EAGAIN))
641  return 0;
642  else if (ret < 0) {
643  if (ret != AVERROR_EOF)
644  av_log(ds, AV_LOG_ERROR,
645  "Error applying bitstream filters to a packet: %s\n",
646  av_err2str(ret));
647  return ret;
648  }
649 
650  dt->pkt_bsf->time_base = ds->bsf->time_base_out;
651 
652  ret = do_send(d, ds, dt->pkt_bsf, 0, "filtered");
653  if (ret < 0) {
655  return ret;
656  }
657  }
658  } else {
659  ret = do_send(d, ds, pkt, flags, "demuxed");
660  if (ret < 0)
661  return ret;
662  }
663 
664  return 0;
665 }
666 
668 {
669  InputFile *f = &d->f;
670  int ret;
671 
672  for (unsigned i = 0; i < f->nb_streams; i++) {
673  DemuxStream *ds = ds_from_ist(f->streams[i]);
674 
675  if (!ds->bsf)
676  continue;
677 
678  ret = demux_send(d, dt, ds, NULL, 0);
679  ret = (ret == AVERROR_EOF) ? 0 : (ret < 0) ? ret : AVERROR_BUG;
680  if (ret < 0) {
681  av_log(ds, AV_LOG_ERROR, "Error flushing BSFs: %s\n",
682  av_err2str(ret));
683  return ret;
684  }
685 
686  av_bsf_flush(ds->bsf);
687  }
688 
689  return 0;
690 }
691 
693 {
694  for (int j = 0; j < ifile->ctx->nb_programs; j++) {
695  AVProgram *p = ifile->ctx->programs[j];
696  int discard = AVDISCARD_ALL;
697 
698  for (int k = 0; k < p->nb_stream_indexes; k++) {
699  DemuxStream *ds = ds_from_ist(ifile->streams[p->stream_index[k]]);
700 
701  if (!ds->discard) {
702  discard = AVDISCARD_DEFAULT;
703  break;
704  }
705  }
706  p->discard = discard;
707  }
708 }
709 
711 {
712  char name[16];
713  snprintf(name, sizeof(name), "dmx%d:%s", f->index, f->ctx->iformat->name);
715 }
716 
718 {
720  av_packet_free(&dt->pkt_bsf);
721 
722  memset(dt, 0, sizeof(*dt));
723 }
724 
726 {
727  memset(dt, 0, sizeof(*dt));
728 
729  dt->pkt_demux = av_packet_alloc();
730  if (!dt->pkt_demux)
731  return AVERROR(ENOMEM);
732 
733  dt->pkt_bsf = av_packet_alloc();
734  if (!dt->pkt_bsf)
735  return AVERROR(ENOMEM);
736 
737  return 0;
738 }
739 
740 static int input_thread(void *arg)
741 {
742  Demuxer *d = arg;
743  InputFile *f = &d->f;
744 
746 
747  int ret = 0;
748 
749  ret = demux_thread_init(&dt);
750  if (ret < 0)
751  goto finish;
752 
754 
756 
757  d->read_started = 1;
759 
760  while (1) {
761  DemuxStream *ds;
762  unsigned send_flags = 0;
763 
764  ret = av_read_frame(f->ctx, dt.pkt_demux);
765 
766  if (ret == AVERROR(EAGAIN)) {
767  av_usleep(10000);
768  continue;
769  }
770  if (ret < 0) {
771  int ret_bsf;
772 
773  if (ret == AVERROR_EOF)
774  av_log(d, AV_LOG_VERBOSE, "EOF while reading input\n");
775  else {
776  av_log(d, AV_LOG_ERROR, "Error during demuxing: %s\n",
777  av_err2str(ret));
778  ret = exit_on_error ? ret : 0;
779  }
780 
781  ret_bsf = demux_bsf_flush(d, &dt);
782  ret = err_merge(ret == AVERROR_EOF ? 0 : ret, ret_bsf);
783 
784  if (d->loop) {
785  /* signal looping to our consumers */
786  dt.pkt_demux->stream_index = -1;
787  ret = sch_demux_send(d->sch, f->index, dt.pkt_demux, 0);
788  if (ret >= 0)
789  ret = seek_to_start(d, (Timestamp){ .ts = dt.pkt_demux->pts,
790  .tb = dt.pkt_demux->time_base });
791  if (ret >= 0)
792  continue;
793 
794  /* fallthrough to the error path */
795  }
796 
797  break;
798  }
799 
800  if (do_pkt_dump) {
802  f->ctx->streams[dt.pkt_demux->stream_index]);
803  }
804 
805  /* the following test is needed in case new streams appear
806  dynamically in stream : we ignore them */
807  ds = dt.pkt_demux->stream_index < f->nb_streams ?
808  ds_from_ist(f->streams[dt.pkt_demux->stream_index]) : NULL;
809  if (!ds || ds->discard || ds->finished) {
812  continue;
813  }
814 
815  if (dt.pkt_demux->flags & AV_PKT_FLAG_CORRUPT) {
817  "corrupt input packet in stream %d\n",
818  dt.pkt_demux->stream_index);
819  if (exit_on_error) {
822  break;
823  }
824  }
825 
826  ret = input_packet_process(d, dt.pkt_demux, &send_flags);
827  if (ret < 0)
828  break;
829 
830  if (d->readrate)
831  readrate_sleep(d);
832 
833  ret = demux_send(d, &dt, ds, dt.pkt_demux, send_flags);
834  if (ret < 0)
835  break;
836  }
837 
838  // EOF/EXIT is normal termination
839  if (ret == AVERROR_EOF || ret == AVERROR_EXIT)
840  ret = 0;
841 
842 finish:
843  demux_thread_uninit(&dt);
844 
845  return ret;
846 }
847 
848 static void demux_final_stats(Demuxer *d)
849 {
850  InputFile *f = &d->f;
851  uint64_t total_packets = 0, total_size = 0;
852 
853  av_log(f, AV_LOG_VERBOSE, "Input file #%d (%s):\n",
854  f->index, f->ctx->url);
855 
856  for (int j = 0; j < f->nb_streams; j++) {
857  InputStream *ist = f->streams[j];
858  DemuxStream *ds = ds_from_ist(ist);
859  enum AVMediaType type = ist->par->codec_type;
860 
861  if (ds->discard || type == AVMEDIA_TYPE_ATTACHMENT)
862  continue;
863 
864  total_size += ds->data_size;
865  total_packets += ds->nb_packets;
866 
867  av_log(f, AV_LOG_VERBOSE, " Input stream #%d:%d (%s): ",
868  f->index, j, av_get_media_type_string(type));
869  av_log(f, AV_LOG_VERBOSE, "%"PRIu64" packets read (%"PRIu64" bytes); ",
870  ds->nb_packets, ds->data_size);
871 
872  if (ds->decoding_needed) {
874  "%"PRIu64" frames decoded; %"PRIu64" decode errors",
876  if (type == AVMEDIA_TYPE_AUDIO)
877  av_log(f, AV_LOG_VERBOSE, " (%"PRIu64" samples)", ist->decoder->samples_decoded);
878  av_log(f, AV_LOG_VERBOSE, "; ");
879  }
880 
881  av_log(f, AV_LOG_VERBOSE, "\n");
882  }
883 
884  av_log(f, AV_LOG_VERBOSE, " Total: %"PRIu64" packets (%"PRIu64" bytes) demuxed\n",
885  total_packets, total_size);
886 }
887 
888 static void ist_free(InputStream **pist)
889 {
890  InputStream *ist = *pist;
891  DemuxStream *ds;
892 
893  if (!ist)
894  return;
895  ds = ds_from_ist(ist);
896 
897  dec_free(&ist->decoder);
898 
900  av_freep(&ist->filters);
902 
904 
906 
907  av_bsf_free(&ds->bsf);
908 
909  av_freep(pist);
910 }
911 
912 static void istg_free(InputStreamGroup **pistg)
913 {
914  InputStreamGroup *istg = *pistg;
915 
916  if (!istg)
917  return;
918 
919  av_freep(pistg);
920 }
921 
923 {
924  InputFile *f = *pf;
926 
927  if (!f)
928  return;
929 
930  if (d->read_started)
932 
933  for (int i = 0; i < f->nb_streams; i++)
934  ist_free(&f->streams[i]);
935  av_freep(&f->streams);
936 
937  for (int i = 0; i < f->nb_stream_groups; i++)
938  istg_free(&f->stream_groups[i]);
939  av_freep(&f->stream_groups);
940 
941  avformat_close_input(&f->ctx);
942 
944 
945  av_freep(pf);
946 }
947 
948 int ist_use(InputStream *ist, int decoding_needed,
949  const ViewSpecifier *vs, SchedulerNode *src)
950 {
951  Demuxer *d = demuxer_from_ifile(ist->file);
952  DemuxStream *ds = ds_from_ist(ist);
953  int ret;
954 
955  if (ist->user_set_discard == AVDISCARD_ALL) {
956  av_log(ist, AV_LOG_ERROR, "Cannot %s a disabled input stream\n",
957  decoding_needed ? "decode" : "streamcopy");
958  return AVERROR(EINVAL);
959  }
960 
961  if (decoding_needed && !ist->dec) {
962  av_log(ist, AV_LOG_ERROR,
963  "Decoding requested, but no decoder found for: %s\n",
964  avcodec_get_name(ist->par->codec_id));
965  return AVERROR(EINVAL);
966  }
967 
968  if (ds->sch_idx_stream < 0) {
969  ret = sch_add_demux_stream(d->sch, d->f.index);
970  if (ret < 0)
971  return ret;
972  ds->sch_idx_stream = ret;
973  }
974 
975  if (ds->discard) {
976  ds->discard = 0;
977  d->nb_streams_used++;
978  }
979 
980  ist->st->discard = ist->user_set_discard;
981  ds->decoding_needed |= decoding_needed;
982  ds->streamcopy_needed |= !decoding_needed;
983 
984  if (decoding_needed && ds->sch_idx_dec < 0) {
985  int is_audio = ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO;
986  int is_unreliable = !!(d->f.ctx->iformat->flags & AVFMT_NOTIMESTAMPS);
987  int64_t use_wallclock_as_timestamps;
988 
989  ret = av_opt_get_int(d->f.ctx, "use_wallclock_as_timestamps", 0, &use_wallclock_as_timestamps);
990  if (ret < 0)
991  return ret;
992 
993  if (use_wallclock_as_timestamps)
994  is_unreliable = 0;
995 
997  (!!is_unreliable * DECODER_FLAG_TS_UNRELIABLE) |
998  (!!(d->loop && is_audio) * DECODER_FLAG_SEND_END_TS)
999 #if FFMPEG_OPT_TOP
1001 #endif
1002  ;
1003 
1004  if (ist->framerate.num) {
1006  ds->dec_opts.framerate = ist->framerate;
1007  } else
1008  ds->dec_opts.framerate = ist->st->avg_frame_rate;
1009 
1010  if (ist->dec->id == AV_CODEC_ID_DVB_SUBTITLE &&
1012  av_dict_set(&ds->decoder_opts, "compute_edt", "1", AV_DICT_DONT_OVERWRITE);
1014  av_log(ist, AV_LOG_WARNING,
1015  "Warning using DVB subtitles for filtering and output at the "
1016  "same time is not fully supported, also see -compute_edt [0|1]\n");
1017  }
1018 
1019  snprintf(ds->dec_name, sizeof(ds->dec_name), "%d:%d", ist->file->index, ist->index);
1020  ds->dec_opts.name = ds->dec_name;
1021 
1022  ds->dec_opts.codec = ist->dec;
1023  ds->dec_opts.par = ist->par;
1024 
1025  ds->dec_opts.log_parent = ist;
1026 
1028  if (!ds->decoded_params)
1029  return AVERROR(ENOMEM);
1030 
1031  ret = dec_init(&ist->decoder, d->sch,
1032  &ds->decoder_opts, &ds->dec_opts, ds->decoded_params);
1033  if (ret < 0)
1034  return ret;
1035  ds->sch_idx_dec = ret;
1036 
1038  SCH_DEC_IN(ds->sch_idx_dec));
1039  if (ret < 0)
1040  return ret;
1041 
1042  d->have_audio_dec |= is_audio;
1043  }
1044 
1045  if (decoding_needed && ist->par->codec_type == AVMEDIA_TYPE_VIDEO) {
1046  ret = dec_request_view(ist->decoder, vs, src);
1047  if (ret < 0)
1048  return ret;
1049  } else {
1050  *src = decoding_needed ?
1051  SCH_DEC_OUT(ds->sch_idx_dec, 0) :
1052  SCH_DSTREAM(d->f.index, ds->sch_idx_stream);
1053  }
1054 
1055  return 0;
1056 }
1057 
1058 int ist_filter_add(InputStream *ist, InputFilter *ifilter, int is_simple,
1060  SchedulerNode *src)
1061 {
1062  Demuxer *d = demuxer_from_ifile(ist->file);
1063  DemuxStream *ds = ds_from_ist(ist);
1064  int64_t tsoffset = 0;
1065  int ret;
1066 
1067  ret = ist_use(ist, is_simple ? DECODING_FOR_OST : DECODING_FOR_FILTER,
1068  vs, src);
1069  if (ret < 0)
1070  return ret;
1071 
1072  ret = GROW_ARRAY(ist->filters, ist->nb_filters);
1073  if (ret < 0)
1074  return ret;
1075 
1076  ist->filters[ist->nb_filters - 1] = ifilter;
1077 
1078  if (ist->par->codec_type == AVMEDIA_TYPE_VIDEO) {
1080  ist->par->nb_coded_side_data,
1082  if (ist->framerate.num > 0 && ist->framerate.den > 0) {
1083  opts->framerate = ist->framerate;
1084  opts->flags |= IFILTER_FLAG_CFR;
1085  } else
1086  opts->framerate = av_guess_frame_rate(d->f.ctx, ist->st, NULL);
1087  if (sd && sd->size >= sizeof(uint32_t) * 4) {
1088  opts->crop_top = AV_RL32(sd->data + 0);
1089  opts->crop_bottom = AV_RL32(sd->data + 4);
1090  opts->crop_left = AV_RL32(sd->data + 8);
1091  opts->crop_right = AV_RL32(sd->data + 12);
1092  if (ds->apply_cropping && ds->apply_cropping != CROP_CODEC &&
1093  (opts->crop_top | opts->crop_bottom | opts->crop_left | opts->crop_right))
1094  opts->flags |= IFILTER_FLAG_CROP;
1095  }
1096  } else if (ist->par->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1097  /* Compute the size of the canvas for the subtitles stream.
1098  If the subtitles codecpar has set a size, use it. Otherwise use the
1099  maximum dimensions of the video streams in the same file. */
1100  opts->sub2video_width = ist->par->width;
1101  opts->sub2video_height = ist->par->height;
1102  if (!(opts->sub2video_width && opts->sub2video_height)) {
1103  for (int j = 0; j < d->f.nb_streams; j++) {
1104  AVCodecParameters *par1 = d->f.streams[j]->par;
1105  if (par1->codec_type == AVMEDIA_TYPE_VIDEO) {
1106  opts->sub2video_width = FFMAX(opts->sub2video_width, par1->width);
1107  opts->sub2video_height = FFMAX(opts->sub2video_height, par1->height);
1108  }
1109  }
1110  }
1111 
1112  if (!(opts->sub2video_width && opts->sub2video_height)) {
1113  opts->sub2video_width = FFMAX(opts->sub2video_width, 720);
1114  opts->sub2video_height = FFMAX(opts->sub2video_height, 576);
1115  }
1116 
1117  if (!d->pkt_heartbeat) {
1119  if (!d->pkt_heartbeat)
1120  return AVERROR(ENOMEM);
1121  }
1122  ds->have_sub2video = 1;
1123  }
1124 
1125  ret = av_frame_copy_props(opts->fallback, ds->decoded_params);
1126  if (ret < 0)
1127  return ret;
1128  opts->fallback->format = ds->decoded_params->format;
1129  opts->fallback->width = ds->decoded_params->width;
1130  opts->fallback->height = ds->decoded_params->height;
1131 
1132  ret = av_channel_layout_copy(&opts->fallback->ch_layout, &ds->decoded_params->ch_layout);
1133  if (ret < 0)
1134  return ret;
1135 
1136  if (copy_ts) {
1137  tsoffset = d->f.start_time == AV_NOPTS_VALUE ? 0 : d->f.start_time;
1138  if (!start_at_zero && d->f.ctx->start_time != AV_NOPTS_VALUE)
1139  tsoffset += d->f.ctx->start_time;
1140  }
1141  opts->trim_start_us = ((d->f.start_time == AV_NOPTS_VALUE) || !d->accurate_seek) ?
1142  AV_NOPTS_VALUE : tsoffset;
1143  opts->trim_end_us = d->recording_time;
1144 
1145  opts->name = av_strdup(ds->dec_name);
1146  if (!opts->name)
1147  return AVERROR(ENOMEM);
1148 
1149  opts->flags |= IFILTER_FLAG_AUTOROTATE * !!(ds->autorotate) |
1152 
1153  return 0;
1154 }
1155 
1156 static int choose_decoder(const OptionsContext *o, void *logctx,
1157  AVFormatContext *s, AVStream *st,
1158  enum HWAccelID hwaccel_id, enum AVHWDeviceType hwaccel_device_type,
1159  const AVCodec **pcodec)
1160 
1161 {
1162  const char *codec_name = NULL;
1163 
1164  opt_match_per_stream_str(logctx, &o->codec_names, s, st, &codec_name);
1165  if (codec_name) {
1166  int ret = find_codec(NULL, codec_name, st->codecpar->codec_type, 0, pcodec);
1167  if (ret < 0)
1168  return ret;
1169  st->codecpar->codec_id = (*pcodec)->id;
1170  if (recast_media && st->codecpar->codec_type != (*pcodec)->type)
1171  st->codecpar->codec_type = (*pcodec)->type;
1172  return 0;
1173  } else {
1174  if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
1175  hwaccel_id == HWACCEL_GENERIC &&
1176  hwaccel_device_type != AV_HWDEVICE_TYPE_NONE) {
1177  const AVCodec *c;
1178  void *i = NULL;
1179 
1180  while ((c = av_codec_iterate(&i))) {
1181  const AVCodecHWConfig *config;
1182 
1183  if (c->id != st->codecpar->codec_id ||
1185  continue;
1186 
1187  for (int j = 0; config = avcodec_get_hw_config(c, j); j++) {
1188  if (config->device_type == hwaccel_device_type) {
1189  av_log(logctx, AV_LOG_VERBOSE, "Selecting decoder '%s' because of requested hwaccel method %s\n",
1190  c->name, av_hwdevice_get_type_name(hwaccel_device_type));
1191  *pcodec = c;
1192  return 0;
1193  }
1194  }
1195  }
1196  }
1197 
1198  *pcodec = avcodec_find_decoder(st->codecpar->codec_id);
1199  return 0;
1200  }
1201 }
1202 
1204  int guess_layout_max)
1205 {
1206  if (par->ch_layout.order == AV_CHANNEL_ORDER_UNSPEC) {
1207  char layout_name[256];
1208 
1209  if (par->ch_layout.nb_channels > guess_layout_max)
1210  return 0;
1213  return 0;
1214  av_channel_layout_describe(&par->ch_layout, layout_name, sizeof(layout_name));
1215  av_log(ist, AV_LOG_WARNING, "Guessed Channel Layout: %s\n", layout_name);
1216  }
1217  return 1;
1218 }
1219 
1222 {
1223  AVStream *st = ist->st;
1224  DemuxStream *ds = ds_from_ist(ist);
1225  AVPacketSideData *sd;
1226  double rotation = DBL_MAX;
1227  int hflip = -1, vflip = -1;
1228  int hflip_set = 0, vflip_set = 0, rotation_set = 0;
1229  int32_t *buf;
1230 
1231  opt_match_per_stream_dbl(ist, &o->display_rotations, ctx, st, &rotation);
1232  opt_match_per_stream_int(ist, &o->display_hflips, ctx, st, &hflip);
1233  opt_match_per_stream_int(ist, &o->display_vflips, ctx, st, &vflip);
1234 
1235  rotation_set = rotation != DBL_MAX;
1236  hflip_set = hflip != -1;
1237  vflip_set = vflip != -1;
1238 
1239  if (!rotation_set && !hflip_set && !vflip_set)
1240  return 0;
1241 
1245  sizeof(int32_t) * 9, 0);
1246  if (!sd) {
1247  av_log(ist, AV_LOG_FATAL, "Failed to generate a display matrix!\n");
1248  return AVERROR(ENOMEM);
1249  }
1250 
1251  buf = (int32_t *)sd->data;
1253  rotation_set ? -(rotation) : -0.0f);
1254 
1256  hflip_set ? hflip : 0,
1257  vflip_set ? vflip : 0);
1258 
1259  ds->force_display_matrix = 1;
1260 
1261  return 0;
1262 }
1263 
1264 static const char *input_stream_item_name(void *obj)
1265 {
1266  const DemuxStream *ds = obj;
1267 
1268  return ds->log_name;
1269 }
1270 
1271 static const AVClass input_stream_class = {
1272  .class_name = "InputStream",
1273  .version = LIBAVUTIL_VERSION_INT,
1274  .item_name = input_stream_item_name,
1275  .category = AV_CLASS_CATEGORY_DEMUXER,
1276 };
1277 
1279 {
1280  const char *type_str = av_get_media_type_string(st->codecpar->codec_type);
1281  InputFile *f = &d->f;
1282  DemuxStream *ds;
1283 
1284  ds = allocate_array_elem(&f->streams, sizeof(*ds), &f->nb_streams);
1285  if (!ds)
1286  return NULL;
1287 
1288  ds->sch_idx_stream = -1;
1289  ds->sch_idx_dec = -1;
1290 
1291  ds->ist.st = st;
1292  ds->ist.file = f;
1293  ds->ist.index = st->index;
1294  ds->ist.class = &input_stream_class;
1295 
1296  snprintf(ds->log_name, sizeof(ds->log_name), "%cist#%d:%d/%s",
1297  type_str ? *type_str : '?', d->f.index, st->index,
1299 
1300  return ds;
1301 }
1302 
1303 static int ist_add(const OptionsContext *o, Demuxer *d, AVStream *st, AVDictionary **opts_used)
1304 {
1305  AVFormatContext *ic = d->f.ctx;
1306  AVCodecParameters *par = st->codecpar;
1307  DemuxStream *ds;
1308  InputStream *ist;
1309  const char *framerate = NULL, *hwaccel_device = NULL;
1310  const char *hwaccel = NULL;
1311  const char *apply_cropping = NULL;
1312  const char *hwaccel_output_format = NULL;
1313  const char *codec_tag = NULL;
1314  const char *bsfs = NULL;
1315  char *next;
1316  const char *discard_str = NULL;
1317  int ret;
1318 
1319  ds = demux_stream_alloc(d, st);
1320  if (!ds)
1321  return AVERROR(ENOMEM);
1322 
1323  ist = &ds->ist;
1324 
1325  ds->discard = 1;
1326  st->discard = AVDISCARD_ALL;
1327  ds->first_dts = AV_NOPTS_VALUE;
1328  ds->next_dts = AV_NOPTS_VALUE;
1329 
1330  ds->dec_opts.time_base = st->time_base;
1331 
1332  ds->ts_scale = 1.0;
1333  opt_match_per_stream_dbl(ist, &o->ts_scale, ic, st, &ds->ts_scale);
1334 
1335  ds->autorotate = 1;
1336  opt_match_per_stream_int(ist, &o->autorotate, ic, st, &ds->autorotate);
1337 
1338  ds->apply_cropping = CROP_ALL;
1340  if (apply_cropping) {
1341  const AVOption opts[] = {
1342  { "apply_cropping", NULL, 0, AV_OPT_TYPE_INT,
1343  { .i64 = CROP_ALL }, CROP_DISABLED, CROP_CONTAINER, AV_OPT_FLAG_DECODING_PARAM, .unit = "apply_cropping" },
1344  { "none", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CROP_DISABLED }, .unit = "apply_cropping" },
1345  { "all", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CROP_ALL }, .unit = "apply_cropping" },
1346  { "codec", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CROP_CODEC }, .unit = "apply_cropping" },
1347  { "container", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CROP_CONTAINER }, .unit = "apply_cropping" },
1348  { NULL },
1349  };
1350  const AVClass class = {
1351  .class_name = "apply_cropping",
1352  .item_name = av_default_item_name,
1353  .option = opts,
1354  .version = LIBAVUTIL_VERSION_INT,
1355  };
1356  const AVClass *pclass = &class;
1357 
1359  if (ret < 0) {
1360  av_log(ist, AV_LOG_ERROR, "Invalid apply_cropping value '%s'.\n", apply_cropping);
1361  return ret;
1362  }
1363  }
1364 
1365  opt_match_per_stream_str(ist, &o->codec_tags, ic, st, &codec_tag);
1366  if (codec_tag) {
1367  uint32_t tag = strtol(codec_tag, &next, 0);
1368  if (*next) {
1369  uint8_t buf[4] = { 0 };
1370  memcpy(buf, codec_tag, FFMIN(sizeof(buf), strlen(codec_tag)));
1371  tag = AV_RL32(buf);
1372  }
1373 
1374  st->codecpar->codec_tag = tag;
1375  }
1376 
1377  if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
1378  ret = add_display_matrix_to_stream(o, ic, ist);
1379  if (ret < 0)
1380  return ret;
1381 
1382  opt_match_per_stream_str(ist, &o->hwaccels, ic, st, &hwaccel);
1384  &hwaccel_output_format);
1385  if (!hwaccel_output_format && hwaccel && !strcmp(hwaccel, "cuvid")) {
1386  av_log(ist, AV_LOG_WARNING,
1387  "WARNING: defaulting hwaccel_output_format to cuda for compatibility "
1388  "with old commandlines. This behaviour is DEPRECATED and will be removed "
1389  "in the future. Please explicitly set \"-hwaccel_output_format cuda\".\n");
1391  } else if (!hwaccel_output_format && hwaccel && !strcmp(hwaccel, "qsv")) {
1392  av_log(ist, AV_LOG_WARNING,
1393  "WARNING: defaulting hwaccel_output_format to qsv for compatibility "
1394  "with old commandlines. This behaviour is DEPRECATED and will be removed "
1395  "in the future. Please explicitly set \"-hwaccel_output_format qsv\".\n");
1397  } else if (!hwaccel_output_format && hwaccel && !strcmp(hwaccel, "mediacodec")) {
1398  // There is no real AVHWFrameContext implementation. Set
1399  // hwaccel_output_format to avoid av_hwframe_transfer_data error.
1401  } else if (hwaccel_output_format) {
1402  ds->dec_opts.hwaccel_output_format = av_get_pix_fmt(hwaccel_output_format);
1404  av_log(ist, AV_LOG_FATAL, "Unrecognised hwaccel output "
1405  "format: %s", hwaccel_output_format);
1406  }
1407  } else {
1409  }
1410 
1411  if (hwaccel) {
1412  // The NVDEC hwaccels use a CUDA device, so remap the name here.
1413  if (!strcmp(hwaccel, "nvdec") || !strcmp(hwaccel, "cuvid"))
1414  hwaccel = "cuda";
1415 
1416  if (!strcmp(hwaccel, "none"))
1418  else if (!strcmp(hwaccel, "auto"))
1420  else {
1422  if (type != AV_HWDEVICE_TYPE_NONE) {
1425  }
1426 
1427  if (!ds->dec_opts.hwaccel_id) {
1428  av_log(ist, AV_LOG_FATAL, "Unrecognized hwaccel: %s.\n",
1429  hwaccel);
1430  av_log(ist, AV_LOG_FATAL, "Supported hwaccels: ");
1432  while ((type = av_hwdevice_iterate_types(type)) !=
1434  av_log(ist, AV_LOG_FATAL, "%s ",
1436  av_log(ist, AV_LOG_FATAL, "\n");
1437  return AVERROR(EINVAL);
1438  }
1439  }
1440  }
1441 
1442  opt_match_per_stream_str(ist, &o->hwaccel_devices, ic, st, &hwaccel_device);
1443  if (hwaccel_device) {
1444  ds->dec_opts.hwaccel_device = av_strdup(hwaccel_device);
1445  if (!ds->dec_opts.hwaccel_device)
1446  return AVERROR(ENOMEM);
1447  }
1448  }
1449 
1450  ret = choose_decoder(o, ist, ic, st, ds->dec_opts.hwaccel_id,
1451  ds->dec_opts.hwaccel_device_type, &ist->dec);
1452  if (ret < 0)
1453  return ret;
1454 
1455  if (ist->dec) {
1457  ic, st, ist->dec, &ds->decoder_opts, opts_used);
1458  if (ret < 0)
1459  return ret;
1460  }
1461 
1462  ds->reinit_filters = -1;
1463  opt_match_per_stream_int(ist, &o->reinit_filters, ic, st, &ds->reinit_filters);
1464 
1465  ds->drop_changed = 0;
1466  opt_match_per_stream_int(ist, &o->drop_changed, ic, st, &ds->drop_changed);
1467 
1468  if (ds->drop_changed && ds->reinit_filters) {
1469  if (ds->reinit_filters > 0) {
1470  av_log(ist, AV_LOG_ERROR, "drop_changed and reinit_filters both enabled. These are mutually exclusive.\n");
1471  return AVERROR(EINVAL);
1472  }
1473  ds->reinit_filters = 0;
1474  }
1475 
1477 
1478  if ((o->video_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) ||
1483 
1484  opt_match_per_stream_str(ist, &o->discard, ic, st, &discard_str);
1485  if (discard_str) {
1486  ret = av_opt_set(ist->st, "discard", discard_str, 0);
1487  if (ret < 0) {
1488  av_log(ist, AV_LOG_ERROR, "Error parsing discard %s.\n", discard_str);
1489  return ret;
1490  }
1491  ist->user_set_discard = ist->st->discard;
1492  }
1493 
1495 
1496  av_dict_set_int(&ds->decoder_opts, "apply_cropping",
1497  ds->apply_cropping && ds->apply_cropping != CROP_CONTAINER, 0);
1498 
1499  if (ds->force_display_matrix) {
1500  char buf[32];
1501  if (av_dict_get(ds->decoder_opts, "side_data_prefer_packet", NULL, 0))
1502  buf[0] = ',';
1503  else
1504  buf[0] = '\0';
1505  av_strlcat(buf, "displaymatrix", sizeof(buf));
1506  av_dict_set(&ds->decoder_opts, "side_data_prefer_packet", buf, AV_DICT_APPEND);
1507  }
1508  /* Attached pics are sparse, therefore we would not want to delay their decoding
1509  * till EOF. */
1511  av_dict_set(&ds->decoder_opts, "thread_type", "-frame", 0);
1512 
1513  switch (par->codec_type) {
1514  case AVMEDIA_TYPE_VIDEO:
1515  opt_match_per_stream_str(ist, &o->frame_rates, ic, st, &framerate);
1516  if (framerate) {
1518  if (ret < 0) {
1519  av_log(ist, AV_LOG_ERROR, "Error parsing framerate %s.\n",
1520  framerate);
1521  return ret;
1522  }
1523  }
1524 
1525 #if FFMPEG_OPT_TOP
1526  ist->top_field_first = -1;
1527  opt_match_per_stream_int(ist, &o->top_field_first, ic, st, &ist->top_field_first);
1528 #endif
1529 
1530  break;
1531  case AVMEDIA_TYPE_AUDIO: {
1532  const char *ch_layout_str = NULL;
1533 
1534  opt_match_per_stream_str(ist, &o->audio_ch_layouts, ic, st, &ch_layout_str);
1535  if (ch_layout_str) {
1536  AVChannelLayout ch_layout;
1537  ret = av_channel_layout_from_string(&ch_layout, ch_layout_str);
1538  if (ret < 0) {
1539  av_log(ist, AV_LOG_ERROR, "Error parsing channel layout %s.\n", ch_layout_str);
1540  return ret;
1541  }
1542  if (par->ch_layout.nb_channels <= 0 || par->ch_layout.nb_channels == ch_layout.nb_channels) {
1544  par->ch_layout = ch_layout;
1545  } else {
1546  av_log(ist, AV_LOG_ERROR,
1547  "Specified channel layout '%s' has %d channels, but input has %d channels.\n",
1548  ch_layout_str, ch_layout.nb_channels, par->ch_layout.nb_channels);
1549  av_channel_layout_uninit(&ch_layout);
1550  return AVERROR(EINVAL);
1551  }
1552  } else {
1553  int guess_layout_max = INT_MAX;
1554  opt_match_per_stream_int(ist, &o->guess_layout_max, ic, st, &guess_layout_max);
1555  guess_input_channel_layout(ist, par, guess_layout_max);
1556  }
1557  break;
1558  }
1559  case AVMEDIA_TYPE_DATA:
1560  case AVMEDIA_TYPE_SUBTITLE: {
1561  const char *canvas_size = NULL;
1562 
1564  opt_match_per_stream_str(ist, &o->canvas_sizes, ic, st, &canvas_size);
1565  if (canvas_size) {
1566  ret = av_parse_video_size(&par->width, &par->height,
1567  canvas_size);
1568  if (ret < 0) {
1569  av_log(ist, AV_LOG_FATAL, "Invalid canvas size: %s.\n", canvas_size);
1570  return ret;
1571  }
1572  }
1573  break;
1574  }
1576  case AVMEDIA_TYPE_UNKNOWN:
1577  break;
1578  default: av_assert0(0);
1579  }
1580 
1581  ist->par = avcodec_parameters_alloc();
1582  if (!ist->par)
1583  return AVERROR(ENOMEM);
1584 
1585  ret = avcodec_parameters_copy(ist->par, par);
1586  if (ret < 0) {
1587  av_log(ist, AV_LOG_ERROR, "Error exporting stream parameters.\n");
1588  return ret;
1589  }
1590 
1591  if (ist->st->sample_aspect_ratio.num)
1593 
1594  opt_match_per_stream_str(ist, &o->bitstream_filters, ic, st, &bsfs);
1595  if (bsfs) {
1596  ret = av_bsf_list_parse_str(bsfs, &ds->bsf);
1597  if (ret < 0) {
1598  av_log(ist, AV_LOG_ERROR,
1599  "Error parsing bitstream filter sequence '%s': %s\n",
1600  bsfs, av_err2str(ret));
1601  return ret;
1602  }
1603 
1604  ret = avcodec_parameters_copy(ds->bsf->par_in, ist->par);
1605  if (ret < 0)
1606  return ret;
1607  ds->bsf->time_base_in = ist->st->time_base;
1608 
1609  ret = av_bsf_init(ds->bsf);
1610  if (ret < 0) {
1611  av_log(ist, AV_LOG_ERROR, "Error initializing bitstream filters: %s\n",
1612  av_err2str(ret));
1613  return ret;
1614  }
1615 
1616  ret = avcodec_parameters_copy(ist->par, ds->bsf->par_out);
1617  if (ret < 0)
1618  return ret;
1619  }
1620 
1622 
1623  return 0;
1624 }
1625 
1626 static const char *input_stream_group_item_name(void *obj)
1627 {
1628  const DemuxStreamGroup *dsg = obj;
1629 
1630  return dsg->log_name;
1631 }
1632 
1634  .class_name = "InputStreamGroup",
1635  .version = LIBAVUTIL_VERSION_INT,
1636  .item_name = input_stream_group_item_name,
1637  .category = AV_CLASS_CATEGORY_DEMUXER,
1638 };
1639 
1641 {
1642  InputFile *f = &d->f;
1643  DemuxStreamGroup *dsg;
1644 
1645  dsg = allocate_array_elem(&f->stream_groups, sizeof(*dsg), &f->nb_stream_groups);
1646  if (!dsg)
1647  return NULL;
1648 
1649  dsg->istg.stg = stg;
1650  dsg->istg.file = f;
1651  dsg->istg.index = stg->index;
1653 
1654  snprintf(dsg->log_name, sizeof(dsg->log_name), "istg#%d:%d/%s",
1655  d->f.index, stg->index, avformat_stream_group_name(stg->type));
1656 
1657  return dsg;
1658 }
1659 
1661 {
1662  InputFile *f = &d->f;
1663  AVFormatContext *ic = d->f.ctx;
1664  AVStreamGroup *stg = istg->stg;
1665  const AVStreamGroupTileGrid *tg = stg->params.tile_grid;
1667  AVBPrint bp;
1668  char *graph_str;
1669  int autorotate = 1;
1670  const char *apply_cropping = NULL;
1671  int ret;
1672 
1673  if (tg->nb_tiles == 1)
1674  return 0;
1675 
1676  memset(&opts, 0, sizeof(opts));
1677 
1679  if (autorotate)
1680  opts.flags |= OFILTER_FLAG_AUTOROTATE;
1681 
1682  opts.flags |= OFILTER_FLAG_CROP;
1684  if (apply_cropping) {
1685  char *p;
1686  int crop = strtol(apply_cropping, &p, 0);
1687  if (*p)
1688  return AVERROR(EINVAL);
1689  if (!crop)
1690  opts.flags &= ~OFILTER_FLAG_CROP;
1691  }
1692 
1694  for (int i = 0; i < tg->nb_tiles; i++)
1695  av_bprintf(&bp, "[%d:g:%d:%d]", f->index, stg->index, tg->offsets[i].idx);
1696  av_bprintf(&bp, "xstack=inputs=%d:layout=", tg->nb_tiles);
1697  for (int i = 0; i < tg->nb_tiles - 1; i++)
1698  av_bprintf(&bp, "%d_%d|", tg->offsets[i].horizontal,
1699  tg->offsets[i].vertical);
1700  av_bprintf(&bp, "%d_%d:fill=0x%02X%02X%02X@0x%02X", tg->offsets[tg->nb_tiles - 1].horizontal,
1701  tg->offsets[tg->nb_tiles - 1].vertical,
1702  tg->background[0], tg->background[1],
1703  tg->background[2], tg->background[3]);
1704  av_bprintf(&bp, "[%d:g:%d]", f->index, stg->index);
1705  ret = av_bprint_finalize(&bp, &graph_str);
1706  if (ret < 0)
1707  return ret;
1708 
1709  if (tg->coded_width != tg->width || tg->coded_height != tg->height) {
1710  opts.crop_top = tg->vertical_offset;
1711  opts.crop_bottom = tg->coded_height - tg->height - tg->vertical_offset;
1712  opts.crop_left = tg->horizontal_offset;
1713  opts.crop_right = tg->coded_width - tg->width - tg->horizontal_offset;
1714  }
1715 
1716  for (int i = 0; i < tg->nb_coded_side_data; i++) {
1717  const AVPacketSideData *sd = &tg->coded_side_data[i];
1718 
1719  ret = av_packet_side_data_to_frame(&opts.side_data, &opts.nb_side_data, sd, 0);
1720  if (ret < 0 && ret != AVERROR(EINVAL))
1721  goto fail;
1722  }
1723 
1724  ret = fg_create(NULL, &graph_str, d->sch, &opts);
1725  if (ret < 0)
1726  goto fail;
1727 
1728  istg->fg = filtergraphs[nb_filtergraphs-1];
1729  istg->fg->is_internal = 1;
1730 
1731  ret = 0;
1732 fail:
1733  if (ret < 0)
1734  av_freep(&graph_str);
1735 
1736  return ret;
1737 }
1738 
1739 static int istg_add(const OptionsContext *o, Demuxer *d, AVStreamGroup *stg)
1740 {
1741  DemuxStreamGroup *dsg;
1742  InputStreamGroup *istg;
1743  int ret;
1744 
1745  dsg = demux_stream_group_alloc(d, stg);
1746  if (!dsg)
1747  return AVERROR(ENOMEM);
1748 
1749  istg = &dsg->istg;
1750 
1751  switch (stg->type) {
1753  ret = istg_parse_tile_grid(o, d, istg);
1754  if (ret < 0)
1755  return ret;
1756  break;
1757  default:
1758  break;
1759  }
1760 
1761  return 0;
1762 }
1763 
1764 static int is_windows_reserved_device_name(const char *f)
1765 {
1766 #if HAVE_DOS_PATHS
1767  for (const char *p = f; p && *p; ) {
1768  char stem[6], *s;
1769  av_strlcpy(stem, p, sizeof(stem));
1770  if ((s = strchr(stem, '.')))
1771  *s = 0;
1772  if ((s = strpbrk(stem, "123456789")))
1773  *s = '1';
1774 
1775  if( !av_strcasecmp(stem, "AUX") ||
1776  !av_strcasecmp(stem, "CON") ||
1777  !av_strcasecmp(stem, "NUL") ||
1778  !av_strcasecmp(stem, "PRN") ||
1779  !av_strcasecmp(stem, "COM1") ||
1780  !av_strcasecmp(stem, "LPT1")
1781  )
1782  return 1;
1783 
1784  p = strchr(p, '/');
1785  if (p)
1786  p++;
1787  }
1788 #endif
1789  return 0;
1790 }
1791 
1792 static int safe_filename(const char *f, int allow_subdir)
1793 {
1794  const char *start = f;
1795 
1797  return 0;
1798 
1799  for (; *f; f++) {
1800  /* A-Za-z0-9_- */
1801  if (!((unsigned)((*f | 32) - 'a') < 26 ||
1802  (unsigned)(*f - '0') < 10 || *f == '_' || *f == '-')) {
1803  if (f == start)
1804  return 0;
1805  else if (allow_subdir && *f == '/')
1806  start = f + 1;
1807  else if (*f != '.')
1808  return 0;
1809  }
1810  }
1811  return 1;
1812 }
1813 
1814 static int dump_attachment(InputStream *ist, const char *filename)
1815 {
1816  AVStream *st = ist->st;
1817  int ret;
1818  AVIOContext *out = NULL;
1819  const AVDictionaryEntry *e;
1820 
1821  if (!st->codecpar->extradata_size) {
1822  av_log(ist, AV_LOG_WARNING, "No extradata to dump.\n");
1823  return 0;
1824  }
1825  if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0))) {
1826  filename = e->value;
1827  if (!safe_filename(filename, 0)) {
1828  av_log(ist, AV_LOG_ERROR, "Filename %s is unsafe\n", filename);
1829  return AVERROR(EINVAL);
1830  }
1831  }
1832  if (!*filename) {
1833  av_log(ist, AV_LOG_FATAL, "No filename specified and no 'filename' tag");
1834  return AVERROR(EINVAL);
1835  }
1836 
1837  ret = assert_file_overwrite(filename);
1838  if (ret < 0)
1839  return ret;
1840 
1841  if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
1842  av_log(ist, AV_LOG_FATAL, "Could not open file %s for writing.\n",
1843  filename);
1844  return ret;
1845  }
1846 
1848  ret = avio_close(out);
1849 
1850  if (ret >= 0)
1851  av_log(ist, AV_LOG_INFO, "Wrote attachment (%d bytes) to '%s'\n",
1852  st->codecpar->extradata_size, filename);
1853 
1854  return ret;
1855 }
1856 
1857 static const char *input_file_item_name(void *obj)
1858 {
1859  const Demuxer *d = obj;
1860 
1861  return d->log_name;
1862 }
1863 
1864 static const AVClass input_file_class = {
1865  .class_name = "InputFile",
1866  .version = LIBAVUTIL_VERSION_INT,
1867  .item_name = input_file_item_name,
1868  .category = AV_CLASS_CATEGORY_DEMUXER,
1869 };
1870 
1871 static Demuxer *demux_alloc(void)
1872 {
1874 
1875  if (!d)
1876  return NULL;
1877 
1878  d->f.class = &input_file_class;
1879  d->f.index = nb_input_files - 1;
1880 
1881  snprintf(d->log_name, sizeof(d->log_name), "in#%d", d->f.index);
1882 
1883  return d;
1884 }
1885 
1886 int ifile_open(const OptionsContext *o, const char *filename, Scheduler *sch)
1887 {
1888  Demuxer *d;
1889  InputFile *f;
1890  AVFormatContext *ic;
1891  const AVInputFormat *file_iformat = NULL;
1892  int err, ret = 0;
1893  int64_t timestamp;
1894  AVDictionary *opts_used = NULL;
1895  const char* video_codec_name = NULL;
1896  const char* audio_codec_name = NULL;
1897  const char* subtitle_codec_name = NULL;
1898  const char* data_codec_name = NULL;
1899  int scan_all_pmts_set = 0;
1900 
1902  int64_t start_time_eof = o->start_time_eof;
1903  int64_t stop_time = o->stop_time;
1904  int64_t recording_time = o->recording_time;
1905 
1906  d = demux_alloc();
1907  if (!d)
1908  return AVERROR(ENOMEM);
1909 
1910  f = &d->f;
1911 
1912  ret = sch_add_demux(sch, input_thread, d);
1913  if (ret < 0)
1914  return ret;
1915  d->sch = sch;
1916 
1917  if (stop_time != INT64_MAX && recording_time != INT64_MAX) {
1918  stop_time = INT64_MAX;
1919  av_log(d, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
1920  }
1921 
1922  if (stop_time != INT64_MAX && recording_time == INT64_MAX) {
1923  int64_t start = start_time == AV_NOPTS_VALUE ? 0 : start_time;
1924  if (stop_time <= start) {
1925  av_log(d, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
1926  return AVERROR(EINVAL);
1927  } else {
1928  recording_time = stop_time - start;
1929  }
1930  }
1931 
1932  if (o->format) {
1933  if (!(file_iformat = av_find_input_format(o->format))) {
1934  av_log(d, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
1935  return AVERROR(EINVAL);
1936  }
1937  }
1938 
1939  if (!strcmp(filename, "-"))
1940  filename = "fd:";
1941 
1942  stdin_interaction &= strncmp(filename, "pipe:", 5) &&
1943  strcmp(filename, "fd:") &&
1944  strcmp(filename, "/dev/stdin");
1945 
1946  /* get default parameters from command line */
1947  ic = avformat_alloc_context();
1948  if (!ic)
1949  return AVERROR(ENOMEM);
1950  ic->name = av_strdup(d->log_name);
1951  if (o->audio_sample_rate.nb_opt) {
1952  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);
1953  }
1954  if (o->audio_channels.nb_opt) {
1955  const AVClass *priv_class;
1956  if (file_iformat && (priv_class = file_iformat->priv_class) &&
1957  av_opt_find(&priv_class, "ch_layout", NULL, 0,
1959  char buf[32];
1960  snprintf(buf, sizeof(buf), "%dC", o->audio_channels.opt[o->audio_channels.nb_opt - 1].u.i);
1961  av_dict_set(&o->g->format_opts, "ch_layout", buf, 0);
1962  }
1963  }
1964  if (o->audio_ch_layouts.nb_opt) {
1965  const AVClass *priv_class;
1966  if (file_iformat && (priv_class = file_iformat->priv_class) &&
1967  av_opt_find(&priv_class, "ch_layout", NULL, 0,
1969  av_dict_set(&o->g->format_opts, "ch_layout", o->audio_ch_layouts.opt[o->audio_ch_layouts.nb_opt - 1].u.str, 0);
1970  }
1971  }
1972  if (o->frame_rates.nb_opt) {
1973  const AVClass *priv_class;
1974  /* set the format-level framerate option;
1975  * this is important for video grabbers, e.g. x11 */
1976  if (file_iformat && (priv_class = file_iformat->priv_class) &&
1977  av_opt_find(&priv_class, "framerate", NULL, 0,
1979  av_dict_set(&o->g->format_opts, "framerate",
1980  o->frame_rates.opt[o->frame_rates.nb_opt - 1].u.str, 0);
1981  }
1982  }
1983  if (o->frame_sizes.nb_opt) {
1984  av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes.opt[o->frame_sizes.nb_opt - 1].u.str, 0);
1985  }
1986  if (o->frame_pix_fmts.nb_opt)
1987  av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts.opt[o->frame_pix_fmts.nb_opt - 1].u.str, 0);
1988 
1993 
1994  if (video_codec_name)
1996  &ic->video_codec));
1997  if (audio_codec_name)
1999  &ic->audio_codec));
2000  if (subtitle_codec_name)
2002  &ic->subtitle_codec));
2003  if (data_codec_name)
2005  &ic->data_codec));
2006  if (ret < 0) {
2008  return ret;
2009  }
2010 
2015 
2016  ic->flags |= AVFMT_FLAG_NONBLOCK;
2017  if (o->bitexact)
2018  ic->flags |= AVFMT_FLAG_BITEXACT;
2019  ic->interrupt_callback = int_cb;
2020 
2021  if (!av_dict_get(o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) {
2022  av_dict_set(&o->g->format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE);
2023  scan_all_pmts_set = 1;
2024  }
2025  /* open the input file with generic avformat function */
2026  err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
2027  if (err < 0) {
2028  if (err != AVERROR_EXIT)
2029  av_log(d, AV_LOG_ERROR,
2030  "Error opening input: %s\n", av_err2str(err));
2031  if (err == AVERROR_PROTOCOL_NOT_FOUND)
2032  av_log(d, AV_LOG_ERROR, "Did you mean file:%s?\n", filename);
2033  return err;
2034  }
2035  f->ctx = ic;
2036 
2037  av_strlcat(d->log_name, "/", sizeof(d->log_name));
2038  av_strlcat(d->log_name, ic->iformat->name, sizeof(d->log_name));
2039  av_freep(&ic->name);
2040  ic->name = av_strdup(d->log_name);
2041 
2042  if (scan_all_pmts_set)
2043  av_dict_set(&o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE);
2045 
2047  if (ret < 0)
2048  return ret;
2049 
2050  /* apply forced codec ids */
2051  for (int i = 0; i < ic->nb_streams; i++) {
2052  const AVCodec *dummy;
2054  &dummy);
2055  if (ret < 0)
2056  return ret;
2057  }
2058 
2059  if (o->find_stream_info) {
2060  AVDictionary **opts;
2061  int orig_nb_streams = ic->nb_streams;
2062 
2064  if (ret < 0)
2065  return ret;
2066 
2067  /* If not enough info to get the stream parameters, we decode the
2068  first frames to get it. (used in mpeg case for example) */
2070 
2071  for (int i = 0; i < orig_nb_streams; i++)
2072  av_dict_free(&opts[i]);
2073  av_freep(&opts);
2074 
2075  if (ret < 0) {
2076  av_log(d, AV_LOG_FATAL, "could not find codec parameters\n");
2077  if (ic->nb_streams == 0)
2078  return ret;
2079  }
2080  }
2081 
2082  if (start_time != AV_NOPTS_VALUE && start_time_eof != AV_NOPTS_VALUE) {
2083  av_log(d, AV_LOG_WARNING, "Cannot use -ss and -sseof both, using -ss\n");
2084  start_time_eof = AV_NOPTS_VALUE;
2085  }
2086 
2087  if (start_time_eof != AV_NOPTS_VALUE) {
2088  if (start_time_eof >= 0) {
2089  av_log(d, AV_LOG_ERROR, "-sseof value must be negative; aborting\n");
2090  return AVERROR(EINVAL);
2091  }
2092  if (ic->duration > 0) {
2093  start_time = start_time_eof + ic->duration;
2094  if (start_time < 0) {
2095  av_log(d, AV_LOG_WARNING, "-sseof value seeks to before start of file; ignored\n");
2097  }
2098  } else
2099  av_log(d, AV_LOG_WARNING, "Cannot use -sseof, file duration not known\n");
2100  }
2101  timestamp = (start_time == AV_NOPTS_VALUE) ? 0 : start_time;
2102  /* add the stream start time */
2103  if (!o->seek_timestamp && ic->start_time != AV_NOPTS_VALUE)
2104  timestamp += ic->start_time;
2105 
2106  /* if seeking requested, we execute it */
2107  if (start_time != AV_NOPTS_VALUE) {
2108  int64_t seek_timestamp = timestamp;
2109 
2110  if (!(ic->iformat->flags & AVFMT_SEEK_TO_PTS)) {
2111  int dts_heuristic = 0;
2112  for (int i = 0; i < ic->nb_streams; i++) {
2113  const AVCodecParameters *par = ic->streams[i]->codecpar;
2114  if (par->video_delay) {
2115  dts_heuristic = 1;
2116  break;
2117  }
2118  }
2119  if (dts_heuristic) {
2120  seek_timestamp -= 3*AV_TIME_BASE / 23;
2121  }
2122  }
2123  ret = avformat_seek_file(ic, -1, INT64_MIN, seek_timestamp, seek_timestamp, 0);
2124  if (ret < 0) {
2125  av_log(d, AV_LOG_WARNING, "could not seek to position %0.3f\n",
2126  (double)timestamp / AV_TIME_BASE);
2127  }
2128  }
2129 
2130  f->start_time = start_time;
2131  d->recording_time = recording_time;
2132  f->input_sync_ref = o->input_sync_ref;
2133  f->input_ts_offset = o->input_ts_offset;
2134  f->ts_offset = o->input_ts_offset - (copy_ts ? (start_at_zero && ic->start_time != AV_NOPTS_VALUE ? ic->start_time : 0) : timestamp);
2135  d->accurate_seek = o->accurate_seek;
2136  d->loop = o->loop;
2137  d->nb_streams_warn = ic->nb_streams;
2138 
2139  d->duration = (Timestamp){ .ts = 0, .tb = (AVRational){ 1, 1 } };
2140  d->min_pts = (Timestamp){ .ts = AV_NOPTS_VALUE, .tb = (AVRational){ 1, 1 } };
2141  d->max_pts = (Timestamp){ .ts = AV_NOPTS_VALUE, .tb = (AVRational){ 1, 1 } };
2142 
2143  d->readrate = o->readrate ? o->readrate : 0.0;
2144  if (d->readrate < 0.0f) {
2145  av_log(d, AV_LOG_ERROR, "Option -readrate is %0.3f; it must be non-negative.\n", d->readrate);
2146  return AVERROR(EINVAL);
2147  }
2148  if (o->rate_emu) {
2149  if (d->readrate) {
2150  av_log(d, AV_LOG_WARNING, "Both -readrate and -re set. Using -readrate %0.3f.\n", d->readrate);
2151  } else
2152  d->readrate = 1.0f;
2153  }
2154 
2155  if (d->readrate) {
2157  if (d->readrate_initial_burst < 0.0) {
2158  av_log(d, AV_LOG_ERROR,
2159  "Option -readrate_initial_burst is %0.3f; it must be non-negative.\n",
2161  return AVERROR(EINVAL);
2162  }
2164  if (d->readrate_catchup < d->readrate) {
2165  av_log(d, AV_LOG_ERROR,
2166  "Option -readrate_catchup is %0.3f; it must be at least equal to %0.3f.\n",
2167  d->readrate_catchup, d->readrate);
2168  return AVERROR(EINVAL);
2169  }
2170  } else {
2171  if (o->readrate_initial_burst) {
2172  av_log(d, AV_LOG_WARNING, "Option -readrate_initial_burst ignored "
2173  "since neither -readrate nor -re were given\n");
2174  }
2175  if (o->readrate_catchup) {
2176  av_log(d, AV_LOG_WARNING, "Option -readrate_catchup ignored "
2177  "since neither -readrate nor -re were given\n");
2178  }
2179  }
2180 
2181  /* Add all the streams from the given input file to the demuxer */
2182  for (int i = 0; i < ic->nb_streams; i++) {
2183  ret = ist_add(o, d, ic->streams[i], &opts_used);
2184  if (ret < 0) {
2185  av_dict_free(&opts_used);
2186  return ret;
2187  }
2188  }
2189 
2190  /* Add all the stream groups from the given input file to the demuxer */
2191  for (int i = 0; i < ic->nb_stream_groups; i++) {
2192  ret = istg_add(o, d, ic->stream_groups[i]);
2193  if (ret < 0)
2194  return ret;
2195  }
2196 
2197  /* dump the file content */
2198  av_dump_format(ic, f->index, filename, 0);
2199 
2200  /* check if all codec options have been used */
2201  ret = check_avoptions_used(o->g->codec_opts, opts_used, d, 1);
2202  av_dict_free(&opts_used);
2203  if (ret < 0)
2204  return ret;
2205 
2206  for (int i = 0; i < o->dump_attachment.nb_opt; i++) {
2207  for (int j = 0; j < f->nb_streams; j++) {
2208  InputStream *ist = f->streams[j];
2209 
2210  if (check_stream_specifier(ic, ist->st, o->dump_attachment.opt[i].specifier) == 1) {
2212  if (ret < 0)
2213  return ret;
2214  }
2215  }
2216  }
2217 
2218  return 0;
2219 }
OptionsContext::readrate
float readrate
Definition: ffmpeg.h:167
flags
const SwsFlags flags[]
Definition: swscale.c:61
AV_PKT_DATA_DISPLAYMATRIX
@ AV_PKT_DATA_DISPLAYMATRIX
This side data contains a 3x3 transformation matrix describing an affine transformation that needs to...
Definition: packet.h:105
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: packet.c:432
AVCodec
AVCodec.
Definition: codec.h:172
OptionsContext::input_ts_offset
int64_t input_ts_offset
Definition: ffmpeg.h:164
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:203
DemuxStream::ist
InputStream ist
Definition: ffmpeg_demux.c:44
av_gettime_relative
int64_t av_gettime_relative(void)
Get the current time in microseconds since some unspecified starting point.
Definition: time.c:56
AVBSFContext::par_in
AVCodecParameters * par_in
Parameters of the input stream.
Definition: bsf.h:90
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
AV_BPRINT_SIZE_UNLIMITED
#define AV_BPRINT_SIZE_UNLIMITED
InputFile::start_time
int64_t start_time
Definition: ffmpeg.h:541
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
AVFormatContext::stream_groups
AVStreamGroup ** stream_groups
A list of all stream groups in the file.
Definition: avformat.h:1350
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:192
demux_final_stats
static void demux_final_stats(Demuxer *d)
Definition: ffmpeg_demux.c:848
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:109
opt.h
safe_filename
static int safe_filename(const char *f, int allow_subdir)
Definition: ffmpeg_demux.c:1792
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:51
AVStreamGroup::tile_grid
struct AVStreamGroupTileGrid * tile_grid
Definition: avformat.h:1132
input_stream_class
static const AVClass input_stream_class
Definition: ffmpeg_demux.c:1271
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:720
DemuxStreamGroup
Definition: ffmpeg_demux.c:101
check_avoptions
int check_avoptions(AVDictionary *m)
Definition: cmdutils.c:1605
apply_cropping
static int apply_cropping(AVCodecContext *avctx, AVFrame *frame)
Definition: decode.c:744
out
static FILE * out
Definition: movenc.c:55
DemuxStream::drop_changed
int drop_changed
Definition: ffmpeg_demux.c:71
av_bprint_init
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Definition: bprint.c:69
DecoderOpts
Definition: ffmpeg.h:445
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:440
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
AVStreamGroupTileGrid::horizontal_offset
int horizontal_offset
Offset in pixels from the left edge of the canvas where the actual image meant for presentation start...
Definition: avformat.h:1018
AV_DISPOSITION_ATTACHED_PIC
#define AV_DISPOSITION_ATTACHED_PIC
The stream is stored in the file as an attached picture/"cover art" (e.g.
Definition: avformat.h:670
AVStream::discard
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
Definition: avformat.h:815
FrameData::dts_est
int64_t dts_est
Definition: ffmpeg.h:723
sch_add_demux
int sch_add_demux(Scheduler *sch, SchThreadFunc func, void *ctx)
Add a demuxer to the scheduler.
Definition: ffmpeg_sched.c:698
input_packet_process
static int input_packet_process(Demuxer *d, AVPacket *pkt, unsigned *send_flags)
Definition: ffmpeg_demux.c:464
demux_thread_init
static int demux_thread_init(DemuxThreadContext *dt)
Definition: ffmpeg_demux.c:725
SCH_DSTREAM
#define SCH_DSTREAM(file, stream)
Definition: ffmpeg_sched.h:111
AVFMT_NOTIMESTAMPS
#define AVFMT_NOTIMESTAMPS
Format does not need / have any timestamps.
Definition: avformat.h:478
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:263
int64_t
long long int64_t
Definition: coverity.c:34
InputStream::user_set_discard
int user_set_discard
Definition: ffmpeg.h:490
av_strcasecmp
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
Definition: avstring.c:208
DemuxStream::sch_idx_stream
int sch_idx_stream
Definition: ffmpeg_demux.c:49
OptionsContext::audio_ch_layouts
SpecifierOptList audio_ch_layouts
Definition: ffmpeg.h:155
ist_add
static int ist_add(const OptionsContext *o, Demuxer *d, AVStream *st, AVDictionary **opts_used)
Definition: ffmpeg_demux.c:1303
ist_iter
InputStream * ist_iter(InputStream *prev)
Definition: ffmpeg.c:387
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:64
DemuxStream::finished
int finished
Definition: ffmpeg_demux.c:63
InputFile::index
int index
Definition: ffmpeg.h:530
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:427
pixdesc.h
AVFormatContext::streams
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1331
AVFrame::width
int width
Definition: frame.h:499
DECODER_FLAG_FRAMERATE_FORCED
@ DECODER_FLAG_FRAMERATE_FORCED
Definition: ffmpeg.h:436
AVPacketSideData
This structure stores auxiliary information for decoding, presenting, or otherwise processing the cod...
Definition: packet.h:409
OptionsContext::display_hflips
SpecifierOptList display_hflips
Definition: ffmpeg.h:219
DecoderOpts::par
const AVCodecParameters * par
Definition: ffmpeg.h:452
demux_stream_group_alloc
static DemuxStreamGroup * demux_stream_group_alloc(Demuxer *d, AVStreamGroup *stg)
Definition: ffmpeg_demux.c:1640
ifile_close
void ifile_close(InputFile **pf)
Definition: ffmpeg_demux.c:922
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:342
AV_HWDEVICE_TYPE_NONE
@ AV_HWDEVICE_TYPE_NONE
Definition: hwcontext.h:28
OptionsContext::subtitle_disable
int subtitle_disable
Definition: ffmpeg.h:202
demux_stream_alloc
static DemuxStream * demux_stream_alloc(Demuxer *d, AVStream *st)
Definition: ffmpeg_demux.c:1278
OptionsContext::readrate_catchup
float readrate_catchup
Definition: ffmpeg.h:168
AVOption
AVOption.
Definition: opt.h:429
AVStream::avg_frame_rate
AVRational avg_frame_rate
Average framerate.
Definition: avformat.h:833
AVStreamGroupTileGrid::vertical_offset
int vertical_offset
Offset in pixels from the top edge of the canvas where the actual image meant for presentation starts...
Definition: avformat.h:1025
DecoderOpts::hwaccel_id
enum HWAccelID hwaccel_id
Definition: ffmpeg.h:455
InputStream::nb_filters
int nb_filters
Definition: ffmpeg.h:512
AV_DICT_APPEND
#define AV_DICT_APPEND
If the entry already exists, append to it.
Definition: dict.h:82
AVCodecParameters::framerate
AVRational framerate
Video only.
Definition: codec_par.h:156
av_hwdevice_find_type_by_name
enum AVHWDeviceType av_hwdevice_find_type_by_name(const char *name)
Look up an AVHWDeviceType by name.
Definition: hwcontext.c:110
ffmpeg.h
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
float.h
DemuxStream::decoder_opts
AVDictionary * decoder_opts
Definition: ffmpeg_demux.c:87
AVFormatContext::programs
AVProgram ** programs
Definition: avformat.h:1461
av_hwdevice_iterate_types
enum AVHWDeviceType av_hwdevice_iterate_types(enum AVHWDeviceType prev)
Iterate over supported device types.
Definition: hwcontext.c:129
autorotate
static int autorotate
Definition: ffplay.c:350
OptionsContext::bitexact
int bitexact
Definition: ffmpeg.h:198
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:606
ViewSpecifier
Definition: ffmpeg.h:129
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: codec_par.h:59
AVDictionary
Definition: dict.c:32
AVChannelLayout::order
enum AVChannelOrder order
Channel order used in this layout.
Definition: channel_layout.h:324
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
AVStreamGroupTileGrid::vertical
int vertical
Offset in pixels from the top edge of the canvas where the tile should be placed.
Definition: avformat.h:1000
av_read_frame
int av_read_frame(AVFormatContext *s, AVPacket *pkt)
Return the next frame of a stream.
Definition: demux.c:1588
AVFormatContext::video_codec_id
enum AVCodecID video_codec_id
Forced video codec_id.
Definition: avformat.h:1467
IFILTER_FLAG_AUTOROTATE
@ IFILTER_FLAG_AUTOROTATE
Definition: ffmpeg.h:266
OptionsContext::format
const char * format
Definition: ffmpeg.h:152
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:442
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
av_packet_side_data_to_frame
int av_packet_side_data_to_frame(AVFrameSideData ***psd, int *pnb_sd, const AVPacketSideData *src, unsigned int flags)
Add a new frame side data entry to an array based on existing packet side data, if a matching type ex...
Definition: avcodec.c:867
tf_sess_config.config
config
Definition: tf_sess_config.py:33
file_iformat
static const AVInputFormat * file_iformat
Definition: ffplay.c:307
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:74
OptionsContext::frame_pix_fmts
SpecifierOptList frame_pix_fmts
Definition: ffmpeg.h:161
AVBSFContext
The bitstream filter state.
Definition: bsf.h:68
input_stream_group_item_name
static const char * input_stream_group_item_name(void *obj)
Definition: ffmpeg_demux.c:1626
OptionsContext::canvas_sizes
SpecifierOptList canvas_sizes
Definition: ffmpeg.h:240
AVStreamGroupTileGrid::offsets
struct AVStreamGroupTileGrid::@434 * offsets
An nb_tiles sized array of offsets in pixels from the topleft edge of the canvas, indicating where ea...
Demuxer::wallclock_start
int64_t wallclock_start
Definition: ffmpeg_demux.c:114
SpecifierOpt::i
int i
Definition: cmdutils.h:175
InputStream
Definition: ffmpeg.h:481
DecoderOpts::hwaccel_output_format
enum AVPixelFormat hwaccel_output_format
Definition: ffmpeg.h:458
debug_ts
int debug_ts
Definition: ffmpeg_opt.c:70
avformat_close_input
void avformat_close_input(AVFormatContext **s)
Close an opened input AVFormatContext.
Definition: demux.c:377
AVPacketSideData::size
size_t size
Definition: packet.h:411
OutputFilterOptions
Definition: ffmpeg.h:309
AVFormatContext::interrupt_callback
AVIOInterruptCB interrupt_callback
Custom interrupt callbacks for the I/O layer.
Definition: avformat.h:1533
Demuxer
Definition: ffmpeg_demux.c:108
OptionsContext::rate_emu
int rate_emu
Definition: ffmpeg.h:166
CROP_CODEC
@ CROP_CODEC
Definition: ffmpeg.h:643
dts_delta_threshold
float dts_delta_threshold
Definition: ffmpeg_opt.c:56
DemuxStream::data_size
uint64_t data_size
Definition: ffmpeg_demux.c:98
finish
static void finish(void)
Definition: movenc.c:374
bsf.h
AVFMT_SEEK_TO_PTS
#define AVFMT_SEEK_TO_PTS
Seeking is based on PTS.
Definition: avformat.h:499
InputStreamGroup
Definition: ffmpeg.h:515
OptionsContext::g
OptionGroup * g
Definition: ffmpeg.h:146
Demuxer::log_name
char log_name[32]
Definition: ffmpeg_demux.c:112
Decoder::frames_decoded
uint64_t frames_decoded
Definition: ffmpeg.h:476
Demuxer::nb_streams_finished
int nb_streams_finished
Definition: ffmpeg_demux.c:154
opt_match_per_stream_int
void opt_match_per_stream_int(void *logctx, const SpecifierOptList *sol, AVFormatContext *fc, AVStream *st, int *out)
fail
#define fail()
Definition: checkasm.h:219
AVStreamGroupTileGrid
AVStreamGroupTileGrid holds information on how to combine several independent images on a single canv...
Definition: avformat.h:951
dummy
int dummy
Definition: motion.c:64
avformat_stream_group_name
const char * avformat_stream_group_name(enum AVStreamGroupParamsType type)
Definition: avformat.c:260
AVStreamGroupTileGrid::coded_width
int coded_width
Width of the canvas.
Definition: avformat.h:966
DecoderOpts::log_parent
void * log_parent
Definition: ffmpeg.h:449
InputStreamGroup::index
int index
Definition: ffmpeg.h:521
input_file_item_name
static const char * input_file_item_name(void *obj)
Definition: ffmpeg_demux.c:1857
AVDISCARD_NONE
@ AVDISCARD_NONE
discard nothing
Definition: defs.h:226
AVStreamGroup::params
union AVStreamGroup::@435 params
Group type-specific parameters.
AVFrame::ch_layout
AVChannelLayout ch_layout
Channel layout of the audio data.
Definition: frame.h:770
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
AVStreamGroupTileGrid::coded_height
int coded_height
Width of the canvas.
Definition: avformat.h:972
pts
static int64_t pts
Definition: transcode_aac.c:644
OptionsContext
Definition: ffmpeg.h:145
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
DemuxStreamGroup::istg
InputStreamGroup istg
Definition: ffmpeg_demux.c:102
do_pkt_dump
int do_pkt_dump
Definition: ffmpeg_opt.c:66
Demuxer::ts_offset_discont
int64_t ts_offset_discont
Extra timestamp offset added by discontinuity handling.
Definition: ffmpeg_demux.c:119
AVRational::num
int num
Numerator.
Definition: rational.h:59
Demuxer::f
InputFile f
Definition: ffmpeg_demux.c:109
Decoder::samples_decoded
uint64_t samples_decoded
Definition: ffmpeg.h:477
InputFile
Definition: ffmpeg.h:527
DemuxStream::nb_packets
uint64_t nb_packets
Definition: ffmpeg_demux.c:96
Demuxer::nb_streams_used
int nb_streams_used
Definition: ffmpeg_demux.c:153
OptionsContext::recording_time
int64_t recording_time
Definition: ffmpeg.h:191
av_frame_alloc
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:52
AV_CODEC_ID_DVB_SUBTITLE
@ AV_CODEC_ID_DVB_SUBTITLE
Definition: codec_id.h:573
LATENCY_PROBE_DEMUX
@ LATENCY_PROBE_DEMUX
Definition: ffmpeg.h:100
OptionsContext::audio_disable
int audio_disable
Definition: ffmpeg.h:201
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:1338
avassert.h
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
ifile_open
int ifile_open(const OptionsContext *o, const char *filename, Scheduler *sch)
Definition: ffmpeg_demux.c:1886
AVInputFormat
Definition: avformat.h:544
AV_PKT_FLAG_CORRUPT
#define AV_PKT_FLAG_CORRUPT
The packet content is corrupted.
Definition: packet.h:644
fg_create
int fg_create(FilterGraph **pfg, char **graph_desc, Scheduler *sch, const OutputFilterOptions *opts)
Create a new filtergraph in the global filtergraph list.
Definition: ffmpeg_filter.c:1088
OptionGroup::codec_opts
AVDictionary * codec_opts
Definition: cmdutils.h:347
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
Demuxer::resume_progress
int64_t resume_progress
Definition: ffmpeg_demux.c:144
OptionsContext::hwaccel_output_formats
SpecifierOptList hwaccel_output_formats
Definition: ffmpeg.h:179
SpecifierOptList::nb_opt
int nb_opt
Definition: cmdutils.h:185
CROP_DISABLED
@ CROP_DISABLED
Definition: ffmpeg.h:641
opt_match_per_stream_group_str
void opt_match_per_stream_group_str(void *logctx, const SpecifierOptList *sol, AVFormatContext *fc, AVStreamGroup *stg, const char **out)
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:231
AVCodecParameters::frame_size
int frame_size
Audio only.
Definition: codec_par.h:195
av_dict_get
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
Definition: dict.c:60
av_channel_layout_describe
int av_channel_layout_describe(const AVChannelLayout *channel_layout, char *buf, size_t buf_size)
Get a human-readable string describing the channel layout properties.
Definition: channel_layout.c:653
HWACCEL_GENERIC
@ HWACCEL_GENERIC
Definition: ffmpeg.h:85
assert_file_overwrite
int assert_file_overwrite(const char *filename)
Definition: ffmpeg_opt.c:839
SpecifierOpt::specifier
char * specifier
Definition: cmdutils.h:169
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:1785
s
#define s(width, name)
Definition: cbs_vp9.c:198
DemuxStream::first_dts
int64_t first_dts
dts of the first packet read for this stream (in AV_TIME_BASE units)
Definition: ffmpeg_demux.c:77
Demuxer::readrate
float readrate
Definition: ffmpeg_demux.c:137
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:502
AVFormatContext::flags
int flags
Flags modifying the (de)muxer behaviour.
Definition: avformat.h:1414
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:1460
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:549
dec_init
int dec_init(Decoder **pdec, Scheduler *sch, AVDictionary **dec_opts, const DecoderOpts *o, AVFrame *param_out)
Definition: ffmpeg_dec.c:1665
AVFormatContext::iformat
const struct AVInputFormat * iformat
The input container format.
Definition: avformat.h:1275
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:201
AVCodecParameters::width
int width
Video only.
Definition: codec_par.h:134
OptionsContext::hwaccel_devices
SpecifierOptList hwaccel_devices
Definition: ffmpeg.h:178
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:725
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:138
InputFilter
Definition: ffmpeg.h:371
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:42
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:692
AVStreamGroup::index
unsigned int index
Group index in AVFormatContext.
Definition: avformat.h:1108
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
AVPacketSideData::data
uint8_t * data
Definition: packet.h:410
DemuxThreadContext
Definition: ffmpeg_demux.c:157
ctx
static 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:511
demux_send
static int demux_send(Demuxer *d, DemuxThreadContext *dt, DemuxStream *ds, AVPacket *pkt, unsigned flags)
Definition: ffmpeg_demux.c:598
Demuxer::nb_streams_warn
int nb_streams_warn
Definition: ffmpeg_demux.c:135
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:238
DecoderOpts::hwaccel_device
char * hwaccel_device
Definition: ffmpeg.h:457
input_stream_item_name
static const char * input_stream_item_name(void *obj)
Definition: ffmpeg_demux.c:1264
ffmpeg_utils.h
av_hwdevice_get_type_name
const char * av_hwdevice_get_type_name(enum AVHWDeviceType type)
Get the string name of an AVHWDeviceType.
Definition: hwcontext.c:120
OptionsContext::accurate_seek
int accurate_seek
Definition: ffmpeg.h:170
av_usleep
int av_usleep(unsigned usec)
Sleep for a period of time.
Definition: time.c:84
AVCodecParameters::nb_coded_side_data
int nb_coded_side_data
Amount of entries in coded_side_data.
Definition: codec_par.h:86
AVMEDIA_TYPE_DATA
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
Definition: avutil.h:202
InputStreamGroup::stg
AVStreamGroup * stg
Definition: ffmpeg.h:524
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:613
InputStreamGroup::file
struct InputFile * file
Definition: ffmpeg.h:519
AVFormatContext::data_codec
const struct AVCodec * data_codec
Forced data codec.
Definition: avformat.h:1809
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:129
DemuxThreadContext::pkt_demux
AVPacket * pkt_demux
Definition: ffmpeg_demux.c:159
AV_PIX_FMT_MEDIACODEC
@ AV_PIX_FMT_MEDIACODEC
hardware decoding through MediaCodec
Definition: pixfmt.h:316
arg
const char * arg
Definition: jacosubdec.c:65
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:2611
OptionsContext::start_time
int64_t start_time
Definition: ffmpeg.h:149
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:232
AVFormatContext
Format I/O context.
Definition: avformat.h:1263
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:1473
OptionGroup::format_opts
AVDictionary * format_opts
Definition: cmdutils.h:348
opts
static AVDictionary * opts
Definition: movenc.c:51
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:767
framerate
float framerate
Definition: av1_levels.c:29
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
av_bsf_init
int av_bsf_init(AVBSFContext *ctx)
Prepare the filter for use, after all the parameters and options have been set.
Definition: bsf.c:149
demuxer_from_ifile
static Demuxer * demuxer_from_ifile(InputFile *f)
Definition: ffmpeg_demux.c:169
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
AVStream::time_base
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition: avformat.h:783
NULL
#define NULL
Definition: coverity.c:32
Demuxer::readrate_catchup
float readrate_catchup
Definition: ffmpeg_demux.c:139
dec_request_view
int dec_request_view(Decoder *dec, const ViewSpecifier *vs, SchedulerNode *src)
Definition: ffmpeg_dec.c:1031
Decoder::decode_errors
uint64_t decode_errors
Definition: ffmpeg.h:478
av_frame_copy_props
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition: frame.c:599
InputStream::top_field_first
int top_field_first
Definition: ffmpeg.h:504
InputStream::st
AVStream * st
Definition: ffmpeg.h:489
avcodec_parameters_free
void avcodec_parameters_free(AVCodecParameters **ppar)
Free an AVCodecParameters instance and everything associated with it and write NULL to the supplied p...
Definition: codec_par.c:67
av_bsf_receive_packet
int av_bsf_receive_packet(AVBSFContext *ctx, AVPacket *pkt)
Retrieve a filtered packet.
Definition: bsf.c:230
OptionsContext::audio_channels
SpecifierOptList audio_channels
Definition: ffmpeg.h:156
InputFile::start_time_effective
int64_t start_time_effective
Effective format start time based on enabled streams.
Definition: ffmpeg.h:538
AVStreamGroupTileGrid::coded_side_data
AVPacketSideData * coded_side_data
Additional data associated with the grid.
Definition: avformat.h:1054
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
Demuxer::resume_wc
int64_t resume_wc
Definition: ffmpeg_demux.c:142
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:1423
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:242
Demuxer::recording_time
int64_t recording_time
Definition: ffmpeg_demux.c:122
parseutils.h
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:824
OptionsContext::reinit_filters
SpecifierOptList reinit_filters
Definition: ffmpeg.h:236
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:176
InputStream::fix_sub_duration
int fix_sub_duration
Definition: ffmpeg.h:507
FrameData::wallclock
int64_t wallclock[LATENCY_PROBE_NB]
Definition: ffmpeg.h:737
InputStreamGroup::class
const AVClass * class
Definition: ffmpeg.h:516
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:340
OptionsContext::display_vflips
SpecifierOptList display_vflips
Definition: ffmpeg.h:220
DemuxStreamGroup::log_name
char log_name[32]
Definition: ffmpeg_demux.c:105
DemuxThreadContext::pkt_bsf
AVPacket * pkt_bsf
Definition: ffmpeg_demux.c:161
InputFilterOptions
Definition: ffmpeg.h:273
av_opt_get_int
int av_opt_get_int(void *obj, const char *name, int search_flags, int64_t *out_val)
Definition: opt.c:1273
AV_PIX_FMT_QSV
@ AV_PIX_FMT_QSV
HW acceleration through QSV, data[3] contains a pointer to the mfxFrameSurface1 structure.
Definition: pixfmt.h:247
Demuxer::read_started
int read_started
Definition: ffmpeg_demux.c:152
Demuxer::lag
int64_t lag
Definition: ffmpeg_demux.c:146
AVCodecParameters::ch_layout
AVChannelLayout ch_layout
Audio only.
Definition: codec_par.h:180
OptionsContext::input_sync_ref
int input_sync_ref
Definition: ffmpeg.h:172
report_new_stream
static void report_new_stream(Demuxer *d, const AVPacket *pkt)
Definition: ffmpeg_demux.c:185
guess_input_channel_layout
static int guess_input_channel_layout(InputStream *ist, AVCodecParameters *par, int guess_layout_max)
Definition: ffmpeg_demux.c:1203
DECODER_FLAG_FIX_SUB_DURATION
@ DECODER_FLAG_FIX_SUB_DURATION
Definition: ffmpeg.h:431
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:148
find_codec
int find_codec(void *logctx, const char *name, enum AVMediaType type, int encoder, const AVCodec **codec)
Definition: ffmpeg_opt.c:806
AVFormatContext::audio_codec
const struct AVCodec * audio_codec
Forced audio codec.
Definition: avformat.h:1793
InputStream::par
AVCodecParameters * par
Codec parameters - to be used by the decoding/streamcopy code.
Definition: ffmpeg.h:497
input_files
InputFile ** input_files
Definition: ffmpeg.c:108
error.h
Scheduler
Definition: ffmpeg_sched.c:273
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:644
avcodec_find_decoder
const AVCodec * avcodec_find_decoder(enum AVCodecID id)
Find a registered decoder with a matching codec ID.
Definition: allcodecs.c:1048
recast_media
int recast_media
Definition: ffmpeg_opt.c:91
AVCodecParameters::extradata_size
int extradata_size
Size of the extradata content in bytes.
Definition: codec_par.h:73
AVFormatContext::nb_streams
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
Definition: avformat.h:1319
istg_parse_tile_grid
static int istg_parse_tile_grid(const OptionsContext *o, Demuxer *d, InputStreamGroup *istg)
Definition: ffmpeg_demux.c:1660
AV_STREAM_GROUP_PARAMS_TILE_GRID
@ AV_STREAM_GROUP_PARAMS_TILE_GRID
Definition: avformat.h:1090
DemuxStream::dts
int64_t dts
dts of the last packet read for this stream (in AV_TIME_BASE units)
Definition: ffmpeg_demux.c:83
av_codec_is_decoder
int av_codec_is_decoder(const AVCodec *codec)
Definition: utils.c:85
avformat_find_stream_info
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
Read packets of a media file to get stream information.
Definition: demux.c:2607
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:1995
OptionsContext::discard
SpecifierOptList discard
Definition: ffmpeg.h:247
IFILTER_FLAG_REINIT
@ IFILTER_FLAG_REINIT
Definition: ffmpeg.h:267
is_windows_reserved_device_name
static int is_windows_reserved_device_name(const char *f)
Definition: ffmpeg_demux.c:1764
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:198
AVMediaType
AVMediaType
Definition: avutil.h:198
AVPacket::size
int size
Definition: packet.h:589
InputStreamGroup::fg
FilterGraph * fg
Definition: ffmpeg.h:523
avformat_alloc_context
AVFormatContext * avformat_alloc_context(void)
Allocate an AVFormatContext.
Definition: options.c:163
AVDISCARD_DEFAULT
@ AVDISCARD_DEFAULT
discard useless packets like 0 size packets in avi
Definition: defs.h:227
av_bprint_finalize
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition: bprint.c:235
AVChannelLayout
An AVChannelLayout holds information about the channel layout of audio data.
Definition: channel_layout.h:319
DemuxStream::have_sub2video
int have_sub2video
Definition: ffmpeg_demux.c:66
av_bsf_send_packet
int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt)
Submit a packet for filtering.
Definition: bsf.c:202
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
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:328
Demuxer::pkt_heartbeat
AVPacket * pkt_heartbeat
Definition: ffmpeg_demux.c:150
DemuxStream::decoding_needed
int decoding_needed
Definition: ffmpeg_demux.c:55
OptionsContext::apply_cropping
SpecifierOptList apply_cropping
Definition: ffmpeg.h:181
demux_thread_uninit
static void demux_thread_uninit(DemuxThreadContext *dt)
Definition: ffmpeg_demux.c:717
copy_ts
int copy_ts
Definition: ffmpeg_opt.c:67
avformat_seek_file
int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
Seek to timestamp ts.
Definition: seek.c:664
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:247
AV_CODEC_PROP_FIELDS
#define AV_CODEC_PROP_FIELDS
Video codec supports separate coding of fields in interlaced frames.
Definition: codec_desc.h:97
OptionsContext::seek_timestamp
int seek_timestamp
Definition: ffmpeg.h:151
input_file_class
static const AVClass input_file_class
Definition: ffmpeg_demux.c:1864
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:948
AVFrame::format
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
Definition: frame.h:514
AVMEDIA_TYPE_UNKNOWN
@ AVMEDIA_TYPE_UNKNOWN
Usually treated as AVMEDIA_TYPE_DATA.
Definition: avutil.h:199
DemuxStream::bsf
AVBSFContext * bsf
Definition: ffmpeg_demux.c:93
AVStream::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
Definition: avformat.h:822
OptionsContext::readrate_initial_burst
double readrate_initial_burst
Definition: ffmpeg.h:169
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:1540
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:587
avio_write
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
Definition: aviobuf.c:206
OptionsContext::find_stream_info
int find_stream_info
Definition: ffmpeg.h:173
OptionsContext::display_rotations
SpecifierOptList display_rotations
Definition: ffmpeg.h:218
DemuxStream::autorotate
int autorotate
Definition: ffmpeg_demux.c:68
DemuxStream::sch_idx_dec
int sch_idx_dec
Definition: ffmpeg_demux.c:50
AVStreamGroupTileGrid::nb_tiles
unsigned int nb_tiles
Amount of tiles in the grid.
Definition: avformat.h:959
SpecifierOptList::opt
SpecifierOpt * opt
Definition: cmdutils.h:184
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:594
av_packet_alloc
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
Definition: packet.c:63
av_dict_free
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
Definition: dict.c:233
OptionsContext::ts_scale
SpecifierOptList ts_scale
Definition: ffmpeg.h:175
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:536
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:221
video_codec_name
static const char * video_codec_name
Definition: ffplay.c:343
DemuxStream::next_dts
int64_t next_dts
Definition: ffmpeg_demux.c:81
AVCodec::id
enum AVCodecID id
Definition: codec.h:186
CROP_CONTAINER
@ CROP_CONTAINER
Definition: ffmpeg.h:644
av_channel_layout_default
void av_channel_layout_default(AVChannelLayout *ch_layout, int nb_channels)
Get the default channel layout for a given number of channels.
Definition: channel_layout.c:839
avcodec_parameters_alloc
AVCodecParameters * avcodec_parameters_alloc(void)
Allocate a new AVCodecParameters and set its fields to default values (unknown/invalid/0).
Definition: codec_par.c:57
avcodec_get_name
const char * avcodec_get_name(enum AVCodecID id)
Get the name of a codec.
Definition: utils.c:406
HWACCEL_AUTO
@ HWACCEL_AUTO
Definition: ffmpeg.h:84
AVStreamGroupTileGrid::nb_coded_side_data
int nb_coded_side_data
Amount of entries in coded_side_data.
Definition: avformat.h:1059
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:642
DemuxStream::dec_name
char dec_name[16]
Definition: ffmpeg_demux.c:89
av_channel_layout_from_string
int av_channel_layout_from_string(AVChannelLayout *channel_layout, const char *str)
Initialize a channel layout from a given string description.
Definition: channel_layout.c:312
DemuxStream::apply_cropping
int apply_cropping
Definition: ffmpeg_demux.c:69
AVStreamGroupTileGrid::width
int width
Width of the final image for presentation.
Definition: avformat.h:1036
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:581
OptionsContext::frame_rates
SpecifierOptList frame_rates
Definition: ffmpeg.h:158
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:1491
OptionsContext::codec_names
SpecifierOptList codec_names
Definition: ffmpeg.h:154
packet.h
demux_bsf_flush
static int demux_bsf_flush(Demuxer *d, DemuxThreadContext *dt)
Definition: ffmpeg_demux.c:667
AVFormatContext::subtitle_codec
const struct AVCodec * subtitle_codec
Forced subtitle codec.
Definition: avformat.h:1801
AVCodecParameters::height
int height
Definition: codec_par.h:135
OptionsContext::autorotate
SpecifierOptList autorotate
Definition: ffmpeg.h:180
AV_TIME_BASE
#define AV_TIME_BASE
Internal time base represented as integer.
Definition: avutil.h:253
DecoderOpts::time_base
AVRational time_base
Definition: ffmpeg.h:460
SHOW_TS_DEBUG
#define SHOW_TS_DEBUG(tag_)
opt_match_per_stream_group_int
void opt_match_per_stream_group_int(void *logctx, const SpecifierOptList *sol, AVFormatContext *fc, AVStreamGroup *stg, int *out)
OptionsContext::start_time_eof
int64_t start_time_eof
Definition: ffmpeg.h:150
display.h
SCH_DEC_OUT
#define SCH_DEC_OUT(decoder, out_idx)
Definition: ffmpeg_sched.h:120
exit_on_error
int exit_on_error
Definition: ffmpeg_opt.c:71
Demuxer::have_audio_dec
int have_audio_dec
Definition: ffmpeg_demux.c:127
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:58
DemuxStream::force_display_matrix
int force_display_matrix
Definition: ffmpeg_demux.c:70
delta
float delta
Definition: vorbis_enc_data.h:430
AVMEDIA_TYPE_ATTACHMENT
@ AVMEDIA_TYPE_ATTACHMENT
Opaque data information usually sparse.
Definition: avutil.h:204
InputFile::ctx
AVFormatContext * ctx
Definition: ffmpeg.h:532
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
OptionsContext::hwaccels
SpecifierOptList hwaccels
Definition: ffmpeg.h:177
AVProgram
New fields can be added to the end with minor version bumps.
Definition: avformat.h:1187
av_inv_q
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
Definition: rational.h:159
IFILTER_FLAG_DROPCHANGED
@ IFILTER_FLAG_DROPCHANGED
Definition: ffmpeg.h:270
SchedulerNode
Definition: ffmpeg_sched.h:103
filtergraphs
FilterGraph ** filtergraphs
Definition: ffmpeg.c:114
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:312
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
OFILTER_FLAG_CROP
@ OFILTER_FLAG_CROP
Definition: ffmpeg.h:306
AVFMT_FLAG_NONBLOCK
#define AVFMT_FLAG_NONBLOCK
Do not block when reading packets from input.
Definition: avformat.h:1417
av_codec_iterate
const AVCodec * av_codec_iterate(void **opaque)
Iterate over all registered codecs.
Definition: allcodecs.c:997
sch_connect
int sch_connect(Scheduler *sch, SchedulerNode src, SchedulerNode dst)
Definition: ffmpeg_sched.c:937
AVStreamGroupTileGrid::horizontal
int horizontal
Offset in pixels from the left edge of the canvas where the tile should be placed.
Definition: avformat.h:995
limit
static double limit(double x)
Definition: vf_pseudocolor.c:142
ist_find_unused
InputStream * ist_find_unused(enum AVMediaType type)
Find an unused input stream of given type.
Definition: ffmpeg_demux.c:174
istg_add
static int istg_add(const OptionsContext *o, Demuxer *d, AVStreamGroup *stg)
Definition: ffmpeg_demux.c:1739
Timestamp::tb
AVRational tb
Definition: ffmpeg_utils.h:32
InputStream::decoder
Decoder * decoder
Definition: ffmpeg.h:498
OFILTER_FLAG_AUTOROTATE
@ OFILTER_FLAG_AUTOROTATE
Definition: ffmpeg.h:305
AVStream::disposition
int disposition
Stream disposition - a combination of AV_DISPOSITION_* flags.
Definition: avformat.h:813
DemuxStream::codec_desc
const AVCodecDescriptor * codec_desc
Definition: ffmpeg_demux.c:85
ts_discontinuity_process
static void ts_discontinuity_process(Demuxer *d, InputStream *ist, AVPacket *pkt)
Definition: ffmpeg_demux.c:293
tag
uint32_t tag
Definition: movenc.c:2032
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:756
AVFMT_FLAG_BITEXACT
#define AVFMT_FLAG_BITEXACT
When muxing, try to avoid writing any random/volatile data to the output.
Definition: avformat.h:1431
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:744
AV_LOG_FATAL
#define AV_LOG_FATAL
Something went wrong and recovery is not possible.
Definition: log.h:204
dec_free
void dec_free(Decoder **pdec)
Definition: ffmpeg_dec.c:118
av_guess_frame_rate
AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *frame)
Guess the frame rate, based on both the container and codec information.
Definition: avformat.c:687
DemuxStream::wrap_correction_done
int wrap_correction_done
Definition: ffmpeg_demux.c:74
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:81
av_strlcat
size_t av_strlcat(char *dst, const char *src, size_t size)
Append the string src to the string dst, but to a total length of no more than size - 1 bytes,...
Definition: avstring.c:95
av_opt_eval_int
int av_opt_eval_int(void *obj, const AVOption *o, const char *val, int *int_out)
Demuxer::loop
int loop
Definition: ffmpeg_demux.c:126
InputFile::streams
InputStream ** streams
Definition: ffmpeg.h:546
add_display_matrix_to_stream
static int add_display_matrix_to_stream(const OptionsContext *o, AVFormatContext *ctx, InputStream *ist)
Definition: ffmpeg_demux.c:1220
hwaccel
static const char * hwaccel
Definition: ffplay.c:356
DECODER_FLAG_TOP_FIELD_FIRST
@ DECODER_FLAG_TOP_FIELD_FIRST
Definition: ffmpeg.h:438
Demuxer::accurate_seek
int accurate_seek
Definition: ffmpeg_demux.c:123
avformat.h
HWAccelID
HWAccelID
Definition: ffmpeg.h:82
av_bprintf
void av_bprintf(AVBPrint *buf, const char *fmt,...)
Definition: bprint.c:122
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:694
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:1156
OptionsContext::drop_changed
SpecifierOptList drop_changed
Definition: ffmpeg.h:237
check_avoptions_used
int check_avoptions_used(const AVDictionary *opts, const AVDictionary *opts_used, void *logctx, int decode)
Definition: ffmpeg.c:501
remove_avoptions
void remove_avoptions(AVDictionary **a, AVDictionary *b)
Definition: cmdutils.c:1596
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
istg_free
static void istg_free(InputStreamGroup **pistg)
Definition: ffmpeg_demux.c:912
av_get_pix_fmt
enum AVPixelFormat av_get_pix_fmt(const char *name)
Return the pixel format corresponding to name.
Definition: pixdesc.c:3388
AVStreamGroup
Definition: avformat.h:1097
AVFormatContext::data_codec_id
enum AVCodecID data_codec_id
Forced Data codec_id.
Definition: avformat.h:1485
av_get_media_type_string
const char * av_get_media_type_string(enum AVMediaType media_type)
Return a string describing the media_type enum, NULL if media_type is unknown.
Definition: utils.c:28
AVFrame::height
int height
Definition: frame.h:499
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:750
IFILTER_FLAG_CROP
@ IFILTER_FLAG_CROP
Definition: ffmpeg.h:269
InputFile::class
const AVClass * class
Definition: ffmpeg.h:528
OptionsContext::audio_sample_rate
SpecifierOptList audio_sample_rate
Definition: ffmpeg.h:157
audio_codec_name
static const char * audio_codec_name
Definition: ffplay.c:341
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:2137
ts_discontinuity_detect
static void ts_discontinuity_detect(Demuxer *d, InputStream *ist, AVPacket *pkt)
Definition: ffmpeg_demux.c:225
PKT_OPAQUE_SUB_HEARTBEAT
@ PKT_OPAQUE_SUB_HEARTBEAT
Definition: ffmpeg.h:95
AVInputFormat::flags
int flags
Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS, AVFMT_NOTIMESTAMPS,...
Definition: avformat.h:563
AVRational::den
int den
Denominator.
Definition: rational.h:60
InputStream::file
struct InputFile * file
Definition: ffmpeg.h:485
SpecifierOpt::str
uint8_t * str
Definition: cmdutils.h:174
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:144
IFILTER_FLAG_CFR
@ IFILTER_FLAG_CFR
Definition: ffmpeg.h:268
OptionsContext::frame_sizes
SpecifierOptList frame_sizes
Definition: ffmpeg.h:160
OptionsContext::video_disable
int video_disable
Definition: ffmpeg.h:200
ds_from_ist
static DemuxStream * ds_from_ist(InputStream *ist)
Definition: ffmpeg_demux.c:164
input_stream_group_class
static const AVClass input_stream_group_class
Definition: ffmpeg_demux.c:1633
av_find_input_format
const AVInputFormat * av_find_input_format(const char *short_name)
Find AVInputFormat based on the short name of the input format.
Definition: format.c:146
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
demux_alloc
static Demuxer * demux_alloc(void)
Definition: ffmpeg_demux.c:1871
AVFormatContext::duration
int64_t duration
Duration of the stream, in AV_TIME_BASE fractional seconds.
Definition: avformat.h:1398
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:590
GROW_ARRAY
#define GROW_ARRAY(array, nb_elems)
Definition: cmdutils.h:536
HWACCEL_NONE
@ HWACCEL_NONE
Definition: ffmpeg.h:83
avcodec_get_hw_config
const AVCodecHWConfig * avcodec_get_hw_config(const AVCodec *codec, int index)
Retrieve supported hardware configurations for a codec.
Definition: utils.c:850
ist_dts_update
static int ist_dts_update(DemuxStream *ds, AVPacket *pkt, FrameData *fd)
Definition: ffmpeg_demux.c:313
data_codec_name
static const char * data_codec_name
Definition: ffprobe.c:135
InputFile::ts_offset
int64_t ts_offset
Definition: ffmpeg.h:539
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:451
av_dict_set_int
int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags)
Convenience wrapper for av_dict_set() that converts the value to a string and stores it.
Definition: dict.c:177
OptionsContext::codec_tags
SpecifierOptList codec_tags
Definition: ffmpeg.h:211
DecoderOpts::flags
int flags
Definition: ffmpeg.h:446
av_strdup
char * av_strdup(const char *s)
Duplicate a string.
Definition: mem.c:272
AV_OPT_FLAG_DECODING_PARAM
#define AV_OPT_FLAG_DECODING_PARAM
A generic parameter which can be set by the user for demuxing or decoding.
Definition: opt.h:356
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
av_bsf_list_parse_str
int av_bsf_list_parse_str(const char *str, AVBSFContext **bsf_lst)
Parse string describing list of bitstream filters and create single AVBSFContext describing the whole...
Definition: bsf.c:526
start_at_zero
int start_at_zero
Definition: ffmpeg_opt.c:68
AVFMT_TS_DISCONT
#define AVFMT_TS_DISCONT
Format allows timestamp discontinuities.
Definition: avformat.h:480
mem.h
AVStreamGroup::type
enum AVStreamGroupParamsType type
Group type.
Definition: avformat.h:1124
SpecifierOpt::u
union SpecifierOpt::@0 u
avio_open2
int avio_open2(AVIOContext **s, const char *filename, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options)
Create and initialize a AVIOContext for accessing the resource indicated by url.
Definition: avio.c:492
DECODER_FLAG_TS_UNRELIABLE
@ DECODER_FLAG_TS_UNRELIABLE
Definition: ffmpeg.h:433
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:451
InputStream::class
const AVClass * class
Definition: ffmpeg.h:482
InputStream::index
int index
Definition: ffmpeg.h:487
readrate_sleep
static void readrate_sleep(Demuxer *d)
Definition: ffmpeg_demux.c:508
AVFormatContext::nb_stream_groups
unsigned int nb_stream_groups
Number of elements in AVFormatContext.stream_groups.
Definition: avformat.h:1338
AVStreamGroupTileGrid::height
int height
Height of the final image for presentation.
Definition: avformat.h:1046
ffmpeg_sched.h
AVDictionaryEntry
Definition: dict.h:90
Demuxer::max_pts
Timestamp max_pts
Definition: ffmpeg_demux.c:132
DemuxStream::dec_opts
DecoderOpts dec_opts
Definition: ffmpeg_demux.c:88
stdin_interaction
int stdin_interaction
Definition: ffmpeg_opt.c:74
do_hex_dump
int do_hex_dump
Definition: ffmpeg_opt.c:65
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:55
AVPacket
This structure stores compressed data.
Definition: packet.h:565
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:1058
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
av_dict_set
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:86
AVPacket::pos
int64_t pos
byte position in stream, -1 if unknown
Definition: packet.h:608
AVFormatContext::name
char * name
Name of this format context, only used for logging purposes.
Definition: avformat.h:1888
packet_data
FrameData * packet_data(AVPacket *pkt)
Definition: ffmpeg.c:489
OptionsContext::data_disable
int data_disable
Definition: ffmpeg.h:203
nb_filtergraphs
int nb_filtergraphs
Definition: ffmpeg.c:115
int32_t
int32_t
Definition: audioconvert.c:56
ist_free
static void ist_free(InputStream **pist)
Definition: ffmpeg_demux.c:888
DemuxStream::reinit_filters
int reinit_filters
Definition: ffmpeg_demux.c:67
timestamp.h
Demuxer::min_pts
Timestamp min_pts
Definition: ffmpeg_demux.c:131
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:373
avio_close
int avio_close(AVIOContext *s)
Close the resource accessed by the AVIOContext s and free it.
Definition: avio.c:617
av_strlcpy
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
Definition: avstring.c:85
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:1388
DecoderOpts::framerate
AVRational framerate
Definition: ffmpeg.h:464
dts_error_threshold
float dts_error_threshold
Definition: ffmpeg_opt.c:57
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
av_ts2str
#define av_ts2str(ts)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: timestamp.h:54
av_stream_get_parser
struct AVCodecParserContext * av_stream_get_parser(const AVStream *s)
Definition: demux_utils.c:33
AVCodecHWConfig
Definition: codec.h:330
AVERROR_EXIT
#define AVERROR_EXIT
Immediate exit was requested; the called function should not be restarted.
Definition: error.h:58
av_pkt_dump_log2
void av_pkt_dump_log2(void *avcl, int level, const AVPacket *pkt, int dump_payload, const AVStream *st)
Send a nice dump of a packet to the log.
Definition: dump.c:122
avcodec_descriptor_get
const AVCodecDescriptor * avcodec_descriptor_get(enum AVCodecID id)
Definition: codec_desc.c:3888
do_send
static int do_send(Demuxer *d, DemuxStream *ds, AVPacket *pkt, unsigned flags, const char *pkt_desc)
Definition: ffmpeg_demux.c:569
Demuxer::last_ts
int64_t last_ts
Definition: ffmpeg_demux.c:120
DemuxStream::decoded_params
AVFrame * decoded_params
Definition: ffmpeg_demux.c:91
AVDictionaryEntry::value
char * value
Definition: dict.h:92
pkt
static AVPacket * pkt
Definition: demux_decode.c:55
avstring.h
Timestamp
Definition: ffmpeg_utils.h:30
opt_match_per_type_str
const char * opt_match_per_type_str(const SpecifierOptList *sol, char mediatype)
Definition: ffmpeg_opt.c:168
AVStreamGroupTileGrid::idx
unsigned int idx
Index of the stream in the group this tile references.
Definition: avformat.h:990
opt_match_per_stream_str
void opt_match_per_stream_str(void *logctx, const SpecifierOptList *sol, AVFormatContext *fc, AVStream *st, const char **out)
DemuxStream::saw_first_ts
int saw_first_ts
Definition: ffmpeg_demux.c:75
InputFile::nb_streams
int nb_streams
Definition: ffmpeg.h:547
OptionsContext::guess_layout_max
SpecifierOptList guess_layout_max
Definition: ffmpeg.h:245
AVStream::pts_wrap_bits
int pts_wrap_bits
Number of bits in timestamps.
Definition: avformat.h:887
dump_attachment
static int dump_attachment(InputStream *ist, const char *filename)
Definition: ffmpeg_demux.c:1814
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:499
snprintf
#define snprintf
Definition: snprintf.h:34
DecoderOpts::hwaccel_device_type
enum AVHWDeviceType hwaccel_device_type
Definition: ffmpeg.h:456
FilterGraph::is_internal
int is_internal
Definition: ffmpeg.h:424
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:210
input_thread
static int input_thread(void *arg)
Definition: ffmpeg_demux.c:740
src
#define src
Definition: vp8dsp.c:248
duration
static int64_t duration
Definition: ffplay.c:329
AVInputFormat::priv_class
const AVClass * priv_class
AVClass for the private context.
Definition: avformat.h:574
avcodec_parameters_copy
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
Copy the contents of src to dst.
Definition: codec_par.c:107
AVStreamGroupTileGrid::background
uint8_t background[4]
The pixel value per channel in RGBA format used if no pixel of any tile is located at a particular pi...
Definition: avformat.h:1010
AVPacket::time_base
AVRational time_base
Time base of the packet's timestamps.
Definition: packet.h:632
OptionsContext::top_field_first
SpecifierOptList top_field_first
Definition: ffmpeg.h:226
OptionsContext::loop
int loop
Definition: ffmpeg.h:165
thread_set_name
static void thread_set_name(InputFile *f)
Definition: ffmpeg_demux.c:710
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:1479
DecoderOpts::name
char * name
Definition: ffmpeg.h:448