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;
}
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);
av_log_set_callback(log_callback_help);
topic = av_strdup(arg ? arg : "");
+ if (!topic)
+ return AVERROR(ENOMEM);
par = strchr(topic, '=');
if (par)
*par++ = 0;
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) {
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) {
(*bufptr)[(*size)++] = '\0';
}
+out:
+ av_log(NULL, AV_LOG_ERROR, "IO error: %s\n", av_err2str(ret));
fclose(f);
return ret;
}
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);
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);
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;
}
}
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);
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;
}
}
fail:
- av_dict_free(&tmp_opts);
avdevice_free_list_devices(&device_list);
- avformat_free_context(dev);
return ret;
}
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);
}
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);
}
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);
}
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);
}