#include "libavformat/avformat.h"
#include "libavfilter/avfilter.h"
#include "libavdevice/avdevice.h"
-#include "libavresample/avresample.h"
#include "libswscale/swscale.h"
#include "libswresample/swresample.h"
#include "libpostproc/postprocess.h"
#include "libavutil/ffversion.h"
#include "libavutil/version.h"
#include "cmdutils.h"
-#if CONFIG_NETWORK
-#include "libavformat/network.h"
-#endif
#if HAVE_SYS_RESOURCE_H
#include <sys/time.h>
#include <sys/resource.h>
void init_dynload(void)
{
-#ifdef _WIN32
+#if HAVE_SETDLLDIRECTORY && defined(_WIN32)
/* Calling SetDllDirectory with the empty string (but not NULL) removes the
* current working directory from the DLL search path as a security pre-caution. */
SetDllDirectory("");
first = 1;
for (po = options; po->name; po++) {
- char buf[64];
+ char buf[128];
if (((po->flags & req_flags) != req_flags) ||
(alt_flags && !(po->flags & alt_flags)) ||
void show_help_children(const AVClass *class, int flags)
{
- const AVClass *child = NULL;
+ void *iter = NULL;
+ const AVClass *child;
if (class->option) {
av_opt_show2(&class, NULL, flags, 0);
printf("\n");
}
- while (child = av_opt_child_class_next(class, child))
+ while (child = av_opt_child_class_iterate(class, &iter))
show_help_children(child, flags);
}
static const OptionDef *find_option(const OptionDef *po, const char *name)
{
- const char *p = strchr(name, ':');
- int len = p ? p - name : strlen(name);
-
while (po->name) {
- if (!strncmp(name, po->name, len) && strlen(po->name) == len)
+ const char *end;
+ if (av_strstart(name, po->name, &end) && (!*end || *end == ':'))
break;
po++;
}
char opt_stripped[128];
const char *p;
const AVClass *cc = avcodec_get_class(), *fc = avformat_get_class();
-#if CONFIG_AVRESAMPLE
- const AVClass *rc = avresample_get_class();
-#endif
#if CONFIG_SWSCALE
const AVClass *sc = sws_get_class();
#endif
consumed = 1;
}
#endif
-#if CONFIG_AVRESAMPLE
- if ((o=opt_find(&rc, opt, NULL, 0,
- AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) {
- av_dict_set(&resample_opts, opt, arg, FLAGS);
- consumed = 1;
- }
-#endif
if (consumed)
return 0;
}
if (octx->cur_group.nb_opts || codec_opts || format_opts || resample_opts)
- av_log(NULL, AV_LOG_WARNING, "Trailing options were found on the "
- "commandline.\n");
+ av_log(NULL, AV_LOG_WARNING, "Trailing option(s) found in the "
+ "command: may be ignored.\n");
av_log(NULL, AV_LOG_DEBUG, "Finished splitting the commandline.\n");
char *filename_template = NULL;
char *key, *val;
int ret, count = 0;
+ int prog_loglevel, envlevel = 0;
time_t now;
struct tm *tm;
AVBPrint filename;
av_log(NULL, AV_LOG_FATAL, "Invalid report file level\n");
exit_program(1);
}
+ envlevel = 1;
} else {
av_log(NULL, AV_LOG_ERROR, "Unknown key '%s' in FFREPORT\n", key);
}
return AVERROR(ENOMEM);
}
+ prog_loglevel = av_log_get_level();
+ if (!envlevel)
+ report_file_level = FFMAX(report_file_level, prog_loglevel);
+
report_file = fopen(filename.str, "w");
if (!report_file) {
int ret = AVERROR(errno);
av_log_set_callback(log_callback_report);
av_log(NULL, AV_LOG_INFO,
"%s started on %04d-%02d-%02d at %02d:%02d:%02d\n"
- "Report written to \"%s\"\n",
+ "Report written to \"%s\"\n"
+ "Log level: %d\n",
program_name,
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
tm->tm_hour, tm->tm_min, tm->tm_sec,
- filename.str);
+ filename.str, report_file_level);
av_bprint_finalize(&filename, NULL);
return 0;
}
PRINT_LIB_INFO(avformat, AVFORMAT, flags, level);
PRINT_LIB_INFO(avdevice, AVDEVICE, flags, level);
PRINT_LIB_INFO(avfilter, AVFILTER, flags, level);
- PRINT_LIB_INFO(avresample, AVRESAMPLE, flags, level);
PRINT_LIB_INFO(swscale, SWSCALE, flags, level);
PRINT_LIB_INFO(swresample, SWRESAMPLE, flags, level);
PRINT_LIB_INFO(postproc, POSTPROC, flags, level);
// Change all the ' --' strings to '~--' so that
// they can be identified as tokens.
while ((conflist = strstr(str, " --")) != NULL) {
- strncpy(conflist, "~--", 3);
+ conflist[0] = '~';
}
// Compensate for the weirdness this would cause
// when passing 'pkg-config --static'.
while ((remove_tilde = strstr(str, "pkg-config~")) != NULL) {
- strncpy(remove_tilde, "pkg-config ", 11);
+ remove_tilde[sizeof("pkg-config~") - 2] = ' ';
}
splitconf = strtok(str, "~");
printf("variable ");
if (c->capabilities & (AV_CODEC_CAP_FRAME_THREADS |
AV_CODEC_CAP_SLICE_THREADS |
- AV_CODEC_CAP_AUTO_THREADS))
+ AV_CODEC_CAP_OTHER_THREADS))
printf("threads ");
if (c->capabilities & AV_CODEC_CAP_AVOID_PROBING)
printf("avoidprobe ");
- if (c->capabilities & AV_CODEC_CAP_INTRA_ONLY)
- printf("intraonly ");
- if (c->capabilities & AV_CODEC_CAP_LOSSLESS)
- printf("lossless ");
if (c->capabilities & AV_CODEC_CAP_HARDWARE)
printf("hardware ");
if (c->capabilities & AV_CODEC_CAP_HYBRID)
printf(" Threading capabilities: ");
switch (c->capabilities & (AV_CODEC_CAP_FRAME_THREADS |
AV_CODEC_CAP_SLICE_THREADS |
- AV_CODEC_CAP_AUTO_THREADS)) {
+ AV_CODEC_CAP_OTHER_THREADS)) {
case AV_CODEC_CAP_FRAME_THREADS |
AV_CODEC_CAP_SLICE_THREADS: printf("frame and slice"); break;
case AV_CODEC_CAP_FRAME_THREADS: printf("frame"); break;
case AV_CODEC_CAP_SLICE_THREADS: printf("slice"); break;
- case AV_CODEC_CAP_AUTO_THREADS : printf("auto"); break;
+ case AV_CODEC_CAP_OTHER_THREADS: printf("other"); break;
default: printf("none"); break;
}
printf("\n");
}
}
-static const AVCodec *next_codec_for_id(enum AVCodecID id, const AVCodec *prev,
+static const AVCodec *next_codec_for_id(enum AVCodecID id, void **iter,
int encoder)
{
- while ((prev = av_codec_next(prev))) {
- if (prev->id == id &&
- (encoder ? av_codec_is_encoder(prev) : av_codec_is_decoder(prev)))
- return prev;
+ const AVCodec *c;
+ while ((c = av_codec_iterate(iter))) {
+ if (c->id == id &&
+ (encoder ? av_codec_is_encoder(c) : av_codec_is_decoder(c)))
+ return c;
}
return NULL;
}
static void print_codecs_for_id(enum AVCodecID id, int encoder)
{
- const AVCodec *codec = NULL;
+ void *iter = NULL;
+ const AVCodec *codec;
printf(" (%s: ", encoder ? "encoders" : "decoders");
- while ((codec = next_codec_for_id(id, codec, encoder)))
+ while ((codec = next_codec_for_id(id, &iter, encoder)))
printf("%s ", codec->name);
printf(")");
" -------\n");
for (i = 0; i < nb_codecs; i++) {
const AVCodecDescriptor *desc = codecs[i];
- const AVCodec *codec = NULL;
+ const AVCodec *codec;
+ void *iter = NULL;
if (strstr(desc->name, "_deprecated"))
continue;
/* print decoders/encoders when there's more than one or their
* names are different from codec name */
- while ((codec = next_codec_for_id(desc->id, codec, 0))) {
+ while ((codec = next_codec_for_id(desc->id, &iter, 0))) {
if (strcmp(codec->name, desc->name)) {
print_codecs_for_id(desc->id, 0);
break;
}
}
- codec = NULL;
- while ((codec = next_codec_for_id(desc->id, codec, 1))) {
+ iter = NULL;
+ while ((codec = next_codec_for_id(desc->id, &iter, 1))) {
if (strcmp(codec->name, desc->name)) {
print_codecs_for_id(desc->id, 1);
break;
encoder ? "Encoders" : "Decoders");
for (i = 0; i < nb_codecs; i++) {
const AVCodecDescriptor *desc = codecs[i];
- const AVCodec *codec = NULL;
+ const AVCodec *codec;
+ void *iter = NULL;
- while ((codec = next_codec_for_id(desc->id, codec, encoder))) {
+ while ((codec = next_codec_for_id(desc->id, &iter, encoder))) {
printf(" %c", get_media_type_char(desc->type));
printf((codec->capabilities & AV_CODEC_CAP_FRAME_THREADS) ? "F" : ".");
printf((codec->capabilities & AV_CODEC_CAP_SLICE_THREADS) ? "S" : ".");
if (codec)
print_codec(codec);
else if ((desc = avcodec_descriptor_get_by_name(name))) {
+ void *iter = NULL;
int printed = 0;
- while ((codec = next_codec_for_id(desc->id, codec, encoder))) {
+ while ((codec = next_codec_for_id(desc->id, &iter, encoder))) {
printed = 1;
print_codec(codec);
}
show_help_children(fmt->priv_class, AV_OPT_FLAG_DECODING_PARAM);
}
+static void show_help_protocol(const char *name)
+{
+ const AVClass *proto_class;
+
+ if (!name) {
+ av_log(NULL, AV_LOG_ERROR, "No protocol name specified.\n");
+ return;
+ }
+
+ proto_class = avio_protocol_get_class(name);
+ if (!proto_class) {
+ av_log(NULL, AV_LOG_ERROR, "Unknown protocol '%s'.\n", name);
+ return;
+ }
+
+ show_help_children(proto_class, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
+}
+
static void show_help_muxer(const char *name)
{
const AVCodecDescriptor *desc;
show_help_demuxer(par);
} else if (!strcmp(topic, "muxer")) {
show_help_muxer(par);
+ } else if (!strcmp(topic, "protocol")) {
+ show_help_protocol(par);
#if CONFIG_AVFILTER
} else if (!strcmp(topic, "filter")) {
show_help_filter(par);
av_strlcpy(filename, preset_name, filename_size);
f = fopen(filename, "r");
} else {
-#ifdef _WIN32
+#if HAVE_GETMODULEHANDLE && defined(_WIN32)
char datadir[MAX_PATH], *ls;
base[2] = NULL;
}
AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id,
- AVFormatContext *s, AVStream *st, AVCodec *codec)
+ AVFormatContext *s, AVStream *st, const AVCodec *codec)
{
AVDictionary *ret = NULL;
AVDictionaryEntry *t = NULL;
}
while (t = av_dict_get(opts, "", t, AV_DICT_IGNORE_SUFFIX)) {
+ const AVClass *priv_class;
char *p = strchr(t->key, ':');
/* check stream specification in opt name */
if (av_opt_find(&cc, t->key, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ) ||
!codec ||
- (codec->priv_class &&
- av_opt_find(&codec->priv_class, t->key, NULL, flags,
+ ((priv_class = codec->priv_class) &&
+ av_opt_find(&priv_class, t->key, NULL, flags,
AV_OPT_SEARCH_FAKE_OBJ)))
av_dict_set(&ret, t->key, t->value, 0);
else if (t->key[0] == prefix &&
if (fabs(theta - 90*round(theta/90)) > 2)
av_log(NULL, AV_LOG_WARNING, "Odd rotation angle.\n"
"If you want to help, upload a sample "
- "of this file to ftp://upload.ffmpeg.org/incoming/ "
+ "of this file to https://streams.videolan.org/upload/ "
"and contact the ffmpeg-devel mailing list. (ffmpeg-devel@ffmpeg.org)");
return theta;
int ret = 0;
int error_level = av_log_get_level();
- av_log_set_level(AV_LOG_ERROR);
+ av_log_set_level(AV_LOG_WARNING);
if ((ret = show_sinks_sources_parse_arg(arg, &dev, &opts)) < 0)
goto fail;
int ret = 0;
int error_level = av_log_get_level();
- av_log_set_level(AV_LOG_ERROR);
+ av_log_set_level(AV_LOG_WARNING);
if ((ret = show_sinks_sources_parse_arg(arg, &dev, &opts)) < 0)
goto fail;