from ffmpeg.c and ffserver.c. Originally committed as revision 25679 to svn://svn.ffmpeg.org/ffmpeg/trunktags/n0.8
| @@ -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) | |||
| @@ -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" | |||
| @@ -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); | |||
| } | |||
| @@ -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; | |||
| } | |||