X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=cmdutils.c;h=e4bd74f3fa8a1339373edd2701228efe5eb62a42;hb=9f0b6e6827e21e3477abe1199dc2728e30b8c061;hp=b1671a49f5c47258711607a4cafdbcc5365822a4;hpb=f929ab0569ff31ed5a59b0b0adb7ce09df3fca39;p=ffmpeg diff --git a/cmdutils.c b/cmdutils.c index b1671a49f5c..e4bd74f3fa8 100644 --- a/cmdutils.c +++ b/cmdutils.c @@ -45,8 +45,8 @@ #include "libavutil/dict.h" #include "libavutil/opt.h" #include "libavutil/cpu.h" +#include "avversion.h" #include "cmdutils.h" -#include "version.h" #if CONFIG_NETWORK #include "libavformat/network.h" #endif @@ -58,7 +58,7 @@ struct SwsContext *sws_opts; AVDictionary *format_opts, *codec_opts, *resample_opts; -static const int this_year = 2014; +static const int this_year = 2015; void init_opts(void) { @@ -176,7 +176,7 @@ 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 != NULL) { + while (po->name) { if (!strncmp(name, po->name, len) && strlen(po->name) == len) break; po++; @@ -261,10 +261,14 @@ static int write_option(void *optctx, const OptionDef *po, const char *opt, if (po->flags & OPT_SPEC) { SpecifierOpt **so = dst; char *p = strchr(opt, ':'); + char *str; dstcount = (int *)(so + 1); *so = grow_array(*so, sizeof(**so), dstcount, *dstcount + 1); - (*so)[*dstcount - 1].specifier = av_strdup(p ? p + 1 : ""); + str = av_strdup(p ? p + 1 : ""); + if (!str) + return AVERROR(ENOMEM); + (*so)[*dstcount - 1].specifier = str; dst = &(*so)[*dstcount - 1].u; } @@ -272,6 +276,8 @@ static int write_option(void *optctx, const OptionDef *po, const char *opt, char *str; str = av_strdup(arg); av_freep(dst); + if (!str) + return AVERROR(ENOMEM); *(char **)dst = str; } else if (po->flags & OPT_BOOL || po->flags & OPT_INT) { *(int *)dst = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX); @@ -414,7 +420,7 @@ int locate_option(int argc, char **argv, const OptionDef *options, (po->name && !strcmp(optname, po->name))) return i; - if (!po || po->flags & HAS_ARG) + if (!po->name || po->flags & HAS_ARG) i++; } return 0; @@ -718,6 +724,7 @@ int opt_loglevel(void *optctx, const char *opt, const char *arg) { "info" , AV_LOG_INFO }, { "verbose", AV_LOG_VERBOSE }, { "debug" , AV_LOG_DEBUG }, + { "trace" , AV_LOG_TRACE }, }; char *tail; int level; @@ -970,15 +977,46 @@ static void print_codec(const AVCodec *c) printf("%s %s [%s]:\n", encoder ? "Encoder" : "Decoder", c->name, c->long_name ? c->long_name : ""); + printf(" General capabilities: "); + if (c->capabilities & AV_CODEC_CAP_DRAW_HORIZ_BAND) + printf("horizband "); + if (c->capabilities & AV_CODEC_CAP_DR1) + printf("dr1 "); + if (c->capabilities & AV_CODEC_CAP_TRUNCATED) + printf("trunc "); + if (c->capabilities & AV_CODEC_CAP_DELAY) + printf("delay "); + if (c->capabilities & AV_CODEC_CAP_SMALL_LAST_FRAME) + printf("small "); + if (c->capabilities & AV_CODEC_CAP_SUBFRAMES) + printf("subframes "); + if (c->capabilities & AV_CODEC_CAP_EXPERIMENTAL) + printf("exp "); + if (c->capabilities & AV_CODEC_CAP_CHANNEL_CONF) + printf("chconf "); + if (c->capabilities & AV_CODEC_CAP_PARAM_CHANGE) + printf("paramchange "); + if (c->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE) + printf("variable "); + if (c->capabilities & (AV_CODEC_CAP_FRAME_THREADS | + AV_CODEC_CAP_SLICE_THREADS | + AV_CODEC_CAP_AUTO_THREADS)) + printf("threads "); + if (!c->capabilities) + printf("none"); + printf("\n"); + if (c->type == AVMEDIA_TYPE_VIDEO) { printf(" Threading capabilities: "); - switch (c->capabilities & (CODEC_CAP_FRAME_THREADS | - CODEC_CAP_SLICE_THREADS)) { - case CODEC_CAP_FRAME_THREADS | - CODEC_CAP_SLICE_THREADS: printf("frame and slice"); break; - case CODEC_CAP_FRAME_THREADS: printf("frame"); break; - case CODEC_CAP_SLICE_THREADS: printf("slice"); break; - default: printf("no"); break; + switch (c->capabilities & (AV_CODEC_CAP_FRAME_THREADS | + AV_CODEC_CAP_SLICE_THREADS | + AV_CODEC_CAP_AUTO_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; + default: printf("none"); break; } printf("\n"); } @@ -1108,9 +1146,9 @@ static void print_codecs(int encoder) while ((codec = next_codec_for_id(desc->id, codec, encoder))) { printf("%c", get_media_type_char(desc->type)); - printf((codec->capabilities & CODEC_CAP_FRAME_THREADS) ? "F" : "."); - printf((codec->capabilities & CODEC_CAP_SLICE_THREADS) ? "S" : "."); - printf((codec->capabilities & CODEC_CAP_EXPERIMENTAL) ? "X" : "."); + printf((codec->capabilities & AV_CODEC_CAP_FRAME_THREADS) ? "F" : "."); + printf((codec->capabilities & AV_CODEC_CAP_SLICE_THREADS) ? "S" : "."); + printf((codec->capabilities & AV_CODEC_CAP_EXPERIMENTAL) ? "X" : "."); printf(" %-20s %s", codec->name, codec->long_name ? codec->long_name : ""); if (strcmp(codec->name, desc->name)) @@ -1161,12 +1199,14 @@ int show_protocols(void *optctx, const char *opt, const char *arg) int show_filters(void *optctx, const char *opt, const char *arg) { - const AVFilter av_unused(*filter) = NULL; +#if CONFIG_AVFILTER + const AVFilter *filter = NULL; printf("Filters:\n"); -#if CONFIG_AVFILTER while ((filter = avfilter_next(filter))) printf("%-16s %s\n", filter->name, filter->description); +#else + printf("No filters available: libavfilter disabled\n"); #endif return 0; } @@ -1348,6 +1388,8 @@ int show_help(void *optctx, const char *opt, const char *arg) av_log_set_callback(log_callback_help); topic = av_strdup(arg ? arg : ""); + if (!topic) + return AVERROR(ENOMEM); par = strchr(topic, '='); if (par) *par++ = 0; @@ -1385,43 +1427,6 @@ int read_yesno(void) return yesno; } -int cmdutils_read_file(const char *filename, char **bufptr, size_t *size) -{ - int ret; - FILE *f = fopen(filename, "rb"); - - if (!f) { - av_log(NULL, AV_LOG_ERROR, "Cannot read file '%s': %s\n", filename, - strerror(errno)); - return AVERROR(errno); - } - fseek(f, 0, SEEK_END); - *size = ftell(f); - fseek(f, 0, SEEK_SET); - *bufptr = av_malloc(*size + 1); - if (!*bufptr) { - av_log(NULL, AV_LOG_ERROR, "Could not allocate file buffer\n"); - fclose(f); - return AVERROR(ENOMEM); - } - ret = fread(*bufptr, 1, *size, f); - if (ret < *size) { - av_free(*bufptr); - if (ferror(f)) { - av_log(NULL, AV_LOG_ERROR, "Error while reading file '%s': %s\n", - filename, strerror(errno)); - ret = AVERROR(errno); - } else - ret = AVERROR_EOF; - } else { - ret = 0; - (*bufptr)[(*size)++] = '\0'; - } - - fclose(f); - return ret; -} - void init_pts_correction(PtsCorrectionContext *ctx) { ctx->num_faulty_pts = ctx->num_faulty_dts = 0; @@ -1559,6 +1564,28 @@ int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec) av_freep(&key); return ret; + } else if (*spec == 'u') { + AVCodecContext *avctx = st->codec; + int val; + switch (avctx->codec_type) { + case AVMEDIA_TYPE_AUDIO: + val = avctx->sample_rate && avctx->channels; + if (avctx->sample_fmt == AV_SAMPLE_FMT_NONE) + return 0; + break; + case AVMEDIA_TYPE_VIDEO: + val = avctx->width && avctx->height; + if (avctx->pix_fmt == AV_PIX_FMT_NONE) + return 0; + break; + case AVMEDIA_TYPE_UNKNOWN: + val = 0; + break; + default: + val = 1; + break; + } + return avctx->codec_id != AV_CODEC_ID_NONE && val != 0; } else if (!*spec) /* empty specifier, matches everything */ return 1;