| 922 | } |
| 923 | |
| 924 | FILE *get_preset_file(char *filename, size_t filename_size, |
| 925 | const char *preset_name, int is_path, |
| 926 | const char *codec_name) |
| 927 | { |
| 928 | FILE *f = NULL; |
| 929 | int i; |
| 930 | #if HAVE_GETMODULEHANDLE && defined(_WIN32) |
| 931 | char *datadir = NULL; |
| 932 | #endif |
| 933 | char *env_home = getenv_utf8("HOME"); |
| 934 | char *env_ffmpeg_datadir = getenv_utf8("FFMPEG_DATADIR"); |
| 935 | const char *base[3] = { env_ffmpeg_datadir, |
| 936 | env_home, /* index=1(HOME) is special: search in a .ffmpeg subfolder */ |
| 937 | FFMPEG_DATADIR, }; |
| 938 | |
| 939 | if (is_path) { |
| 940 | av_strlcpy(filename, preset_name, filename_size); |
| 941 | f = fopen_utf8(filename, "r"); |
| 942 | } else { |
| 943 | #if HAVE_GETMODULEHANDLE && defined(_WIN32) |
| 944 | wchar_t *datadir_w = get_module_filename(NULL); |
| 945 | base[2] = NULL; |
| 946 | |
| 947 | if (wchartoutf8(datadir_w, &datadir)) |
| 948 | datadir = NULL; |
| 949 | av_free(datadir_w); |
| 950 | |
| 951 | if (datadir) |
| 952 | { |
| 953 | char *ls; |
| 954 | for (ls = datadir; *ls; ls++) |
| 955 | if (*ls == '\\') *ls = '/'; |
| 956 | |
| 957 | if (ls = strrchr(datadir, '/')) |
| 958 | { |
| 959 | ptrdiff_t datadir_len = ls - datadir; |
| 960 | size_t desired_size = datadir_len + strlen("/ffpresets") + 1; |
| 961 | char *new_datadir = av_realloc_array( |
| 962 | datadir, desired_size, sizeof *datadir); |
| 963 | if (new_datadir) { |
| 964 | datadir = new_datadir; |
| 965 | strcpy(datadir + datadir_len, "/ffpresets"); |
| 966 | base[2] = datadir; |
| 967 | } |
| 968 | } |
| 969 | } |
| 970 | #endif |
| 971 | for (i = 0; i < 3 && !f; i++) { |
| 972 | if (!base[i]) |
| 973 | continue; |
| 974 | snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i], |
| 975 | i != 1 ? "" : "/.ffmpeg", preset_name); |
| 976 | f = fopen_utf8(filename, "r"); |
| 977 | if (!f && codec_name) { |
| 978 | snprintf(filename, filename_size, |
| 979 | "%s%s/%s-%s.ffpreset", |
| 980 | base[i], i != 1 ? "" : "/.ffmpeg", codec_name, |
| 981 | preset_name); |
no test coverage detected