[FFmpeg-devel] [PATCH 1/4] fftools/cmdutils: allow arbitrary length paths for preset files
Marton Balint
cus at passwd.hu
Sat May 17 02:08:58 EEST 2025
Signed-off-by: Marton Balint <cus at passwd.hu>
---
fftools/cmdutils.c | 17 ++++++++++-------
fftools/cmdutils.h | 4 ++--
fftools/ffmpeg_opt.c | 14 +++++++++-----
3 files changed, 21 insertions(+), 14 deletions(-)
diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c
index be21ed2c6c..e516ee6ebd 100644
--- a/fftools/cmdutils.c
+++ b/fftools/cmdutils.c
@@ -920,7 +920,7 @@ int read_yesno(void)
return yesno;
}
-FILE *get_preset_file(char *filename, size_t filename_size,
+FILE *get_preset_file(AVBPrint *filename,
const char *preset_name, int is_path,
const char *codec_name)
{
@@ -936,8 +936,9 @@ FILE *get_preset_file(char *filename, size_t filename_size,
FFMPEG_DATADIR, };
if (is_path) {
- av_strlcpy(filename, preset_name, filename_size);
- f = fopen_utf8(filename, "r");
+ av_bprintf(filename, "%s", preset_name);
+ if (av_bprint_is_complete(filename))
+ f = fopen_utf8(filename->str, "r");
} else {
#if HAVE_GETMODULEHANDLE && defined(_WIN32)
wchar_t *datadir_w = get_module_filename(NULL);
@@ -971,15 +972,17 @@ FILE *get_preset_file(char *filename, size_t filename_size,
for (i = 0; i < 3 && !f; i++) {
if (!base[i])
continue;
- snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i],
+ av_bprint_clear(filename);
+ av_bprintf(filename, "%s%s/%s.ffpreset", base[i],
i != 1 ? "" : "/.ffmpeg", preset_name);
- f = fopen_utf8(filename, "r");
+ f = fopen_utf8(filename->str, "r");
if (!f && codec_name) {
- snprintf(filename, filename_size,
+ av_bprint_clear(filename);
+ av_bprintf(filename,
"%s%s/%s-%s.ffpreset",
base[i], i != 1 ? "" : "/.ffmpeg", codec_name,
preset_name);
- f = fopen_utf8(filename, "r");
+ f = fopen_utf8(filename->str, "r");
}
}
}
diff --git a/fftools/cmdutils.h b/fftools/cmdutils.h
index ad020f893a..216a2bcfe7 100644
--- a/fftools/cmdutils.h
+++ b/fftools/cmdutils.h
@@ -28,6 +28,7 @@
#include "libavcodec/avcodec.h"
#include "libavfilter/avfilter.h"
#include "libavformat/avformat.h"
+#include "libavutil/bprint.h"
#include "libswscale/swscale.h"
#ifdef _WIN32
@@ -495,13 +496,12 @@ int read_yesno(void);
* codec_name-preset_name.avpreset in the above-mentioned directories.
*
* @param filename buffer where the name of the found filename is written
- * @param filename_size size in bytes of the filename buffer
* @param preset_name name of the preset to search
* @param is_path tell if preset_name is a filename path
* @param codec_name name of the codec for which to look for the
* preset, may be NULL
*/
-FILE *get_preset_file(char *filename, size_t filename_size,
+FILE *get_preset_file(AVBPrint *filename,
const char *preset_name, int is_path, const char *codec_name);
/**
diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
index 3d1efe32f9..aafacb8f1c 100644
--- a/fftools/ffmpeg_opt.c
+++ b/fftools/ffmpeg_opt.c
@@ -42,6 +42,7 @@
#include "libavutil/avassert.h"
#include "libavutil/avstring.h"
#include "libavutil/avutil.h"
+#include "libavutil/bprint.h"
#include "libavutil/mathematics.h"
#include "libavutil/mem.h"
#include "libavutil/opt.h"
@@ -1017,13 +1018,15 @@ static int opt_preset(void *optctx, const char *opt, const char *arg)
{
OptionsContext *o = optctx;
FILE *f=NULL;
- char filename[1000], line[1000], tmp_line[1000];
+ char line[1000], tmp_line[1000];
+ AVBPrint filename;
const char *codec_name = NULL;
int ret = 0;
codec_name = opt_match_per_type_str(&o->codec_names, *opt);
+ av_bprint_init(&filename, 0, AV_BPRINT_SIZE_UNLIMITED);
- if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
+ if (!(f = get_preset_file(&filename, arg, *opt == 'f', codec_name))) {
if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
}else
@@ -1039,11 +1042,11 @@ static int opt_preset(void *optctx, const char *opt, const char *arg)
av_strlcpy(tmp_line, line, sizeof(tmp_line));
if (!av_strtok(key, "=", &value) ||
!av_strtok(value, "\r\n", &endptr)) {
- av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
+ av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename.str, line);
ret = AVERROR(EINVAL);
goto fail;
}
- av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
+ av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename.str, key, value);
if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
@@ -1051,7 +1054,7 @@ static int opt_preset(void *optctx, const char *opt, const char *arg)
else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
else if (opt_default_new(o, key, value) < 0) {
av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
- filename, line, key, value);
+ filename.str, line, key, value);
ret = AVERROR(EINVAL);
goto fail;
}
@@ -1059,6 +1062,7 @@ static int opt_preset(void *optctx, const char *opt, const char *arg)
fail:
fclose(f);
+ av_bprint_finalize(&filename, NULL);
return ret;
}
--
2.43.0
More information about the ffmpeg-devel
mailing list