mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-01-03 13:32:10 +00:00
fftools/ffplay: make option strings dynamically allocated
Do not store the supplied arg pointer directly. While that is valid for now, it will become ephemeral in the future commits.
This commit is contained in:
parent
4ce1987abc
commit
fcddd233fe
@ -400,7 +400,10 @@ static int opt_add_vfilter(void *optctx, const char *opt, const char *arg)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
vfilters_list[nb_vfilters - 1] = arg;
|
vfilters_list[nb_vfilters - 1] = av_strdup(arg);
|
||||||
|
if (!vfilters_list[nb_vfilters - 1])
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1305,7 +1308,13 @@ static void do_exit(VideoState *is)
|
|||||||
if (window)
|
if (window)
|
||||||
SDL_DestroyWindow(window);
|
SDL_DestroyWindow(window);
|
||||||
uninit_opts();
|
uninit_opts();
|
||||||
|
for (int i = 0; i < nb_vfilters; i++)
|
||||||
|
av_freep(&vfilters_list[i]);
|
||||||
av_freep(&vfilters_list);
|
av_freep(&vfilters_list);
|
||||||
|
av_freep(&video_codec_name);
|
||||||
|
av_freep(&audio_codec_name);
|
||||||
|
av_freep(&subtitle_codec_name);
|
||||||
|
av_freep(&input_filename);
|
||||||
avformat_network_deinit();
|
avformat_network_deinit();
|
||||||
if (show_status)
|
if (show_status)
|
||||||
printf("\n");
|
printf("\n");
|
||||||
@ -3595,7 +3604,9 @@ static int opt_input_file(void *optctx, const char *filename)
|
|||||||
}
|
}
|
||||||
if (!strcmp(filename, "-"))
|
if (!strcmp(filename, "-"))
|
||||||
filename = "fd:";
|
filename = "fd:";
|
||||||
input_filename = filename;
|
input_filename = av_strdup(filename);
|
||||||
|
if (!input_filename)
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -3603,6 +3614,7 @@ static int opt_input_file(void *optctx, const char *filename)
|
|||||||
static int opt_codec(void *optctx, const char *opt, const char *arg)
|
static int opt_codec(void *optctx, const char *opt, const char *arg)
|
||||||
{
|
{
|
||||||
const char *spec = strchr(opt, ':');
|
const char *spec = strchr(opt, ':');
|
||||||
|
const char **name;
|
||||||
if (!spec) {
|
if (!spec) {
|
||||||
av_log(NULL, AV_LOG_ERROR,
|
av_log(NULL, AV_LOG_ERROR,
|
||||||
"No media specifier was specified in '%s' in option '%s'\n",
|
"No media specifier was specified in '%s' in option '%s'\n",
|
||||||
@ -3610,16 +3622,20 @@ static int opt_codec(void *optctx, const char *opt, const char *arg)
|
|||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
}
|
}
|
||||||
spec++;
|
spec++;
|
||||||
|
|
||||||
switch (spec[0]) {
|
switch (spec[0]) {
|
||||||
case 'a' : audio_codec_name = arg; break;
|
case 'a' : name = &audio_codec_name; break;
|
||||||
case 's' : subtitle_codec_name = arg; break;
|
case 's' : name = &subtitle_codec_name; break;
|
||||||
case 'v' : video_codec_name = arg; break;
|
case 'v' : name = &video_codec_name; break;
|
||||||
default:
|
default:
|
||||||
av_log(NULL, AV_LOG_ERROR,
|
av_log(NULL, AV_LOG_ERROR,
|
||||||
"Invalid media specifier '%s' in option '%s'\n", spec, opt);
|
"Invalid media specifier '%s' in option '%s'\n", spec, opt);
|
||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
|
av_freep(name);
|
||||||
|
*name = av_strdup(arg);
|
||||||
|
return *name ? 0 : AVERROR(ENOMEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dummy;
|
static int dummy;
|
||||||
|
Loading…
Reference in New Issue
Block a user