FFmpeg
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
ffmpeg.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2000-2003 Fabrice Bellard
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /**
22  * @file
23  * multimedia converter based on the FFmpeg libraries
24  */
25 
26 #include "config.h"
27 
28 #include <errno.h>
29 #include <limits.h>
30 #include <stdatomic.h>
31 #include <stdint.h>
32 #include <stdlib.h>
33 #include <string.h>
34 #include <time.h>
35 
36 #if HAVE_IO_H
37 #include <io.h>
38 #endif
39 #if HAVE_UNISTD_H
40 #include <unistd.h>
41 #endif
42 
43 #if HAVE_SYS_RESOURCE_H
44 #include <sys/time.h>
45 #include <sys/types.h>
46 #include <sys/resource.h>
47 #elif HAVE_GETPROCESSTIMES
48 #include <windows.h>
49 #endif
50 #if HAVE_GETPROCESSMEMORYINFO
51 #include <windows.h>
52 #include <psapi.h>
53 #endif
54 #if HAVE_SETCONSOLECTRLHANDLER
55 #include <windows.h>
56 #endif
57 
58 #if HAVE_SYS_SELECT_H
59 #include <sys/select.h>
60 #endif
61 
62 #if HAVE_TERMIOS_H
63 #include <fcntl.h>
64 #include <sys/ioctl.h>
65 #include <sys/time.h>
66 #include <termios.h>
67 #elif HAVE_KBHIT
68 #include <conio.h>
69 #endif
70 
71 #include "libavutil/bprint.h"
72 #include "libavutil/dict.h"
73 #include "libavutil/mem.h"
74 #include "libavutil/time.h"
75 
76 #include "libavformat/avformat.h"
77 
78 #include "libavdevice/avdevice.h"
79 
80 #include "cmdutils.h"
81 #include "ffmpeg.h"
82 #include "ffmpeg_sched.h"
83 #include "ffmpeg_utils.h"
84 #include "graph/graphprint.h"
85 
86 const char program_name[] = "ffmpeg";
87 const int program_birth_year = 2000;
88 
90 
91 typedef struct BenchmarkTimeStamps {
96 
98 static int64_t getmaxrss(void);
99 
101 
104 
107 
110 
113 
116 
117 #if HAVE_TERMIOS_H
118 
119 /* init terminal so that we can grab keys */
120 static struct termios oldtty;
121 static int restore_tty;
122 #endif
123 
124 static void term_exit_sigsafe(void)
125 {
126 #if HAVE_TERMIOS_H
127  if(restore_tty)
128  tcsetattr (0, TCSANOW, &oldtty);
129 #endif
130 }
131 
132 void term_exit(void)
133 {
134  av_log(NULL, AV_LOG_QUIET, "%s", "");
136 }
137 
138 static volatile int received_sigterm = 0;
139 static volatile int received_nb_signals = 0;
141 static volatile int ffmpeg_exited = 0;
143 
144 static void
146 {
147  int ret;
148  received_sigterm = sig;
151  if(received_nb_signals > 3) {
152  ret = write(2/*STDERR_FILENO*/, "Received > 3 system signals, hard exiting\n",
153  strlen("Received > 3 system signals, hard exiting\n"));
154  if (ret < 0) { /* Do nothing */ };
155  exit(123);
156  }
157 }
158 
159 #if HAVE_SETCONSOLECTRLHANDLER
160 static BOOL WINAPI CtrlHandler(DWORD fdwCtrlType)
161 {
162  av_log(NULL, AV_LOG_DEBUG, "\nReceived windows signal %ld\n", fdwCtrlType);
163 
164  switch (fdwCtrlType)
165  {
166  case CTRL_C_EVENT:
167  case CTRL_BREAK_EVENT:
168  sigterm_handler(SIGINT);
169  return TRUE;
170 
171  case CTRL_CLOSE_EVENT:
172  case CTRL_LOGOFF_EVENT:
173  case CTRL_SHUTDOWN_EVENT:
174  sigterm_handler(SIGTERM);
175  /* Basically, with these 3 events, when we return from this method the
176  process is hard terminated, so stall as long as we need to
177  to try and let the main thread(s) clean up and gracefully terminate
178  (we have at most 5 seconds, but should be done far before that). */
179  while (!ffmpeg_exited) {
180  Sleep(0);
181  }
182  return TRUE;
183 
184  default:
185  av_log(NULL, AV_LOG_ERROR, "Received unknown windows signal %ld\n", fdwCtrlType);
186  return FALSE;
187  }
188 }
189 #endif
190 
191 #ifdef __linux__
192 #define SIGNAL(sig, func) \
193  do { \
194  action.sa_handler = func; \
195  sigaction(sig, &action, NULL); \
196  } while (0)
197 #else
198 #define SIGNAL(sig, func) \
199  signal(sig, func)
200 #endif
201 
202 void term_init(void)
203 {
204 #if defined __linux__
205  struct sigaction action = {0};
206  action.sa_handler = sigterm_handler;
207 
208  /* block other interrupts while processing this one */
209  sigfillset(&action.sa_mask);
210 
211  /* restart interruptible functions (i.e. don't fail with EINTR) */
212  action.sa_flags = SA_RESTART;
213 #endif
214 
215 #if HAVE_TERMIOS_H
216  if (stdin_interaction) {
217  struct termios tty;
218  if (tcgetattr (0, &tty) == 0) {
219  oldtty = tty;
220  restore_tty = 1;
221 
222  tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
223  |INLCR|IGNCR|ICRNL|IXON);
224  tty.c_oflag |= OPOST;
225  tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
226  tty.c_cflag &= ~(CSIZE|PARENB);
227  tty.c_cflag |= CS8;
228  tty.c_cc[VMIN] = 1;
229  tty.c_cc[VTIME] = 0;
230 
231  tcsetattr (0, TCSANOW, &tty);
232  }
233  SIGNAL(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
234  }
235 #endif
236 
237  SIGNAL(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
238  SIGNAL(SIGTERM, sigterm_handler); /* Termination (ANSI). */
239 #ifdef SIGXCPU
240  SIGNAL(SIGXCPU, sigterm_handler);
241 #endif
242 #ifdef SIGPIPE
243  signal(SIGPIPE, SIG_IGN); /* Broken pipe (POSIX). */
244 #endif
245 #if HAVE_SETCONSOLECTRLHANDLER
246  SetConsoleCtrlHandler((PHANDLER_ROUTINE) CtrlHandler, TRUE);
247 #endif
248 }
249 
250 /* read a key without blocking */
251 static int read_key(void)
252 {
253  unsigned char ch;
254 #if HAVE_TERMIOS_H
255  int n = 1;
256  struct timeval tv;
257  fd_set rfds;
258 
259  FD_ZERO(&rfds);
260  FD_SET(0, &rfds);
261  tv.tv_sec = 0;
262  tv.tv_usec = 0;
263  n = select(1, &rfds, NULL, NULL, &tv);
264  if (n > 0) {
265  n = read(0, &ch, 1);
266  if (n == 1)
267  return ch;
268 
269  return n;
270  }
271 #elif HAVE_KBHIT
272 # if HAVE_PEEKNAMEDPIPE && HAVE_GETSTDHANDLE
273  static int is_pipe;
274  static HANDLE input_handle;
275  DWORD dw, nchars;
276  if(!input_handle){
277  input_handle = GetStdHandle(STD_INPUT_HANDLE);
278  is_pipe = !GetConsoleMode(input_handle, &dw);
279  }
280 
281  if (is_pipe) {
282  /* When running under a GUI, you will end here. */
283  if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL)) {
284  // input pipe may have been closed by the program that ran ffmpeg
285  return -1;
286  }
287  //Read it
288  if(nchars != 0) {
289  if (read(0, &ch, 1) == 1)
290  return ch;
291  return 0;
292  }else{
293  return -1;
294  }
295  }
296 # endif
297  if(kbhit())
298  return(getch());
299 #endif
300  return -1;
301 }
302 
303 static int decode_interrupt_cb(void *ctx)
304 {
306 }
307 
309 
310 static void ffmpeg_cleanup(int ret)
311 {
314 
315  if (do_benchmark) {
316  int64_t maxrss = getmaxrss() / 1024;
317  av_log(NULL, AV_LOG_INFO, "bench: maxrss=%"PRId64"KiB\n", maxrss);
318  }
319 
320  for (int i = 0; i < nb_filtergraphs; i++)
323 
324  for (int i = 0; i < nb_output_files; i++)
326 
327  for (int i = 0; i < nb_input_files; i++)
329 
330  for (int i = 0; i < nb_decoders; i++)
331  dec_free(&decoders[i]);
332  av_freep(&decoders);
333 
334  if (vstats_file) {
335  if (fclose(vstats_file))
337  "Error closing vstats file, loss of information possible: %s\n",
338  av_err2str(AVERROR(errno)));
339  }
342 
344 
346 
349 
352 
353  uninit_opts();
354 
356 
357  if (received_sigterm) {
358  av_log(NULL, AV_LOG_INFO, "Exiting normally, received signal %d.\n",
359  (int) received_sigterm);
360  } else if (ret && atomic_load(&transcode_init_done)) {
361  av_log(NULL, AV_LOG_INFO, "Conversion failed!\n");
362  }
363  term_exit();
364  ffmpeg_exited = 1;
365 }
366 
368 {
369  int of_idx = prev ? prev->file->index : 0;
370  int ost_idx = prev ? prev->index + 1 : 0;
371 
372  for (; of_idx < nb_output_files; of_idx++) {
373  OutputFile *of = output_files[of_idx];
374  if (ost_idx < of->nb_streams)
375  return of->streams[ost_idx];
376 
377  ost_idx = 0;
378  }
379 
380  return NULL;
381 }
382 
384 {
385  int if_idx = prev ? prev->file->index : 0;
386  int ist_idx = prev ? prev->index + 1 : 0;
387 
388  for (; if_idx < nb_input_files; if_idx++) {
389  InputFile *f = input_files[if_idx];
390  if (ist_idx < f->nb_streams)
391  return f->streams[ist_idx];
392 
393  ist_idx = 0;
394  }
395 
396  return NULL;
397 }
398 
399 static void frame_data_free(void *opaque, uint8_t *data)
400 {
401  FrameData *fd = (FrameData *)data;
402 
404 
405  av_free(data);
406 }
407 
408 static int frame_data_ensure(AVBufferRef **dst, int writable)
409 {
410  AVBufferRef *src = *dst;
411 
412  if (!src || (writable && !av_buffer_is_writable(src))) {
413  FrameData *fd;
414 
415  fd = av_mallocz(sizeof(*fd));
416  if (!fd)
417  return AVERROR(ENOMEM);
418 
419  *dst = av_buffer_create((uint8_t *)fd, sizeof(*fd),
420  frame_data_free, NULL, 0);
421  if (!*dst) {
423  av_freep(&fd);
424  return AVERROR(ENOMEM);
425  }
426 
427  if (src) {
428  const FrameData *fd_src = (const FrameData *)src->data;
429 
430  memcpy(fd, fd_src, sizeof(*fd));
431  fd->par_enc = NULL;
432 
433  if (fd_src->par_enc) {
434  int ret = 0;
435 
436  fd->par_enc = avcodec_parameters_alloc();
437  ret = fd->par_enc ?
438  avcodec_parameters_copy(fd->par_enc, fd_src->par_enc) :
439  AVERROR(ENOMEM);
440  if (ret < 0) {
443  return ret;
444  }
445  }
446 
448  } else {
449  fd->dec.frame_num = UINT64_MAX;
450  fd->dec.pts = AV_NOPTS_VALUE;
451 
452  for (unsigned i = 0; i < FF_ARRAY_ELEMS(fd->wallclock); i++)
453  fd->wallclock[i] = INT64_MIN;
454  }
455  }
456 
457  return 0;
458 }
459 
461 {
462  int ret = frame_data_ensure(&frame->opaque_ref, 1);
463  return ret < 0 ? NULL : (FrameData*)frame->opaque_ref->data;
464 }
465 
467 {
468  int ret = frame_data_ensure(&frame->opaque_ref, 0);
469  return ret < 0 ? NULL : (const FrameData*)frame->opaque_ref->data;
470 }
471 
473 {
474  int ret = frame_data_ensure(&pkt->opaque_ref, 1);
475  return ret < 0 ? NULL : (FrameData*)pkt->opaque_ref->data;
476 }
477 
479 {
480  int ret = frame_data_ensure(&pkt->opaque_ref, 0);
481  return ret < 0 ? NULL : (const FrameData*)pkt->opaque_ref->data;
482 }
483 
484 int check_avoptions_used(const AVDictionary *opts, const AVDictionary *opts_used,
485  void *logctx, int decode)
486 {
487  const AVClass *class = avcodec_get_class();
488  const AVClass *fclass = avformat_get_class();
489 
490  const int flag = decode ? AV_OPT_FLAG_DECODING_PARAM :
492  const AVDictionaryEntry *e = NULL;
493 
494  while ((e = av_dict_iterate(opts, e))) {
495  const AVOption *option, *foption;
496  char *optname, *p;
497 
498  if (av_dict_get(opts_used, e->key, NULL, 0))
499  continue;
500 
501  optname = av_strdup(e->key);
502  if (!optname)
503  return AVERROR(ENOMEM);
504 
505  p = strchr(optname, ':');
506  if (p)
507  *p = 0;
508 
509  option = av_opt_find(&class, optname, NULL, 0,
511  foption = av_opt_find(&fclass, optname, NULL, 0,
513  av_freep(&optname);
514  if (!option || foption)
515  continue;
516 
517  if (!(option->flags & flag)) {
518  av_log(logctx, AV_LOG_ERROR, "Codec AVOption %s (%s) is not a %s "
519  "option.\n", e->key, option->help ? option->help : "",
520  decode ? "decoding" : "encoding");
521  return AVERROR(EINVAL);
522  }
523 
524  av_log(logctx, AV_LOG_WARNING, "Codec AVOption %s (%s) has not been used "
525  "for any stream. The most likely reason is either wrong type "
526  "(e.g. a video option with no video streams) or that it is a "
527  "private option of some decoder which was not actually used "
528  "for any stream.\n", e->key, option->help ? option->help : "");
529  }
530 
531  return 0;
532 }
533 
534 void update_benchmark(const char *fmt, ...)
535 {
536  if (do_benchmark_all) {
538  va_list va;
539  char buf[1024];
540 
541  if (fmt) {
542  va_start(va, fmt);
543  vsnprintf(buf, sizeof(buf), fmt, va);
544  va_end(va);
546  "bench: %8" PRIu64 " user %8" PRIu64 " sys %8" PRIu64 " real %s \n",
549  t.real_usec - current_time.real_usec, buf);
550  }
551  current_time = t;
552  }
553 }
554 
555 static void print_report(int is_last_report, int64_t timer_start, int64_t cur_time, int64_t pts)
556 {
557  AVBPrint buf, buf_script;
558  int64_t total_size = of_filesize(output_files[0]);
559  int vid;
560  double bitrate;
561  double speed;
562  static int64_t last_time = -1;
563  static int first_report = 1;
564  uint64_t nb_frames_dup = 0, nb_frames_drop = 0;
565  int mins, secs, ms, us;
566  int64_t hours;
567  const char *hours_sign;
568  int ret;
569  float t;
570 
571  if (!print_stats && !is_last_report && !progress_avio)
572  return;
573 
574  if (!is_last_report) {
575  if (last_time == -1) {
576  last_time = cur_time;
577  }
578  if (((cur_time - last_time) < stats_period && !first_report) ||
579  (first_report && atomic_load(&nb_output_dumped) < nb_output_files))
580  return;
581  last_time = cur_time;
582  }
583 
584  t = (cur_time-timer_start) / 1000000.0;
585 
586  vid = 0;
588  av_bprint_init(&buf_script, 0, AV_BPRINT_SIZE_AUTOMATIC);
589 
590  for (OutputStream *ost = ost_iter(NULL); ost; ost = ost_iter(ost)) {
591  const float q = ost->enc ? atomic_load(&ost->quality) / (float) FF_QP2LAMBDA : -1;
592 
593  if (vid && ost->type == AVMEDIA_TYPE_VIDEO) {
594  av_bprintf(&buf, "q=%2.1f ", q);
595  av_bprintf(&buf_script, "stream_%d_%d_q=%.1f\n",
596  ost->file->index, ost->index, q);
597  }
598  if (!vid && ost->type == AVMEDIA_TYPE_VIDEO) {
599  float fps;
600  uint64_t frame_number = atomic_load(&ost->packets_written);
601 
602  fps = t > 1 ? frame_number / t : 0;
603  av_bprintf(&buf, "frame=%5"PRId64" fps=%3.*f q=%3.1f ",
604  frame_number, fps < 9.95, fps, q);
605  av_bprintf(&buf_script, "frame=%"PRId64"\n", frame_number);
606  av_bprintf(&buf_script, "fps=%.2f\n", fps);
607  av_bprintf(&buf_script, "stream_%d_%d_q=%.1f\n",
608  ost->file->index, ost->index, q);
609  if (is_last_report)
610  av_bprintf(&buf, "L");
611 
612  if (ost->filter) {
613  nb_frames_dup = atomic_load(&ost->filter->nb_frames_dup);
614  nb_frames_drop = atomic_load(&ost->filter->nb_frames_drop);
615  }
616 
617  vid = 1;
618  }
619  }
620 
621  if (copy_ts) {
622  if (copy_ts_first_pts == AV_NOPTS_VALUE && pts > 1)
626  }
627 
629  secs = FFABS64U(pts) / AV_TIME_BASE % 60;
630  mins = FFABS64U(pts) / AV_TIME_BASE / 60 % 60;
631  hours = FFABS64U(pts) / AV_TIME_BASE / 3600;
632  hours_sign = (pts < 0) ? "-" : "";
633 
634  bitrate = pts != AV_NOPTS_VALUE && pts && total_size >= 0 ? total_size * 8 / (pts / 1000.0) : -1;
635  speed = pts != AV_NOPTS_VALUE && t != 0.0 ? (double)pts / AV_TIME_BASE / t : -1;
636 
637  if (total_size < 0) av_bprintf(&buf, "size=N/A time=");
638  else av_bprintf(&buf, "size=%8.0fKiB time=", total_size / 1024.0);
639  if (pts == AV_NOPTS_VALUE) {
640  av_bprintf(&buf, "N/A ");
641  } else {
642  av_bprintf(&buf, "%s%02"PRId64":%02d:%02d.%02d ",
643  hours_sign, hours, mins, secs, (100 * us) / AV_TIME_BASE);
644  }
645 
646  if (bitrate < 0) {
647  av_bprintf(&buf, "bitrate=N/A");
648  av_bprintf(&buf_script, "bitrate=N/A\n");
649  }else{
650  av_bprintf(&buf, "bitrate=%6.1fkbits/s", bitrate);
651  av_bprintf(&buf_script, "bitrate=%6.1fkbits/s\n", bitrate);
652  }
653 
654  if (total_size < 0) av_bprintf(&buf_script, "total_size=N/A\n");
655  else av_bprintf(&buf_script, "total_size=%"PRId64"\n", total_size);
656  if (pts == AV_NOPTS_VALUE) {
657  av_bprintf(&buf_script, "out_time_us=N/A\n");
658  av_bprintf(&buf_script, "out_time_ms=N/A\n");
659  av_bprintf(&buf_script, "out_time=N/A\n");
660  } else {
661  av_bprintf(&buf_script, "out_time_us=%"PRId64"\n", pts);
662  av_bprintf(&buf_script, "out_time_ms=%"PRId64"\n", pts);
663  av_bprintf(&buf_script, "out_time=%s%02"PRId64":%02d:%02d.%06d\n",
664  hours_sign, hours, mins, secs, us);
665  }
666 
667  if (nb_frames_dup || nb_frames_drop)
668  av_bprintf(&buf, " dup=%"PRId64" drop=%"PRId64, nb_frames_dup, nb_frames_drop);
669  av_bprintf(&buf_script, "dup_frames=%"PRId64"\n", nb_frames_dup);
670  av_bprintf(&buf_script, "drop_frames=%"PRId64"\n", nb_frames_drop);
671 
672  if (speed < 0) {
673  av_bprintf(&buf, " speed=N/A");
674  av_bprintf(&buf_script, "speed=N/A\n");
675  } else {
676  av_bprintf(&buf, " speed=%4.3gx", speed);
677  av_bprintf(&buf_script, "speed=%4.3gx\n", speed);
678  }
679 
680  secs = (int)t;
681  ms = (int)((t - secs) * 1000);
682  mins = secs / 60;
683  secs %= 60;
684  hours = mins / 60;
685  mins %= 60;
686 
687  av_bprintf(&buf, " elapsed=%"PRId64":%02d:%02d.%02d", hours, mins, secs, ms / 10);
688 
689  if (print_stats || is_last_report) {
690  const char end = is_last_report ? '\n' : '\r';
691  if (print_stats==1 && AV_LOG_INFO > av_log_get_level()) {
692  fprintf(stderr, "%s %c", buf.str, end);
693  } else
694  av_log(NULL, AV_LOG_INFO, "%s %c", buf.str, end);
695 
696  fflush(stderr);
697  }
698  av_bprint_finalize(&buf, NULL);
699 
700  if (progress_avio) {
701  av_bprintf(&buf_script, "progress=%s\n",
702  is_last_report ? "end" : "continue");
703  avio_write(progress_avio, buf_script.str,
704  FFMIN(buf_script.len, buf_script.size - 1));
706  av_bprint_finalize(&buf_script, NULL);
707  if (is_last_report) {
708  if ((ret = avio_closep(&progress_avio)) < 0)
710  "Error closing progress log, loss of information possible: %s\n", av_err2str(ret));
711  }
712  }
713 
714  first_report = 0;
715 }
716 
717 static void print_stream_maps(void)
718 {
719  av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
720  for (InputStream *ist = ist_iter(NULL); ist; ist = ist_iter(ist)) {
721  for (int j = 0; j < ist->nb_filters; j++) {
722  if (!filtergraph_is_simple(ist->filters[j]->graph)) {
723  av_log(NULL, AV_LOG_INFO, " Stream #%d:%d (%s) -> %s",
724  ist->file->index, ist->index, ist->dec ? ist->dec->name : "?",
725  ist->filters[j]->name);
726  if (nb_filtergraphs > 1)
727  av_log(NULL, AV_LOG_INFO, " (graph %d)", ist->filters[j]->graph->index);
728  av_log(NULL, AV_LOG_INFO, "\n");
729  }
730  }
731  }
732 
733  for (OutputStream *ost = ost_iter(NULL); ost; ost = ost_iter(ost)) {
734  if (ost->attachment_filename) {
735  /* an attached file */
736  av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
737  ost->attachment_filename, ost->file->index, ost->index);
738  continue;
739  }
740 
741  if (ost->filter && !filtergraph_is_simple(ost->filter->graph)) {
742  /* output from a complex graph */
743  av_log(NULL, AV_LOG_INFO, " %s", ost->filter->name);
744  if (nb_filtergraphs > 1)
745  av_log(NULL, AV_LOG_INFO, " (graph %d)", ost->filter->graph->index);
746 
747  av_log(NULL, AV_LOG_INFO, " -> Stream #%d:%d (%s)\n", ost->file->index,
748  ost->index, ost->enc->enc_ctx->codec->name);
749  continue;
750  }
751 
752  av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
753  ost->ist->file->index,
754  ost->ist->index,
755  ost->file->index,
756  ost->index);
757  if (ost->enc) {
758  const AVCodec *in_codec = ost->ist->dec;
759  const AVCodec *out_codec = ost->enc->enc_ctx->codec;
760  const char *decoder_name = "?";
761  const char *in_codec_name = "?";
762  const char *encoder_name = "?";
763  const char *out_codec_name = "?";
764  const AVCodecDescriptor *desc;
765 
766  if (in_codec) {
767  decoder_name = in_codec->name;
768  desc = avcodec_descriptor_get(in_codec->id);
769  if (desc)
770  in_codec_name = desc->name;
771  if (!strcmp(decoder_name, in_codec_name))
772  decoder_name = "native";
773  }
774 
775  if (out_codec) {
776  encoder_name = out_codec->name;
777  desc = avcodec_descriptor_get(out_codec->id);
778  if (desc)
779  out_codec_name = desc->name;
780  if (!strcmp(encoder_name, out_codec_name))
781  encoder_name = "native";
782  }
783 
784  av_log(NULL, AV_LOG_INFO, " (%s (%s) -> %s (%s))",
785  in_codec_name, decoder_name,
786  out_codec_name, encoder_name);
787  } else
788  av_log(NULL, AV_LOG_INFO, " (copy)");
789  av_log(NULL, AV_LOG_INFO, "\n");
790  }
791 }
792 
793 static void set_tty_echo(int on)
794 {
795 #if HAVE_TERMIOS_H
796  struct termios tty;
797  if (tcgetattr(0, &tty) == 0) {
798  if (on) tty.c_lflag |= ECHO;
799  else tty.c_lflag &= ~ECHO;
800  tcsetattr(0, TCSANOW, &tty);
801  }
802 #endif
803 }
804 
806 {
807  int i, key;
808  static int64_t last_time;
810  return AVERROR_EXIT;
811  /* read_key() returns 0 on EOF */
812  if (cur_time - last_time >= 100000) {
813  key = read_key();
814  last_time = cur_time;
815  }else
816  key = -1;
817  if (key == 'q') {
818  av_log(NULL, AV_LOG_INFO, "\n\n[q] command received. Exiting.\n\n");
819  return AVERROR_EXIT;
820  }
821  if (key == '+') av_log_set_level(av_log_get_level()+10);
822  if (key == '-') av_log_set_level(av_log_get_level()-10);
823  if (key == 'c' || key == 'C'){
824  char buf[4096], target[64], command[256], arg[256] = {0};
825  double time;
826  int k, n = 0;
827  fprintf(stderr, "\nEnter command: <target>|all <time>|-1 <command>[ <argument>]\n");
828  i = 0;
829  set_tty_echo(1);
830  while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
831  if (k > 0)
832  buf[i++] = k;
833  buf[i] = 0;
834  set_tty_echo(0);
835  fprintf(stderr, "\n");
836  if (k > 0 &&
837  (n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
838  av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
839  target, time, command, arg);
840  for (OutputStream *ost = ost_iter(NULL); ost; ost = ost_iter(ost)) {
841  if (ost->fg_simple)
842  fg_send_command(ost->fg_simple, time, target, command, arg,
843  key == 'C');
844  }
845  for (i = 0; i < nb_filtergraphs; i++)
846  fg_send_command(filtergraphs[i], time, target, command, arg,
847  key == 'C');
848  } else {
850  "Parse error, at least 3 arguments were expected, "
851  "only %d given in string '%s'\n", n, buf);
852  }
853  }
854  if (key == '?'){
855  fprintf(stderr, "key function\n"
856  "? show this help\n"
857  "+ increase verbosity\n"
858  "- decrease verbosity\n"
859  "c Send command to first matching filter supporting it\n"
860  "C Send/Queue command to all matching filters\n"
861  "h dump packets/hex press to cycle through the 3 states\n"
862  "q quit\n"
863  "s Show QP histogram\n"
864  );
865  }
866  return 0;
867 }
868 
869 /*
870  * The following code is the main loop of the file converter
871  */
872 static int transcode(Scheduler *sch)
873 {
874  int ret = 0;
875  int64_t timer_start, transcode_ts = 0;
876 
878 
880 
881  ret = sch_start(sch);
882  if (ret < 0)
883  return ret;
884 
885  if (stdin_interaction) {
886  av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
887  }
888 
889  timer_start = av_gettime_relative();
890 
891  while (!sch_wait(sch, stats_period, &transcode_ts)) {
892  int64_t cur_time= av_gettime_relative();
893 
894  /* if 'q' pressed, exits */
895  if (stdin_interaction)
896  if (check_keyboard_interaction(cur_time) < 0)
897  break;
898 
899  /* dump report by using the output first video and audio streams */
900  print_report(0, timer_start, cur_time, transcode_ts);
901  }
902 
903  ret = sch_stop(sch, &transcode_ts);
904 
905  /* write the trailer if needed */
906  for (int i = 0; i < nb_output_files; i++) {
907  int err = of_write_trailer(output_files[i]);
908  ret = err_merge(ret, err);
909  }
910 
911  term_exit();
912 
913  /* dump report by using the first video and audio streams */
914  print_report(1, timer_start, av_gettime_relative(), transcode_ts);
915 
916  return ret;
917 }
918 
920 {
921  BenchmarkTimeStamps time_stamps = { av_gettime_relative() };
922 #if HAVE_GETRUSAGE
923  struct rusage rusage;
924 
925  getrusage(RUSAGE_SELF, &rusage);
926  time_stamps.user_usec =
927  (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
928  time_stamps.sys_usec =
929  (rusage.ru_stime.tv_sec * 1000000LL) + rusage.ru_stime.tv_usec;
930 #elif HAVE_GETPROCESSTIMES
931  HANDLE proc;
932  FILETIME c, e, k, u;
933  proc = GetCurrentProcess();
934  GetProcessTimes(proc, &c, &e, &k, &u);
935  time_stamps.user_usec =
936  ((int64_t)u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
937  time_stamps.sys_usec =
938  ((int64_t)k.dwHighDateTime << 32 | k.dwLowDateTime) / 10;
939 #else
940  time_stamps.user_usec = time_stamps.sys_usec = 0;
941 #endif
942  return time_stamps;
943 }
944 
945 static int64_t getmaxrss(void)
946 {
947 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
948  struct rusage rusage;
949  getrusage(RUSAGE_SELF, &rusage);
950  return (int64_t)rusage.ru_maxrss * 1024;
951 #elif HAVE_GETPROCESSMEMORYINFO
952  HANDLE proc;
953  PROCESS_MEMORY_COUNTERS memcounters;
954  proc = GetCurrentProcess();
955  memcounters.cb = sizeof(memcounters);
956  GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
957  return memcounters.PeakPagefileUsage;
958 #else
959  return 0;
960 #endif
961 }
962 
963 int main(int argc, char **argv)
964 {
965  Scheduler *sch = NULL;
966 
967  int ret;
969 
970  init_dynload();
971 
972  setvbuf(stderr,NULL,_IONBF,0); /* win32 runtime needs this */
973 
975  parse_loglevel(argc, argv, options);
976 
977 #if CONFIG_AVDEVICE
979 #endif
981 
982  show_banner(argc, argv, options);
983 
984  sch = sch_alloc();
985  if (!sch) {
986  ret = AVERROR(ENOMEM);
987  goto finish;
988  }
989 
990  /* parse options and open all input/output files */
991  ret = ffmpeg_parse_options(argc, argv, sch);
992  if (ret < 0)
993  goto finish;
994 
995  if (nb_output_files <= 0 && nb_input_files == 0) {
996  show_usage();
997  av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
998  ret = 1;
999  goto finish;
1000  }
1001 
1002  if (nb_output_files <= 0) {
1003  av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
1004  ret = 1;
1005  goto finish;
1006  }
1007 
1009  ret = transcode(sch);
1010  if (ret >= 0 && do_benchmark) {
1011  int64_t utime, stime, rtime;
1013  utime = current_time.user_usec - ti.user_usec;
1014  stime = current_time.sys_usec - ti.sys_usec;
1015  rtime = current_time.real_usec - ti.real_usec;
1017  "bench: utime=%0.3fs stime=%0.3fs rtime=%0.3fs\n",
1018  utime / 1000000.0, stime / 1000000.0, rtime / 1000000.0);
1019  }
1020 
1021  ret = received_nb_signals ? 255 :
1022  (ret == FFMPEG_ERROR_RATE_EXCEEDED) ? 69 : ret;
1023 
1024 finish:
1025  if (ret == AVERROR_EXIT)
1026  ret = 0;
1027 
1029 
1030  sch_free(&sch);
1031 
1032  av_log(NULL, AV_LOG_VERBOSE, "\n");
1033  av_log(NULL, AV_LOG_VERBOSE, "Exiting with exit code %d\n", ret);
1034 
1035  return ret;
1036 }
AV_OPT_SEARCH_CHILDREN
#define AV_OPT_SEARCH_CHILDREN
Search in possible children of the given object first.
Definition: opt.h:605
FrameData::par_enc
AVCodecParameters * par_enc
Definition: ffmpeg.h:698
AVCodec
AVCodec.
Definition: codec.h:172
av_gettime_relative
int64_t av_gettime_relative(void)
Get the current time in microseconds since some unspecified starting point.
Definition: time.c:56
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
atomic_store
#define atomic_store(object, desired)
Definition: stdatomic.h:85
err_merge
static int err_merge(int err0, int err1)
Merge two return codes - return one of the error codes if at least one of them was negative,...
Definition: ffmpeg_utils.h:39
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
nb_input_files
int nb_input_files
Definition: ffmpeg.c:106
ffmpeg_exited
static volatile int ffmpeg_exited
Definition: ffmpeg.c:141
FrameData
Definition: ffmpeg.h:679
av_bprint_init
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Definition: bprint.c:69
AV_LOG_QUIET
#define AV_LOG_QUIET
Print no output.
Definition: log.h:192
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:90
fg_free
void fg_free(FilterGraph **pfg)
Definition: ffmpeg_filter.c:988
int64_t
long long int64_t
Definition: coverity.c:34
BenchmarkTimeStamps::user_usec
int64_t user_usec
Definition: ffmpeg.c:93
frame_data_free
static void frame_data_free(void *opaque, uint8_t *data)
Definition: ffmpeg.c:399
avformat_get_class
const AVClass * avformat_get_class(void)
Get the AVClass for AVFormatContext.
Definition: options.c:190
ist_iter
InputStream * ist_iter(InputStream *prev)
Definition: ffmpeg.c:383
InputFile::index
int index
Definition: ffmpeg.h:495
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:410
of_filesize
int64_t of_filesize(OutputFile *of)
Definition: ffmpeg_mux.c:888
current_time
static BenchmarkTimeStamps current_time
Definition: ffmpeg.c:102
AVOption
AVOption.
Definition: opt.h:429
OutputStream::index
int index
Definition: ffmpeg.h:614
data
const char data[16]
Definition: mxf.c:149
atomic_int
intptr_t atomic_int
Definition: stdatomic.h:55
ffmpeg.h
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
BenchmarkTimeStamps::sys_usec
int64_t sys_usec
Definition: ffmpeg.c:94
progress_avio
AVIOContext * progress_avio
Definition: ffmpeg.c:103
show_usage
void show_usage(void)
Definition: ffmpeg_opt.c:1325
AVDictionary
Definition: dict.c:32
program_birth_year
const int program_birth_year
program birth year, defined by the program for show_banner()
Definition: ffmpeg.c:87
ost
static AVStream * ost
Definition: vaapi_transcode.c:42
term_exit_sigsafe
static void term_exit_sigsafe(void)
Definition: ffmpeg.c:124
OutputStream::file
struct OutputFile * file
Definition: ffmpeg.h:612
ECHO
#define ECHO(name, type, min, max)
Definition: af_aecho.c:157
AVIOInterruptCB
Callback for checking whether to abort blocking functions.
Definition: avio.h:59
InputStream
Definition: ffmpeg.h:458
filter_nbthreads
char * filter_nbthreads
Definition: ffmpeg_opt.c:76
stats_period
int64_t stats_period
Definition: ffmpeg_opt.c:83
finish
static void finish(void)
Definition: movenc.c:374
sch_stop
int sch_stop(Scheduler *sch, int64_t *finish_ts)
Definition: ffmpeg_sched.c:2575
u
#define u(width, name, range_min, range_max)
Definition: cbs_apv.c:83
AVPacket::opaque_ref
AVBufferRef * opaque_ref
AVBufferRef for free use by the API user.
Definition: packet.h:571
AV_BPRINT_SIZE_AUTOMATIC
#define AV_BPRINT_SIZE_AUTOMATIC
packet_data_c
const FrameData * packet_data_c(AVPacket *pkt)
Definition: ffmpeg.c:478
update_benchmark
void update_benchmark(const char *fmt,...)
Definition: ffmpeg.c:534
pts
static int64_t pts
Definition: transcode_aac.c:644
fg_send_command
void fg_send_command(FilterGraph *fg, double time, const char *target, const char *command, const char *arg, int all_filters)
Definition: ffmpeg_filter.c:3176
avformat_network_init
int avformat_network_init(void)
Do global initialization of network libraries.
Definition: utils.c:554
InputFile
Definition: ffmpeg.h:492
transcode
static int transcode(Scheduler *sch)
Definition: ffmpeg.c:872
ffmpeg_cleanup
static void ffmpeg_cleanup(int ret)
Definition: ffmpeg.c:310
pkt
AVPacket * pkt
Definition: movenc.c:60
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
sch_free
void sch_free(Scheduler **psch)
Definition: ffmpeg_sched.c:459
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
BenchmarkTimeStamps::real_usec
int64_t real_usec
Definition: ffmpeg.c:92
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
float
float
Definition: af_crystalizer.c:122
decode
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
Definition: decode_audio.c:72
of_free
void of_free(OutputFile **pof)
Definition: ffmpeg_mux.c:861
AVCodecDescriptor
This struct describes the properties of a single codec described by an AVCodecID.
Definition: codec_desc.h:38
get_benchmark_time_stamps
static BenchmarkTimeStamps get_benchmark_time_stamps(void)
Definition: ffmpeg.c:919
vstats_filename
char * vstats_filename
Definition: ffmpeg_opt.c:54
sch_alloc
Scheduler * sch_alloc(void)
Definition: ffmpeg_sched.c:577
copy_ts_first_pts
static int64_t copy_ts_first_pts
Definition: ffmpeg.c:142
print_filtergraphs
int print_filtergraphs(FilterGraph **graphs, int nb_graphs, InputFile **ifiles, int nb_ifiles, OutputFile **ofiles, int nb_ofiles)
Definition: graphprint.c:1093
bitrate
int64_t bitrate
Definition: av1_levels.c:47
AVDictionaryEntry::key
char * key
Definition: dict.h:91
term_init
void term_init(void)
Definition: ffmpeg.c:202
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
ctx
AVFormatContext * ctx
Definition: movenc.c:49
limits.h
print_graphs_file
char * print_graphs_file
Definition: ffmpeg_opt.c:80
nb_streams
static int nb_streams
Definition: ffprobe.c:334
on
s EdgeDetect Foobar g libavfilter vf_edgedetect c libavfilter vf_foobar c edit libavfilter and add an entry for foobar following the pattern of the other filters edit libavfilter allfilters and add an entry for foobar following the pattern of the other filters configure make j< whatever > ffmpeg ffmpeg i you should get a foobar png with Lena edge detected That s your new playground is ready Some little details about what s going on
Definition: writing_filters.txt:34
term_exit
void term_exit(void)
Definition: ffmpeg.c:132
ffmpeg_utils.h
key
const char * key
Definition: hwcontext_opencl.c:189
atomic_load
#define atomic_load(object)
Definition: stdatomic.h:93
command
static int command(AVFilterContext *ctx, const char *cmd, const char *arg, char *res, int res_len, int flags)
Definition: vf_drawtext.c:1187
arg
const char * arg
Definition: jacosubdec.c:67
of_enc_stats_close
void of_enc_stats_close(void)
Definition: ffmpeg_mux_init.c:197
option
option
Definition: libkvazaar.c:314
avio_flush
void avio_flush(AVIOContext *s)
Force flushing of buffered data.
Definition: aviobuf.c:223
av_log_get_level
int av_log_get_level(void)
Get the current log level.
Definition: log.c:469
init_dynload
void init_dynload(void)
Initialize dynamic library loading.
Definition: cmdutils.c:75
opts
AVDictionary * opts
Definition: movenc.c:51
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
avcodec_get_class
const AVClass * avcodec_get_class(void)
Get the AVClass for AVCodecContext.
Definition: options.c:184
NULL
#define NULL
Definition: coverity.c:32
av_buffer_unref
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition: buffer.c:139
avcodec_parameters_free
void avcodec_parameters_free(AVCodecParameters **ppar)
Free an AVCodecParameters instance and everything associated with it and write NULL to the supplied p...
Definition: codec_par.c:66
main
int main(int argc, char **argv)
Definition: ffmpeg.c:963
Decoder
Definition: ffmpeg.h:444
nb_output_dumped
atomic_uint nb_output_dumped
Definition: ffmpeg.c:100
getmaxrss
static int64_t getmaxrss(void)
Definition: ffmpeg.c:945
check_keyboard_interaction
static int check_keyboard_interaction(int64_t cur_time)
Definition: ffmpeg.c:805
av_log_set_flags
void av_log_set_flags(int arg)
Definition: log.c:479
print_stream_maps
static void print_stream_maps(void)
Definition: ffmpeg.c:717
options
Definition: swscale.c:43
vstats_file
FILE * vstats_file
Definition: ffmpeg.c:89
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
ost_iter
OutputStream * ost_iter(OutputStream *prev)
Definition: ffmpeg.c:367
double
double
Definition: af_crystalizer.c:132
time.h
received_nb_signals
static volatile int received_nb_signals
Definition: ffmpeg.c:139
do_benchmark_all
int do_benchmark_all
Definition: ffmpeg_opt.c:64
OutputFile::index
int index
Definition: ffmpeg.h:665
AV_OPT_FLAG_ENCODING_PARAM
#define AV_OPT_FLAG_ENCODING_PARAM
A generic parameter which can be set by the user for muxing or encoding.
Definition: opt.h:352
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
av_buffer_create
AVBufferRef * av_buffer_create(uint8_t *data, size_t size, void(*free)(void *opaque, uint8_t *data), void *opaque, int flags)
Create an AVBuffer from an existing array.
Definition: buffer.c:55
input_files
InputFile ** input_files
Definition: ffmpeg.c:105
print_graphs_format
char * print_graphs_format
Definition: ffmpeg_opt.c:81
OutputFile::streams
OutputStream ** streams
Definition: ffmpeg.h:669
Scheduler
Definition: ffmpeg_sched.c:275
FilterGraph
Definition: ffmpeg.h:394
print_stats
int print_stats
Definition: ffmpeg_opt.c:73
decode_interrupt_cb
static int decode_interrupt_cb(void *ctx)
Definition: ffmpeg.c:303
print_report
static void print_report(int is_last_report, int64_t timer_start, int64_t cur_time, int64_t pts)
Definition: ffmpeg.c:555
av_opt_find
const AVOption * av_opt_find(void *obj, const char *name, const char *unit, int opt_flags, int search_flags)
Look for an option in an object.
Definition: opt.c:1991
f
f
Definition: af_crystalizer.c:122
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
av_bprint_finalize
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition: bprint.c:240
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
output_files
OutputFile ** output_files
Definition: ffmpeg.c:108
SIGNAL
#define SIGNAL(sig, func)
Definition: ffmpeg.c:198
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
received_sigterm
static volatile int received_sigterm
Definition: ffmpeg.c:138
filtergraph_is_simple
int filtergraph_is_simple(const FilterGraph *fg)
Definition: ffmpeg_filter.c:2134
uninit_opts
void uninit_opts(void)
Uninitialize the cmdutils option system, in particular free the *_opts contexts and their contents.
Definition: cmdutils.c:62
copy_ts
int copy_ts
Definition: ffmpeg_opt.c:67
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:247
frame_data
FrameData * frame_data(AVFrame *frame)
Get our axiliary frame data attached to the frame, allocating it if needed.
Definition: ffmpeg.c:460
avdevice.h
show_banner
void show_banner(int argc, char **argv, const OptionDef *options)
Print the program banner to stderr.
Definition: opt_common.c:234
avio_write
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
Definition: aviobuf.c:201
do_benchmark
int do_benchmark
Definition: ffmpeg_opt.c:63
us
#define us(width, name, range_min, range_max, subs,...)
Definition: cbs_apv.c:87
decoders
Decoder ** decoders
Definition: ffmpeg.c:114
nb_decoders
int nb_decoders
Definition: ffmpeg.c:115
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:221
AVCodec::id
enum AVCodecID id
Definition: codec.h:186
avcodec_parameters_alloc
AVCodecParameters * avcodec_parameters_alloc(void)
Allocate a new AVCodecParameters and set its fields to default values (unknown/invalid/0).
Definition: codec_par.c:56
av_log_set_level
void av_log_set_level(int level)
Set the log level.
Definition: log.c:474
bprint.h
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
AV_TIME_BASE
#define AV_TIME_BASE
Internal time base represented as integer.
Definition: avutil.h:253
vsnprintf
#define vsnprintf
Definition: snprintf.h:36
sigterm_handler
static void sigterm_handler(int sig)
Definition: ffmpeg.c:145
print_graphs
int print_graphs
Definition: ffmpeg_opt.c:79
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:256
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
filtergraphs
FilterGraph ** filtergraphs
Definition: ffmpeg.c:111
int_cb
const AVIOInterruptCB int_cb
Definition: ffmpeg.c:308
nb_output_files
int nb_output_files
Definition: ffmpeg.c:109
frame_data_ensure
static int frame_data_ensure(AVBufferRef **dst, int writable)
Definition: ffmpeg.c:408
av_buffer_is_writable
int av_buffer_is_writable(const AVBufferRef *buf)
Definition: buffer.c:147
parse_loglevel
void parse_loglevel(int argc, char **argv, const OptionDef *options)
Find the '-loglevel' option in the command line args and apply it.
Definition: cmdutils.c:555
ret
ret
Definition: filter_design.txt:187
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
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
hw_device_free_all
void hw_device_free_all(void)
Definition: ffmpeg_hw.c:286
avformat.h
av_bprintf
void av_bprintf(AVBPrint *buf, const char *fmt,...)
Definition: bprint.c:99
dict.h
check_avoptions_used
int check_avoptions_used(const AVDictionary *opts, const AVDictionary *opts_used, void *logctx, int decode)
Definition: ffmpeg.c:484
flag
#define flag(name)
Definition: cbs_av1.c:495
AV_LOG_SKIP_REPEATED
#define AV_LOG_SKIP_REPEATED
Skip repeated messages, this requires the user app to use av_log() instead of (f)printf as the 2 woul...
Definition: log.h:400
ifile_close
void ifile_close(InputFile **f)
Definition: ffmpeg_demux.c:888
avformat_network_deinit
int avformat_network_deinit(void)
Undo the initialization done by avformat_network_init.
Definition: utils.c:566
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:750
transcode_init_done
static atomic_int transcode_init_done
Definition: ffmpeg.c:140
BenchmarkTimeStamps
Definition: ffmpeg.c:91
InputStream::file
struct InputFile * file
Definition: ffmpeg.h:462
atomic_uint
intptr_t atomic_uint
Definition: stdatomic.h:56
program_name
const char program_name[]
program name, defined by the program for show_version().
Definition: ffmpeg.c:86
ffmpeg_parse_options
int ffmpeg_parse_options(int argc, char **argv, Scheduler *sch)
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
desc
const char * desc
Definition: libsvtav1.c:79
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
mem.h
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
InputStream::index
int index
Definition: ffmpeg.h:464
ffmpeg_sched.h
sch_wait
int sch_wait(Scheduler *sch, uint64_t timeout_us, int64_t *transcode_ts)
Wait until transcoding terminates or the specified timeout elapses.
Definition: ffmpeg_sched.c:1657
FFMPEG_ERROR_RATE_EXCEEDED
#define FFMPEG_ERROR_RATE_EXCEEDED
Definition: ffmpeg.h:64
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AVDictionaryEntry
Definition: dict.h:90
stdin_interaction
int stdin_interaction
Definition: ffmpeg_opt.c:74
AVPacket
This structure stores compressed data.
Definition: packet.h:512
avio_closep
int avio_closep(AVIOContext **s)
Close the resource accessed by the AVIOContext *s, free it and set the pointer pointing to it to NULL...
Definition: avio.c:650
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
cmdutils.h
packet_data
FrameData * packet_data(AVPacket *pkt)
Definition: ffmpeg.c:472
nb_filtergraphs
int nb_filtergraphs
Definition: ffmpeg.c:112
sch_start
int sch_start(Scheduler *sch)
Definition: ffmpeg_sched.c:1591
OutputStream
Definition: mux.c:53
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
graphprint.h
FFABS64U
#define FFABS64U(a)
Definition: common.h:92
AVERROR_EXIT
#define AVERROR_EXIT
Immediate exit was requested; the called function should not be restarted.
Definition: error.h:58
avcodec_descriptor_get
const AVCodecDescriptor * avcodec_descriptor_get(enum AVCodecID id)
Definition: codec_desc.c:3794
set_tty_echo
static void set_tty_echo(int on)
Definition: ffmpeg.c:793
FF_QP2LAMBDA
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
Definition: avutil.h:226
frame_data_c
const FrameData * frame_data_c(AVFrame *frame)
Definition: ffmpeg.c:466
read_key
static int read_key(void)
Definition: ffmpeg.c:251
of_write_trailer
int of_write_trailer(OutputFile *of)
Definition: ffmpeg_mux.c:757
av_dict_iterate
const AVDictionaryEntry * av_dict_iterate(const AVDictionary *m, const AVDictionaryEntry *prev)
Iterate over a dictionary.
Definition: dict.c:42
src
#define src
Definition: vp8dsp.c:248
read
static uint32_t BS_FUNC() read(BSCTX *bc, unsigned int n)
Return n bits from the buffer, n has to be in the 0-32 range.
Definition: bitstream_template.h:231
avcodec_parameters_copy
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
Copy the contents of src to dst.
Definition: codec_par.c:106
OutputFile
Definition: ffmpeg.h:662
avdevice_register_all
FF_VISIBILITY_POP_HIDDEN av_cold void avdevice_register_all(void)
Initialize libavdevice and register all the input and output devices.
Definition: alldevices.c:67