X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=cmdutils.c;h=53268d8a294e96148c915a39b00db598e893b82f;hb=6c3cb02a742f0ce32a85e86738a18e3d6d711d59;hp=4e0a406fde17fe43efafd6c87d76f282d6352825;hpb=bb7ad47ddf94511eece7e243402e2cf95cddf1df;p=ffmpeg diff --git a/cmdutils.c b/cmdutils.c index 4e0a406fde1..53268d8a294 100644 --- a/cmdutils.c +++ b/cmdutils.c @@ -290,10 +290,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; } @@ -301,6 +305,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); @@ -1816,6 +1822,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; @@ -1855,7 +1863,7 @@ int read_yesno(void) int cmdutils_read_file(const char *filename, char **bufptr, size_t *size) { - int ret; + int64_t ret; FILE *f = av_fopen_utf8(filename, "rb"); if (!f) { @@ -1864,20 +1872,31 @@ int cmdutils_read_file(const char *filename, char **bufptr, size_t *size) strerror(errno)); return ret; } - fseek(f, 0, SEEK_END); - *size = ftell(f); - fseek(f, 0, SEEK_SET); - if (*size == (size_t)-1) { + + ret = fseek(f, 0, SEEK_END); + if (ret == -1) { ret = AVERROR(errno); - av_log(NULL, AV_LOG_ERROR, "IO error: %s\n", strerror(errno)); - fclose(f); - return ret; + goto out; } + + ret = ftell(f); + if (ret < 0) { + ret = AVERROR(errno); + goto out; + } + *size = ret; + + ret = fseek(f, 0, SEEK_SET); + if (ret == -1) { + ret = AVERROR(errno); + goto out; + } + *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 = AVERROR(ENOMEM); + goto out; } ret = fread(*bufptr, 1, *size, f); if (ret < *size) { @@ -1893,6 +1912,8 @@ int cmdutils_read_file(const char *filename, char **bufptr, size_t *size) (*bufptr)[(*size)++] = '\0'; } +out: + av_log(NULL, AV_LOG_ERROR, "IO error: %s\n", av_err2str(ret)); fclose(f); return ret; } @@ -2039,7 +2060,7 @@ void *grow_array(void *array, int elem_size, int *size, int new_size) exit_program(1); } if (*size < new_size) { - uint8_t *tmp = av_realloc(array, new_size*elem_size); + uint8_t *tmp = av_realloc_array(array, new_size, elem_size); if (!tmp) { av_log(NULL, AV_LOG_ERROR, "Could not alloc buffer.\n"); exit_program(1); @@ -2055,9 +2076,7 @@ void *grow_array(void *array, int elem_size, int *size, int new_size) static int print_device_sources(AVInputFormat *fmt, AVDictionary *opts) { int ret, i; - AVFormatContext *dev = NULL; AVDeviceInfoList *device_list = NULL; - AVDictionary *tmp_opts = NULL; if (!fmt || !fmt->priv_class || !AV_IS_INPUT_DEVICE(fmt->priv_class->category)) return AVERROR(EINVAL); @@ -2069,15 +2088,7 @@ static int print_device_sources(AVInputFormat *fmt, AVDictionary *opts) goto fail; } - /* TODO: avformat_open_input calls read_header callback which is not necessary. - Function like avformat_alloc_output_context2 for input could be helpful here. */ - av_dict_copy(&tmp_opts, opts, 0); - if ((ret = avformat_open_input(&dev, NULL, fmt, &tmp_opts)) < 0) { - printf("Cannot open device: %s.\n", fmt->name); - goto fail; - } - - if ((ret = avdevice_list_devices(dev, &device_list)) < 0) { + if ((ret = avdevice_list_input_sources(fmt, NULL, opts, &device_list)) < 0) { printf("Cannot list sources.\n"); goto fail; } @@ -2088,18 +2099,14 @@ static int print_device_sources(AVInputFormat *fmt, AVDictionary *opts) } fail: - av_dict_free(&tmp_opts); avdevice_free_list_devices(&device_list); - avformat_close_input(&dev); return ret; } static int print_device_sinks(AVOutputFormat *fmt, AVDictionary *opts) { int ret, i; - AVFormatContext *dev = NULL; AVDeviceInfoList *device_list = NULL; - AVDictionary *tmp_opts = NULL; if (!fmt || !fmt->priv_class || !AV_IS_OUTPUT_DEVICE(fmt->priv_class->category)) return AVERROR(EINVAL); @@ -2111,14 +2118,7 @@ static int print_device_sinks(AVOutputFormat *fmt, AVDictionary *opts) goto fail; } - if ((ret = avformat_alloc_output_context2(&dev, fmt, NULL, NULL)) < 0) { - printf("Cannot open device: %s.\n", fmt->name); - goto fail; - } - av_dict_copy(&tmp_opts, opts, 0); - av_opt_set_dict2(dev, &tmp_opts, AV_OPT_SEARCH_CHILDREN); - - if ((ret = avdevice_list_devices(dev, &device_list)) < 0) { + if ((ret = avdevice_list_output_sinks(fmt, NULL, opts, &device_list)) < 0) { printf("Cannot list sinks.\n"); goto fail; } @@ -2129,9 +2129,7 @@ static int print_device_sinks(AVOutputFormat *fmt, AVDictionary *opts) } fail: - av_dict_free(&tmp_opts); avdevice_free_list_devices(&device_list); - avformat_free_context(dev); return ret; } @@ -2175,7 +2173,7 @@ int show_sources(void *optctx, const char *opt, const char *arg) if (fmt) { if (!strcmp(fmt->name, "lavfi")) continue; //it's pointless to probe lavfi - if (dev && strcmp(fmt->name, dev)) + if (dev && !av_match_name(dev, fmt->name)) continue; print_device_sources(fmt, opts); } @@ -2183,7 +2181,7 @@ int show_sources(void *optctx, const char *opt, const char *arg) do { fmt = av_input_video_device_next(fmt); if (fmt) { - if (dev && strcmp(fmt->name, dev)) + if (dev && !av_match_name(dev, fmt->name)) continue; print_device_sources(fmt, opts); } @@ -2211,7 +2209,7 @@ int show_sinks(void *optctx, const char *opt, const char *arg) do { fmt = av_output_audio_device_next(fmt); if (fmt) { - if (dev && strcmp(fmt->name, dev)) + if (dev && !av_match_name(dev, fmt->name)) continue; print_device_sinks(fmt, opts); } @@ -2219,7 +2217,7 @@ int show_sinks(void *optctx, const char *opt, const char *arg) do { fmt = av_output_video_device_next(fmt); if (fmt) { - if (dev && strcmp(fmt->name, dev)) + if (dev && !av_match_name(dev, fmt->name)) continue; print_device_sinks(fmt, opts); }