1 /*
2 * Various utilities for command line tools
3 * Copyright (c) 2000-2003 Fabrice Bellard
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 #include <string.h>
23 #include <stdlib.h>
24 #include <errno.h>
26
27 /* Include only the enabled headers since some compilers (namely, Sun
28 Studio) will not omit unused inline functions and create undefined
29 references to libraries that are not being built. */
30
31 #include "config.h"
39 #if CONFIG_POSTPROC
41 #endif
53 #include "version.h"
54 #if CONFIG_NETWORK
56 #endif
57 #if HAVE_SYS_RESOURCE_H
58 #include <sys/time.h>
59 #include <sys/resource.h>
60 #endif
61
63
67
69
71
73 {
74
75 if(CONFIG_SWSCALE)
78 }
79
81 {
82 #if CONFIG_SWSCALE
85 #endif
86
91 }
92
94 {
95 vfprintf(stdout, fmt, vl);
96 }
97
99 {
100 va_list vl2;
102 static int print_prefix = 1;
103
104 va_copy(vl2, vl);
107 va_end(vl2);
110 }
111
113 double min,
double max)
114 {
115 char *tail;
116 const char *error;
118 if (*tail)
119 error = "Expected number for %s but found: %s\n";
120 else if (d < min || d > max)
121 error = "The value for %s was %s which is not within %f - %f\n";
122 else if (type ==
OPT_INT64 && (int64_t)d != d)
123 error = "Expected int64 for %s but found %s\n";
124 else if (type ==
OPT_INT && (
int)d != d)
125 error = "Expected int for %s but found %s\n";
126 else
127 return d;
129 exit(1);
130 return 0;
131 }
132
134 int is_duration)
135 {
136 int64_t us;
139 is_duration ? "duration" : "date", context, timestr);
140 exit(1);
141 }
142 return us;
143 }
144
146 int rej_flags, int alt_flags)
147 {
149 int first;
150
151 first = 1;
152 for (po = options; po->
name !=
NULL; po++) {
153 char buf[64];
154
155 if (((po->
flags & req_flags) != req_flags) ||
156 (alt_flags && !(po->
flags & alt_flags)) ||
157 (po->
flags & rej_flags))
158 continue;
159
160 if (first) {
161 printf("%s\n", msg);
162 first = 0;
163 }
168 }
169 printf(
"-%-17s %s\n", buf, po->
help);
170 }
171 printf("\n");
172 }
173
175 {
177 if (class->option) {
179 printf("\n");
180 }
181
184 }
185
187 {
188 const char *p = strchr(name, ':');
189 int len = p ? p - name : strlen(name);
190
192 if (!strncmp(name, po->
name, len) && strlen(po->
name) == len)
193 break;
194 po++;
195 }
196 return po;
197 }
198
199 #if HAVE_COMMANDLINETOARGVW
200 #include <windows.h>
201 #include <shellapi.h>
202 /* Will be leaked on exit */
203 static char** win32_argv_utf8 =
NULL;
204 static int win32_argc = 0;
205
206 /**
207 * Prepare command line arguments for executable.
208 * For Windows - perform wide-char to UTF-8 conversion.
209 * Input arguments should be main() function arguments.
210 * @param argc_ptr Arguments number (including executable)
211 * @param argv_ptr Arguments list.
212 */
214 {
215 char *argstr_flat;
216 wchar_t **argv_w;
217 int i, buffsize = 0,
offset = 0;
218
219 if (win32_argv_utf8) {
220 *argc_ptr = win32_argc;
221 *argv_ptr = win32_argv_utf8;
222 return;
223 }
224
225 win32_argc = 0;
226 argv_w = CommandLineToArgvW(GetCommandLineW(), &win32_argc);
227 if (win32_argc <= 0 || !argv_w)
228 return;
229
230 /* determine the UTF-8 buffer size (including NULL-termination symbols) */
231 for (i = 0; i < win32_argc; i++)
232 buffsize += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1,
234
235 win32_argv_utf8 =
av_mallocz(
sizeof(
char *) * (win32_argc + 1) + buffsize);
236 argstr_flat = (char *)win32_argv_utf8 + sizeof(char *) * (win32_argc + 1);
237 if (win32_argv_utf8 ==
NULL) {
238 LocalFree(argv_w);
239 return;
240 }
241
242 for (i = 0; i < win32_argc; i++) {
243 win32_argv_utf8[i] = &argstr_flat[
offset];
244 offset += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1,
247 }
248 win32_argv_utf8[i] =
NULL;
249 LocalFree(argv_w);
250
251 *argc_ptr = win32_argc;
252 *argv_ptr = win32_argv_utf8;
253 }
254 #else
256 {
257 /* nothing to do */
258 }
259 #endif /* HAVE_COMMANDLINETOARGVW */
260
263 {
264 /* new-style options contain an offset into optctx, old-style address of
265 * a global var*/
268 int *dstcount;
269
272 char *p = strchr(opt, ':');
273
274 dstcount = (int *)(so + 1);
275 *so =
grow_array(*so,
sizeof(**so), dstcount, *dstcount + 1);
276 (*so)[*dstcount - 1].specifier =
av_strdup(p ? p + 1 :
"");
277 dst = &(*so)[*dstcount - 1].u;
278 }
279
281 char *str;
283 // av_freep(dst);
284 *(char **)dst = str;
296 int ret = po->
u.
func_arg(optctx, opt, arg);
297 if (ret < 0) {
299 "Failed to set value '%s' for option '%s'\n", arg, opt);
300 return ret;
301 }
302 }
304 exit(0);
305
306 return 0;
307 }
308
311 {
313 int ret;
314
316 if (!po->
name && opt[0] ==
'n' && opt[1] ==
'o') {
317 /* handle 'no' bool option */
320 arg = "0";
322 arg = "1";
323
329 }
333 }
334
336 if (ret < 0)
337 return ret;
338
340 }
341
343 void (*parse_arg_function)(void *, const char*))
344 {
345 const char *opt;
346 int optindex, handleoptions = 1, ret;
347
348 /* perform system-dependent conversions for arguments list */
350
351 /* parse options */
352 optindex = 1;
353 while (optindex < argc) {
354 opt = argv[optindex++];
355
356 if (handleoptions && opt[0] == '-' && opt[1] != '0円') {
357 if (opt[1] == '-' && opt[2] == '0円') {
358 handleoptions = 0;
359 continue;
360 }
361 opt++;
362
363 if ((ret =
parse_option(optctx, opt, argv[optindex], options)) < 0)
364 exit(1);
365 optindex += ret;
366 } else {
367 if (parse_arg_function)
368 parse_arg_function(optctx, opt);
369 }
370 }
371 }
372
374 {
375 int i, ret;
376
379
380 for (i = 0; i < g->
nb_opts; i++) {
382
385
387 if (ret < 0)
388 return ret;
389 }
390
392
393 return 0;
394 }
395
397 const char *optname)
398 {
400 int i;
401
402 for (i = 1; i < argc; i++) {
403 const char *cur_opt = argv[i];
404
405 if (*cur_opt++ != '-')
406 continue;
407
409 if (!po->
name && cur_opt[0] ==
'n' && cur_opt[1] ==
'o')
411
412 if ((!po->
name && !strcmp(cur_opt, optname)) ||
413 (po->
name && !strcmp(optname, po->
name)))
414 return i;
415
417 i++;
418 }
419 return 0;
420 }
421
423 {
424 const unsigned char *p;
425
426 for (p = a; *p; p++)
427 if (!((*p >= '+' && *p <= ':') || (*p >= '@' && *p <= 'Z') ||
428 *p == '_' || (*p >= 'a' && *p <= 'z')))
429 break;
430 if (!*p) {
432 return;
433 }
435 for (p = a; *p; p++) {
436 if (*p == '\\' || *p == '"' || *p == '$' || *p == '`')
438 else if (*p < ' ' || *p > '~')
440 else
442 }
444 }
445
447 {
449 const char *env;
450 if (!idx)
452 if (idx && argv[idx + 1])
455 if ((env = getenv("FFREPORT")) || idx) {
458 int i;
460 for (i = 0; i < argc; i++) {
463 }
465 }
466 }
467 }
468
469 #define FLAGS (o->type == AV_OPT_TYPE_FLAGS) ? AV_DICT_APPEND : 0
471 {
473 int consumed = 0;
474 char opt_stripped[128];
475 const char *p;
477 #if CONFIG_AVRESAMPLE
479 #endif
481
482 if (!strcmp(opt, "debug") || !strcmp(opt, "fdebug"))
484
485 if (!(p = strchr(opt, ':')))
486 p = opt + strlen(opt);
487 av_strlcpy(opt_stripped, opt,
FFMIN(
sizeof(opt_stripped), p - opt + 1));
488
491 ((opt[0] == 'v' || opt[0] == 'a' || opt[0] == 's') &&
494 consumed = 1;
495 }
499 if(consumed)
501 consumed = 1;
502 }
503 #if CONFIG_SWSCALE
507 // XXX we only support sws_flags, not arbitrary sws options
509 if (ret < 0) {
511 return ret;
512 }
513 consumed = 1;
514 }
515 #endif
516 #if CONFIG_SWRESAMPLE
523 if (ret < 0) {
525 return ret;
526 }
528 consumed = 1;
529 }
530 #endif
531 #if CONFIG_AVRESAMPLE
535 consumed = 1;
536 }
537 #endif
538
539 if (consumed)
540 return 0;
542 }
543
544 /*
545 * Check whether given option is a group separator.
546 *
547 * @return index of the group definition that matched or -1 if none
548 */
550 const char *opt)
551 {
552 int i;
553
554 for (i = 0; i < nb_groups; i++) {
556 if (p->
sep && !strcmp(p->
sep, opt))
557 return i;
558 }
559
560 return -1;
561 }
562
563 /*
564 * Finish parsing an option group.
565 *
566 * @param group_idx which group definition should this group belong to
567 * @param arg argument of the group delimiting option
568 */
571 {
574
577
581 #if CONFIG_SWSCALE
583 #endif
588
591 resample_opts =
NULL;
592 #if CONFIG_SWSCALE
594 #endif
597
599 }
600
601 /*
602 * Add an option instance to currently parsed group.
603 */
605 const char *key, const char *val)
606 {
609
614 }
615
618 {
620 int i;
621
622 memset(octx, 0, sizeof(*octx));
623
627 exit(1);
628
631
634
636 }
637
639 {
640 int i, j;
641
644
650 #if CONFIG_SWSCALE
652 #endif
654 }
656 }
658
661
663 }
664
668 {
669 int optindex = 1;
670 int dashdash = -2;
671
672 /* perform system-dependent conversions for arguments list */
674
677
678 while (optindex < argc) {
679 const char *opt = argv[optindex++], *
arg;
681 int ret;
682
684
685 if (opt[0] == '-' && opt[1] == '-' && !opt[2]) {
686 dashdash = optindex;
687 continue;
688 }
689 /* unnamed group separators, e.g. output filename */
690 if (opt[0] != '-' || !opt[1] || dashdash+1 == optindex) {
693 continue;
694 }
695 opt++;
696
697 #define GET_ARG(arg) \
698 do { \
699 arg = argv[optindex++]; \
700 if (!arg) { \
701 av_log(NULL, AV_LOG_ERROR, "Missing argument for option '%s'.\n", opt);\
702 return AVERROR(EINVAL); \
703 } \
704 } while (0)
705
706 /* named group separators, e.g. -i */
711 groups[ret].
name, arg);
712 continue;
713 }
714
715 /* normal options */
719 /* optional argument, e.g. -h */
720 arg = argv[optindex++];
723 } else {
724 arg = "1";
725 }
726
729 "argument '%s'.\n", po->
name, po->
help, arg);
730 continue;
731 }
732
733 /* AVOptions */
734 if (argv[optindex]) {
736 if (ret >= 0) {
738 "argument '%s'.\n", opt, argv[optindex]);
739 optindex++;
740 continue;
743 "with argument '%s'.\n", opt, argv[optindex]);
744 return ret;
745 }
746 }
747
748 /* boolean -nofoo options */
749 if (opt[0] == 'n' && opt[1] == 'o' &&
754 "argument 0.\n", po->
name, po->
help);
755 continue;
756 }
757
760 }
761
764 "commandline.\n");
765
767
768 return 0;
769 }
770
772 {
773 const struct {
const char *
name;
int level; } log_levels[] = {
782 };
783 char *tail;
785 int i;
786
788 if (!strcmp(log_levels[i].
name, arg)) {
790 return 0;
791 }
792 }
793
794 level = strtol(arg, &tail, 10);
795 if (*tail) {
797 "Possible levels are numbers or:\n", arg);
800 exit(1);
801 }
803 return 0;
804 }
805
807 struct tm *tm)
808 {
810
811 while ((c = *(template++))) {
812 if (c == '%') {
813 if (!(c = *(template++)))
814 break;
815 switch (c) {
816 case 'p':
818 break;
819 case 't':
821 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
822 tm->tm_hour, tm->tm_min, tm->tm_sec);
823 break;
824 case '%':
826 break;
827 }
828 } else {
830 }
831 }
832 }
833
835 {
836 char *filename_template =
NULL;
837 char *key, *val;
838 int ret, count = 0;
839 time_t now;
840 struct tm *tm;
842
844 return 0;
845 time(&now);
846 tm = localtime(&now);
847
848 while (env && *env) {
850 if (count)
852 "Failed to parse FFREPORT environment variable: %s\n",
854 break;
855 }
856 if (*env)
857 env++;
858 count++;
859 if (!strcmp(key, "file")) {
861 filename_template = val;
863 } else {
865 }
868 }
869
877 }
878
882 filename.str, strerror(errno));
884 }
887 "%s started on %04d-%02d-%02d at %02d:%02d:%02d\n"
888 "Report written to \"%s\"\n",
890 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
891 tm->tm_hour, tm->tm_min, tm->tm_sec,
892 filename.str);
895 return 0;
896 }
897
899 {
901 }
902
904 {
905 char *tail;
906 size_t max;
907
908 max = strtol(arg, &tail, 10);
909 if (*tail) {
911 exit(1);
912 }
914 return 0;
915 }
916
918 {
919 int ret;
921
923 return ret;
924
926 return 0;
927 }
928
930 {
931 #if HAVE_SETRLIMIT
933 struct rlimit rl = { lim, lim + 1 };
934 if (setrlimit(RLIMIT_CPU, &rl))
935 perror("setrlimit");
936 #else
938 #endif
939 return 0;
940 }
941
943 {
944 char errbuf[128];
945 const char *errbuf_ptr = errbuf;
946
950 }
951
953
955 #define SHOW_VERSION 2
956 #define SHOW_CONFIG 4
957 #define SHOW_COPYRIGHT 8
958
959 #define PRINT_LIB_INFO(libname, LIBNAME, flags, level) \
960 if (CONFIG_##LIBNAME) { \
961 const char *indent = flags & INDENT? " " : ""; \
962 if (flags & SHOW_VERSION) { \
963 unsigned int version = libname##_version(); \
964 av_log(NULL, level, \
965 "%slib%-11s %2d.%3d.%3d / %2d.%3d.%3d\n", \
966 indent, #libname, \
967 LIB##LIBNAME##_VERSION_MAJOR, \
968 LIB##LIBNAME##_VERSION_MINOR, \
969 LIB##LIBNAME##_VERSION_MICRO, \
970 version >> 16, version >> 8 & 0xff, version & 0xff); \
971 } \
972 if (flags & SHOW_CONFIG) { \
973 const char *cfg = libname##_configuration(); \
974 if (strcmp(FFMPEG_CONFIGURATION, cfg)) { \
975 if (!warned_cfg) { \
976 av_log(NULL, level, \
977 "%sWARNING: library configuration mismatch\n", \
978 indent); \
979 warned_cfg = 1; \
980 } \
981 av_log(NULL, level, "%s%-11s configuration: %s\n", \
982 indent, #libname, cfg); \
983 } \
984 } \
985 } \
986
988 {
994 // PRINT_LIB_INFO(avresample, AVRESAMPLE, flags, level);
997 #if CONFIG_POSTPROC
999 #endif
1000 }
1001
1003 {
1004 const char *indent = flags &
INDENT?
" " :
"";
1005
1008 av_log(
NULL, level,
" Copyright (c) %d-%d the FFmpeg developers",
1011 av_log(
NULL, level,
"%sbuilt on %s %s with %s\n",
1012 indent, __DATE__, __TIME__, CC_IDENT);
1013
1014 av_log(
NULL, level,
"%sconfiguration: " FFMPEG_CONFIGURATION
"\n", indent);
1015 }
1016
1018 {
1020 if (idx)
1021 return;
1022
1026 }
1027
1029 {
1033
1034 return 0;
1035 }
1036
1038 {
1039 #if CONFIG_NONFREE
1040 printf(
1041 "This version of %s has nonfree parts compiled in.\n"
1042 "Therefore it is not legally redistributable.\n",
1044 #elif CONFIG_GPLV3
1045 printf(
1046 "%s is free software; you can redistribute it and/or modify\n"
1047 "it under the terms of the GNU General Public License as published by\n"
1048 "the Free Software Foundation; either version 3 of the License, or\n"
1049 "(at your option) any later version.\n"
1050 "\n"
1051 "%s is distributed in the hope that it will be useful,\n"
1052 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
1053 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
1054 "GNU General Public License for more details.\n"
1055 "\n"
1056 "You should have received a copy of the GNU General Public License\n"
1057 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
1059 #elif CONFIG_GPL
1060 printf(
1061 "%s is free software; you can redistribute it and/or modify\n"
1062 "it under the terms of the GNU General Public License as published by\n"
1063 "the Free Software Foundation; either version 2 of the License, or\n"
1064 "(at your option) any later version.\n"
1065 "\n"
1066 "%s is distributed in the hope that it will be useful,\n"
1067 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
1068 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
1069 "GNU General Public License for more details.\n"
1070 "\n"
1071 "You should have received a copy of the GNU General Public License\n"
1072 "along with %s; if not, write to the Free Software\n"
1073 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
1075 #elif CONFIG_LGPLV3
1076 printf(
1077 "%s is free software; you can redistribute it and/or modify\n"
1078 "it under the terms of the GNU Lesser General Public License as published by\n"
1079 "the Free Software Foundation; either version 3 of the License, or\n"
1080 "(at your option) any later version.\n"
1081 "\n"
1082 "%s is distributed in the hope that it will be useful,\n"
1083 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
1084 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
1085 "GNU Lesser General Public License for more details.\n"
1086 "\n"
1087 "You should have received a copy of the GNU Lesser General Public License\n"
1088 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
1090 #else
1091 printf(
1092 "%s is free software; you can redistribute it and/or\n"
1093 "modify it under the terms of the GNU Lesser General Public\n"
1094 "License as published by the Free Software Foundation; either\n"
1095 "version 2.1 of the License, or (at your option) any later version.\n"
1096 "\n"
1097 "%s is distributed in the hope that it will be useful,\n"
1098 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
1099 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
1100 "Lesser General Public License for more details.\n"
1101 "\n"
1102 "You should have received a copy of the GNU Lesser General Public\n"
1103 "License along with %s; if not, write to the Free Software\n"
1104 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
1106 #endif
1107
1108 return 0;
1109 }
1110
1112 {
1115 const char *last_name;
1116
1117 printf("File formats:\n"
1118 " D. = Demuxing supported\n"
1119 " .E = Muxing supported\n"
1120 " --\n");
1121 last_name = "000";
1122 for (;;) {
1124 int encode = 0;
1126 const char *long_name =
NULL;
1127
1129 if ((name ==
NULL || strcmp(ofmt->
name, name) < 0) &&
1130 strcmp(ofmt->
name, last_name) > 0) {
1133 encode = 1;
1134 }
1135 }
1137 if ((name ==
NULL || strcmp(ifmt->
name, name) < 0) &&
1138 strcmp(ifmt->
name, last_name) > 0) {
1141 encode = 0;
1142 }
1143 if (name && strcmp(ifmt->
name, name) == 0)
1144 decode = 1;
1145 }
1147 break;
1149
1150 printf(" %s%s %-15s %s\n",
1151 decode ? "D" : " ",
1152 encode ? "E" : " ",
1153 name,
1154 long_name ? long_name:" ");
1155 }
1156 return 0;
1157 }
1158
1159 #define PRINT_CODEC_SUPPORTED(codec, field, type, list_name, term, get_name) \
1160 if (codec->field) { \
1161 const type *p = codec->field; \
1162 \
1163 printf(" Supported " list_name ":"); \
1164 while (*p != term) { \
1165 get_name(*p); \
1166 printf(" %s", name); \
1167 p++; \
1168 } \
1169 printf("\n"); \
1170 } \
1171
1173 {
1175
1176 printf(
"%s %s [%s]:\n", encoder ?
"Encoder" :
"Decoder", c->
name,
1178
1180 printf(" Threading capabilities: ");
1187 default: printf("no"); break;
1188 }
1189 printf("\n");
1190 }
1191
1194
1195 printf(" Supported framerates:");
1197 printf(
" %d/%d", fps->
num, fps->
den);
1198 fps++;
1199 }
1200 printf("\n");
1201 }
1210
1215 }
1216 }
1217
1219 {
1220 switch (type) {
1226 default: return '?';
1227 }
1228 }
1229
1231 int encoder)
1232 {
1234 if (prev->
id ==
id &&
1236 return prev;
1237 }
1239 }
1240
1242 {
1245
1246 return (*da)->type != (*db)->type ? (*da)->type - (*db)->type :
1247 strcmp((*da)->name, (*db)->name);
1248 }
1249
1251 {
1254 unsigned nb_codecs = 0, i = 0;
1255
1257 nb_codecs++;
1258 if (!(codecs =
av_calloc(nb_codecs,
sizeof(*codecs)))) {
1260 exit(1);
1261 }
1264 codecs[i++] = desc;
1267 *rcodecs = codecs;
1268 return nb_codecs;
1269 }
1270
1272 {
1274
1275 printf(" (%s: ", encoder ? "encoders" : "decoders");
1276
1278 printf(
"%s ", codec->
name);
1279
1280 printf(")");
1281 }
1282
1284 {
1287
1288 printf("Codecs:\n"
1289 " D..... = Decoding supported\n"
1290 " .E.... = Encoding supported\n"
1291 " ..V... = Video codec\n"
1292 " ..A... = Audio codec\n"
1293 " ..S... = Subtitle codec\n"
1294 " ...I.. = Intra frame-only codec\n"
1295 " ....L. = Lossy compression\n"
1296 " .....S = Lossless compression\n"
1297 " -------\n");
1298 for (i = 0; i < nb_codecs; i++) {
1301
1302 printf(" ");
1305
1310
1312
1313 /* print decoders/encoders when there's more than one or their
1314 * names are different from codec name */
1316 if (strcmp(codec->
name, desc->
name)) {
1318 break;
1319 }
1320 }
1323 if (strcmp(codec->
name, desc->
name)) {
1325 break;
1326 }
1327 }
1328
1329 printf("\n");
1330 }
1332 return 0;
1333 }
1334
1336 {
1339
1340 printf("%s:\n"
1341 " V..... = Video\n"
1342 " A..... = Audio\n"
1343 " S..... = Subtitle\n"
1344 " .F.... = Frame-level multithreading\n"
1345 " ..S... = Slice-level multithreading\n"
1346 " ...X.. = Codec is experimental\n"
1347 " ....B. = Supports draw_horiz_band\n"
1348 " .....D = Supports direct rendering method 1\n"
1349 " ------\n",
1350 encoder ? "Encoders" : "Decoders");
1351 for (i = 0; i < nb_codecs; i++) {
1354
1362
1364 if (strcmp(codec->
name, desc->
name))
1365 printf(
" (codec %s)", desc->
name);
1366
1367 printf("\n");
1368 }
1369 }
1371 }
1372
1374 {
1376 return 0;
1377 }
1378
1380 {
1382 return 0;
1383 }
1384
1386 {
1388
1389 printf("Bitstream filters:\n");
1391 printf(
"%s\n", bsf->
name);
1392 printf("\n");
1393 return 0;
1394 }
1395
1397 {
1398 void *opaque =
NULL;
1400
1401 printf("Supported file protocols:\n"
1402 "Input:\n");
1404 printf("%s\n", name);
1405 printf("Output:\n");
1407 printf("%s\n", name);
1408 return 0;
1409 }
1410
1412 {
1414 char descr[64], *descr_cur;
1415 int i, j;
1417
1418 printf("Filters:\n");
1419 #if CONFIG_AVFILTER
1421 descr_cur = descr;
1422 for (i = 0; i < 2; i++) {
1423 if (i) {
1424 *(descr_cur++) = '-';
1425 *(descr_cur++) = '>';
1426 }
1427 pad = i ? (*filter)->outputs : (*filter)->inputs;
1428 for (j = 0; pad && pad[j].
name; j++) {
1429 if (descr_cur >= descr + sizeof(descr) - 4)
1430 break;
1432 }
1433 if (!j)
1434 *(descr_cur++) = '|';
1435 }
1436 *descr_cur = 0;
1437 printf("%-16s %-10s %s\n", (*filter)->name, descr, (*filter)->description);
1438 }
1439 #endif
1440 return 0;
1441 }
1442
1444 {
1446
1447 printf("Pixel formats:\n"
1448 "I.... = Supported Input format for conversion\n"
1449 ".O... = Supported Output format for conversion\n"
1450 "..H.. = Hardware accelerated format\n"
1451 "...P. = Paletted format\n"
1452 "....B = Bitstream format\n"
1453 "FLAGS NAME NB_COMPONENTS BITS_PER_PIXEL\n"
1454 "-----\n");
1455
1456 #if !CONFIG_SWSCALE
1457 # define sws_isSupportedInput(x) 0
1458 # define sws_isSupportedOutput(x) 0
1459 #endif
1460
1463 printf("%c%c%c%c%c %-16s %d %2d\n",
1472 }
1473 return 0;
1474 }
1475
1477 {
1478 int i = 0;
1480 const char *
name, *descr;
1481
1482 printf("Individual channels:\n"
1483 "NAME DESCRIPTION\n");
1484 for (i = 0; i < 63; i++) {
1486 if (!name)
1487 continue;
1489 printf("%-12s%s\n", name, descr);
1490 }
1491 printf("\nStandard channel layouts:\n"
1492 "NAME DECOMPOSITION\n");
1494 if (name) {
1495 printf("%-12s", name);
1496 for (j = 1; j; j <<= 1)
1497 if ((layout & j))
1499 printf("\n");
1500 }
1501 }
1502 return 0;
1503 }
1504
1506 {
1507 int i;
1508 char fmt_str[128];
1511 return 0;
1512 }
1513
1515 {
1518
1519 if (!name) {
1521 return;
1522 }
1523
1526
1527 if (codec)
1530 int printed = 0;
1531
1533 printed = 1;
1535 }
1536
1537 if (!printed) {
1539 "but no %s for it are available. FFmpeg might need to be "
1540 "recompiled with additional external libraries.\n",
1541 name, encoder ? "encoders" : "decoders");
1542 }
1543 } else {
1545 name);
1546 }
1547 }
1548
1550 {
1552
1553 if (!fmt) {
1555 return;
1556 }
1557
1559
1561 printf(
" Common extensions: %s.\n", fmt->
extensions);
1562
1565 }
1566
1568 {
1571
1572 if (!fmt) {
1574 return;
1575 }
1576
1578
1580 printf(
" Common extensions: %s.\n", fmt->
extensions);
1582 printf(
" Mime type: %s.\n", fmt->
mime_type);
1585 printf(
" Default video codec: %s.\n", desc->
name);
1586 }
1589 printf(
" Default audio codec: %s.\n", desc->
name);
1590 }
1593 printf(
" Default subtitle codec: %s.\n", desc->
name);
1594 }
1595
1598 }
1599
1601 {
1602 char *topic, *par;
1604
1606 par = strchr(topic, '=');
1607 if (par)
1608 *par++ = 0;
1609
1610 if (!*topic) {
1612 } else if (!strcmp(topic, "decoder")) {
1614 } else if (!strcmp(topic, "encoder")) {
1616 } else if (!strcmp(topic, "demuxer")) {
1618 } else if (!strcmp(topic, "muxer")) {
1620 } else {
1622 }
1623
1625 return 0;
1626 }
1627
1629 {
1632
1633 while (c != '\n' && c != EOF)
1634 c = getchar();
1635
1636 return yesno;
1637 }
1638
1640 {
1641 int ret;
1642 FILE *f = fopen(filename, "rb");
1643
1644 if (!f) {
1646 strerror(errno));
1648 }
1649 fseek(f, 0, SEEK_END);
1650 *size = ftell(f);
1651 fseek(f, 0, SEEK_SET);
1652 if (*size == (size_t)-1) {
1654 fclose(f);
1656 }
1658 if (!*bufptr) {
1660 fclose(f);
1662 }
1663 ret = fread(*bufptr, 1, *size, f);
1664 if (ret < *size) {
1666 if (ferror(f)) {
1668 filename, strerror(errno));
1670 } else
1672 } else {
1673 ret = 0;
1674 (*bufptr)[(*size)++] = '0円';
1675 }
1676
1677 fclose(f);
1678 return ret;
1679 }
1680
1682 const char *preset_name, int is_path,
1683 const char *codec_name)
1684 {
1686 int i;
1687 const char *base[3] = { getenv("FFMPEG_DATADIR"),
1688 getenv("HOME"),
1689 FFMPEG_DATADIR, };
1690
1691 if (is_path) {
1692 av_strlcpy(filename, preset_name, filename_size);
1693 f = fopen(filename, "r");
1694 } else {
1695 #ifdef _WIN32
1696 char datadir[MAX_PATH], *ls;
1698
1699 if (GetModuleFileNameA(GetModuleHandleA(
NULL), datadir,
sizeof(datadir) - 1))
1700 {
1701 for (ls = datadir; ls < datadir + strlen(datadir); ls++)
1702 if (*ls == '\\') *ls = '/';
1703
1704 if (ls = strrchr(datadir, '/'))
1705 {
1706 *ls = 0;
1707 strncat(datadir, "/ffpresets", sizeof(datadir) - 1 - strlen(datadir));
1708 base[2] = datadir;
1709 }
1710 }
1711 #endif
1712 for (i = 0; i < 3 && !f; i++) {
1713 if (!base[i])
1714 continue;
1715 snprintf(filename, filename_size,
"%s%s/%s.ffpreset", base[i],
1716 i != 1 ? "" : "/.ffmpeg", preset_name);
1717 f = fopen(filename, "r");
1718 if (!f && codec_name) {
1720 "%s%s/%s-%s.ffpreset",
1721 base[i], i != 1 ? "" : "/.ffmpeg", codec_name,
1722 preset_name);
1723 f = fopen(filename, "r");
1724 }
1725 }
1726 }
1727
1728 return f;
1729 }
1730
1732 {
1734 if (ret < 0)
1736 return ret;
1737 }
1738
1741 {
1746 char prefix = 0;
1748
1749 if (!codec)
1752
1755 prefix = 'v';
1757 break;
1759 prefix = 'a';
1761 break;
1763 prefix = 's';
1765 break;
1766 }
1767
1769 char *p = strchr(t->
key,
':');
1770
1771 /* check stream specification in opt name */
1772 if (p)
1774 case 1: *p = 0; break;
1775 case 0: continue;
1776 default:
return NULL;
1777 }
1778
1784 else if (t->
key[0] == prefix &&
1788
1789 if (p)
1790 *p = ':';
1791 }
1792 return ret;
1793 }
1794
1797 {
1798 int i;
1800
1804 if (!opts) {
1806 "Could not alloc memory for stream options.\n");
1808 }
1812 return opts;
1813 }
1814
1816 {
1817 if (new_size >= INT_MAX / elem_size) {
1819 exit(1);
1820 }
1821 if (*size < new_size) {
1823 if (!tmp) {
1825 exit(1);
1826 }
1827 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
1828 *size = new_size;
1829 return tmp;
1830 }
1831 return array;
1832 }
1833
1835 {
1838 int i, ret;
1839 int pixel_size;
1840 int h_chroma_shift, v_chroma_shift;
1841 int edge = 32; // XXX should be avcodec_get_edge_width(), but that fails on svq1
1843
1844 if (!desc)
1847
1849 if (!buf)
1851
1853
1855 w += 2*edge;
1856 h += 2*edge;
1857 }
1858
1863 return ret;
1864 }
1865
1868 const int h_shift = i==0 ? 0 : h_chroma_shift;
1869 const int v_shift = i==0 ? 0 : v_chroma_shift;
1872 else
1875 (pixel_size*edge >> h_shift), 32);
1876 }
1881
1882 *pbuf = buf;
1883 return 0;
1884 }
1885
1887 {
1890 int ret, i;
1891
1894 return -1;
1895 }
1896
1898 return ret;
1899
1900 buf = *pool;
1907 return ret;
1908 }
1911
1915
1917 frame->
base[i] = buf->
base[i];
// XXX h264.c uses base though it shouldn't
1920 }
1921
1922 return 0;
1923 }
1924
1926 {
1928
1933 for(tmp= *pool; tmp; tmp= tmp->
next)
1935
1937 *pool = buf;
1938 }
1939 }
1940
1942 {
1944 int i;
1945
1948 return;
1949 }
1950
1953
1955 }
1956
1958 {
1962 }
1963
1965 {
1967 while (buf) {
1971 buf = *pool;
1972 }
1973 }