diff --git a/cmdutils.c b/cmdutils.c index 49c6ad574e..681ed4244b 100644 --- a/cmdutils.c +++ b/cmdutils.c @@ -748,6 +748,36 @@ int64_t guess_correct_pts(PtsCorrectionContext *ctx, int64_t reordered_pts, int6 return pts; } +FILE *get_preset_file(char *filename, size_t filename_size, + const char *preset_name, int is_path, const char *codec_name) +{ + FILE *f = NULL; + int i; + const char *base[3]= { getenv("FFMPEG_DATADIR"), + getenv("HOME"), + FFMPEG_DATADIR, + }; + + if (is_path) { + av_strlcpy(filename, preset_name, filename_size); + f = fopen(filename, "r"); + } else { + for (i = 0; i < 3 && !f; i++) { + if (!base[i]) + continue; + snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", preset_name); + f = fopen(filename, "r"); + if (!f && codec_name) { + snprintf(filename, filename_size, + "%s%s/%s-%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", codec_name, preset_name); + f = fopen(filename, "r"); + } + } + } + + return f; +} + #if CONFIG_AVFILTER static int ffsink_init(AVFilterContext *ctx, const char *args, void *opaque) diff --git a/cmdutils.h b/cmdutils.h index b431b2ef99..9fb7845971 100644 --- a/cmdutils.h +++ b/cmdutils.h @@ -261,6 +261,26 @@ void init_pts_correction(PtsCorrectionContext *ctx); */ int64_t guess_correct_pts(PtsCorrectionContext *ctx, int64_t pts, int64_t dts); +/** + * Get a file corresponding to a preset file. + * + * If is_path is non-zero, look for the file in the path preset_name. + * Otherwise search for a file named arg.ffpreset in the directories + * $FFMPEG_DATADIR (if set), $HOME/.ffmpeg, and in the datadir defined + * at configuration time, in that order. If no such file is found and + * codec_name is defined, then search for a file named + * codec_name-preset_name.ffpreset 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, + const char *preset_name, int is_path, const char *codec_name); + #if CONFIG_AVFILTER #include "libavfilter/avfilter.h" diff --git a/ffmpeg.c b/ffmpeg.c index 46121c0a5a..8b1878b0a1 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -4030,32 +4030,11 @@ static int opt_preset(const char *opt, const char *arg) { FILE *f=NULL; char filename[1000], tmp[1000], tmp2[1000], line[1000]; - int i; - const char *base[3]= { getenv("FFMPEG_DATADIR"), - getenv("HOME"), - FFMPEG_DATADIR, - }; - - if (*opt != 'f') { - for(i=0; i<3 && !f; i++){ - if(!base[i]) - continue; - snprintf(filename, sizeof(filename), "%s%s/%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", arg); - f= fopen(filename, "r"); - if(!f){ - char *codec_name= *opt == 'v' ? video_codec_name : - *opt == 'a' ? audio_codec_name : - subtitle_codec_name; - snprintf(filename, sizeof(filename), "%s%s/%s-%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", codec_name, arg); - f= fopen(filename, "r"); - } - } - } else { - av_strlcpy(filename, arg, sizeof(filename)); - f= fopen(filename, "r"); - } + char *codec_name = *opt == 'v' ? video_codec_name : + *opt == 'a' ? audio_codec_name : + subtitle_codec_name; - if(!f){ + if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) { fprintf(stderr, "File for preset '%s' not found\n", arg); ffmpeg_exit(1); } diff --git a/ffserver.c b/ffserver.c index 63bd2677b2..fcc3359a41 100644 --- a/ffserver.c +++ b/ffserver.c @@ -3972,27 +3972,11 @@ static int ffserver_opt_preset(const char *arg, { FILE *f=NULL; char filename[1000], tmp[1000], tmp2[1000], line[1000]; - int i, ret = 0; - const char *base[3]= { getenv("FFMPEG_DATADIR"), - getenv("HOME"), - FFMPEG_DATADIR, - }; - - for(i=0; i<3 && !f; i++){ - if(!base[i]) - continue; - snprintf(filename, sizeof(filename), "%s%s/%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", arg); - f= fopen(filename, "r"); - if(!f){ - AVCodec *codec = avcodec_find_encoder(avctx->codec_id); - if (codec) { - snprintf(filename, sizeof(filename), "%s%s/%s-%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", codec->name, arg); - f= fopen(filename, "r"); - } - } - } + int ret = 0; + AVCodec *codec = avcodec_find_encoder(avctx->codec_id); - if(!f){ + if (!(f = get_preset_file(filename, sizeof(filename), arg, 0, + codec ? codec->name : NULL))) { fprintf(stderr, "File for preset '%s' not found\n", arg); return 1; }