* [FFmpeg-devel] [PATCH] Long path support for Windows (fixes #8885)
@ 2022-02-13 12:28 nihil-admirari
2022-02-13 14:25 ` Timo Rothenpieler
2022-02-13 19:48 ` nihil-admirari
0 siblings, 2 replies; 8+ messages in thread
From: nihil-admirari @ 2022-02-13 12:28 UTC (permalink / raw)
To: ffmpeg-devel
Long path support is enabled by adding a manifest to all of fftools.
MAX_PATH-sized buffers are replaced with dynamically sized ones.
Signed-off-by: nihil-admirari <50202386+nihil-admirari@users.noreply.github.com>
---
compat/w32dlfcn.h | 58 +++++++++++++++++++++++++++-----
fftools/Makefile | 5 +++
fftools/cmdutils.c | 31 +++++++++++++----
fftools/long_paths_utf8.manifest | 12 +++++++
fftools/long_paths_utf8.rc | 3 ++
libavformat/avisynth.c | 10 +++---
libavutil/wchar_filename.h | 37 ++++++++++++++++++++
7 files changed, 136 insertions(+), 20 deletions(-)
create mode 100644 fftools/long_paths_utf8.manifest
create mode 100644 fftools/long_paths_utf8.rc
diff --git a/compat/w32dlfcn.h b/compat/w32dlfcn.h
index 52a94ef..a36e97c 100644
--- a/compat/w32dlfcn.h
+++ b/compat/w32dlfcn.h
@@ -25,6 +25,30 @@
#if (_WIN32_WINNT < 0x0602) || HAVE_WINRT
#include "libavutil/wchar_filename.h"
#endif
+
+static inline wchar_t *get_module_filename(const HMODULE module)
+{
+ wchar_t *path = NULL;
+ int path_size = 0, path_len = 0;
+
+ do {
+ path_size = path_size ? 1.5 * path_size : MAX_PATH;
+ wchar_t *new_path = av_realloc_array(path, path_size, sizeof *path);
+ if (!new_path) {
+ av_free(path);
+ return NULL;
+ }
+ path = new_path;
+ path_len = GetModuleFileNameW(module, path, path_size);
+ } while (path_len && path_size <= 32768 && path_size <= path_len);
+
+ if (!path_len) {
+ av_free(path);
+ return NULL;
+ }
+ return path;
+}
+
/**
* Safe function used to open dynamic libs. This attempts to improve program security
* by removing the current directory from the dll search path. Only dll's found in the
@@ -38,24 +62,40 @@ static inline HMODULE win32_dlopen(const char *name)
// Need to check if KB2533623 is available
if (!GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "SetDefaultDllDirectories")) {
HMODULE module = NULL;
- wchar_t *path = NULL, *name_w = NULL;
- DWORD pathlen;
+ wchar_t *path = NULL, *new_path = NULL, *name_w = NULL;
+ DWORD pathlen, pathsize, namelen;
if (utf8towchar(name, &name_w))
goto exit;
- path = (wchar_t *)av_calloc(MAX_PATH, sizeof(wchar_t));
+ namelen = wcslen(name_w);
// Try local directory first
- pathlen = GetModuleFileNameW(NULL, path, MAX_PATH);
- pathlen = wcsrchr(path, '\\') - path;
- if (pathlen == 0 || pathlen + wcslen(name_w) + 2 > MAX_PATH)
+ path = get_module_filename(NULL);
+ pathlen = path ? wcsrchr(path, '\\') - path : 0;
+ if (pathlen == 0)
+ goto exit;
+ pathsize = pathlen + namelen + 2;
+ new_path = av_realloc_array(path, pathsize, sizeof *path);
+ if (!new_path)
goto exit;
- path[pathlen] = '\\';
+ path = new_path;
wcscpy(path + pathlen + 1, name_w);
module = LoadLibraryExW(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
if (module == NULL) {
// Next try System32 directory
- pathlen = GetSystemDirectoryW(path, MAX_PATH);
- if (pathlen == 0 || pathlen + wcslen(name_w) + 2 > MAX_PATH)
+ pathlen = GetSystemDirectoryW(path, pathsize);
+ if (pathlen == 0)
goto exit;
+ if (pathlen + namelen + 2 > pathsize) {
+ pathsize = pathlen + namelen + 2;
+ new_path = av_realloc_array(path, pathsize, sizeof *path);
+ if (!new_path)
+ goto exit;
+ path = new_path;
+ // The buffer might have been not enough for system directory
+ // in the first place.
+ pathlen = GetSystemDirectoryW(path, pathsize);
+ if (pathlen == 0)
+ goto exit;
+ }
path[pathlen] = '\\';
wcscpy(path + pathlen + 1, name_w);
module = LoadLibraryExW(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
diff --git a/fftools/Makefile b/fftools/Makefile
index da42078..53438b6 100644
--- a/fftools/Makefile
+++ b/fftools/Makefile
@@ -11,6 +11,11 @@ ALLAVPROGS_G = $(AVBASENAMES:%=%$(PROGSSUF)_g$(EXESUF))
OBJS-ffmpeg += fftools/ffmpeg_opt.o fftools/ffmpeg_filter.o fftools/ffmpeg_hw.o
+# Windows resource files
+OBJS-ffmpeg-$(HAVE_GNU_WINDRES) += fftools/long_paths_utf8.o
+OBJS-ffplay-$(HAVE_GNU_WINDRES) += fftools/long_paths_utf8.o
+OBJS-ffprobe-$(HAVE_GNU_WINDRES) += fftools/long_paths_utf8.o
+
define DOFFTOOL
OBJS-$(1) += fftools/cmdutils.o fftools/$(1).o $(OBJS-$(1)-yes)
$(1)$(PROGSSUF)_g$(EXESUF): $$(OBJS-$(1))
diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c
index 4b50e15..ea78897 100644
--- a/fftools/cmdutils.c
+++ b/fftools/cmdutils.c
@@ -62,6 +62,7 @@
#endif
#ifdef _WIN32
#include <windows.h>
+#include "compat/w32dlfcn.h"
#endif
static int init_report(const char *env);
@@ -2065,6 +2066,9 @@ FILE *get_preset_file(char *filename, size_t filename_size,
{
FILE *f = NULL;
int i;
+#if HAVE_GETMODULEHANDLE && defined(_WIN32)
+ char *datadir = NULL;
+#endif
const char *base[3] = { getenv("FFMPEG_DATADIR"),
getenv("HOME"),
FFMPEG_DATADIR, };
@@ -2074,19 +2078,31 @@ FILE *get_preset_file(char *filename, size_t filename_size,
f = fopen(filename, "r");
} else {
#if HAVE_GETMODULEHANDLE && defined(_WIN32)
- char datadir[MAX_PATH], *ls;
+ wchar_t *datadir_w = get_module_filename(NULL);
base[2] = NULL;
- if (GetModuleFileNameA(GetModuleHandleA(NULL), datadir, sizeof(datadir) - 1))
+ if (wchartoansi(datadir_w, &datadir))
+ datadir = NULL;
+ av_free(datadir_w);
+
+ if (datadir)
{
- for (ls = datadir; ls < datadir + strlen(datadir); ls++)
+ char *ls;
+ for (ls = datadir; *ls; ls++)
if (*ls == '\\') *ls = '/';
if (ls = strrchr(datadir, '/'))
{
- *ls = 0;
- strncat(datadir, "/ffpresets", sizeof(datadir) - 1 - strlen(datadir));
- base[2] = datadir;
+ const int datadir_len = ls - datadir;
+ const int desired_size = datadir_len + strlen("/ffpresets") + 1;
+ char *new_datadir = av_realloc_array(
+ datadir, desired_size, sizeof *datadir);
+ if (new_datadir) {
+ datadir = new_datadir;
+ datadir[datadir_len] = 0;
+ strncat(datadir, "/ffpresets", desired_size - 1 - datadir_len);
+ base[2] = datadir;
+ }
}
}
#endif
@@ -2106,6 +2122,9 @@ FILE *get_preset_file(char *filename, size_t filename_size,
}
}
+#if HAVE_GETMODULEHANDLE && defined(_WIN32)
+ av_free(datadir);
+#endif
return f;
}
diff --git a/fftools/long_paths_utf8.manifest b/fftools/long_paths_utf8.manifest
new file mode 100644
index 0000000..d1ac1e4
--- /dev/null
+++ b/fftools/long_paths_utf8.manifest
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+ <assemblyIdentity type="win32" name="FFmpeg" version="1.0.0.0"/>
+ <application xmlns="urn:schemas-microsoft-com:asm.v3">
+ <windowsSettings xmlns:ws2016="http://schemas.microsoft.com/SMI/2016/WindowsSettings"
+ xmlns:ws2019="http://schemas.microsoft.com/SMI/2019/WindowsSettings">
+ <ws2016:longPathAware>true</ws2016:longPathAware>
+ <ws2019:activeCodePage>UTF-8</ws2019:activeCodePage>
+ </windowsSettings>
+ </application>
+</assembly>
diff --git a/fftools/long_paths_utf8.rc b/fftools/long_paths_utf8.rc
new file mode 100644
index 0000000..f33de76
--- /dev/null
+++ b/fftools/long_paths_utf8.rc
@@ -0,0 +1,3 @@
+#include <windows.h>
+
+CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "long_paths_utf8.manifest"
diff --git a/libavformat/avisynth.c b/libavformat/avisynth.c
index 350ac6d..3738cb1 100644
--- a/libavformat/avisynth.c
+++ b/libavformat/avisynth.c
@@ -34,6 +34,7 @@
/* Platform-specific directives. */
#ifdef _WIN32
#include "compat/w32dlfcn.h"
+ #include "libavutil/wchar_filename.h"
#undef EXTERN_C
#define AVISYNTH_LIB "avisynth"
#else
@@ -572,8 +573,7 @@ static int avisynth_open_file(AVFormatContext *s)
AVS_Value arg, val;
int ret;
#ifdef _WIN32
- char filename_ansi[MAX_PATH * 4];
- wchar_t filename_wc[MAX_PATH * 4];
+ char *filename_ansi = NULL;
#endif
if (ret = avisynth_context_create(s))
@@ -581,10 +581,10 @@ static int avisynth_open_file(AVFormatContext *s)
#ifdef _WIN32
/* Convert UTF-8 to ANSI code page */
- MultiByteToWideChar(CP_UTF8, 0, s->url, -1, filename_wc, MAX_PATH * 4);
- WideCharToMultiByte(CP_THREAD_ACP, 0, filename_wc, -1, filename_ansi,
- MAX_PATH * 4, NULL, NULL);
+ if (utf8toansi(s->url, &filename_ansi))
+ goto fail;
arg = avs_new_value_string(filename_ansi);
+ av_free(filename_ansi);
#else
arg = avs_new_value_string(s->url);
#endif
diff --git a/libavutil/wchar_filename.h b/libavutil/wchar_filename.h
index 90f0824..32260a4 100644
--- a/libavutil/wchar_filename.h
+++ b/libavutil/wchar_filename.h
@@ -40,6 +40,43 @@ static inline int utf8towchar(const char *filename_utf8, wchar_t **filename_w)
MultiByteToWideChar(CP_UTF8, 0, filename_utf8, -1, *filename_w, num_chars);
return 0;
}
+
+av_warn_unused_result
+static inline int wchartoansi(const wchar_t *filename_w, char **filename)
+{
+ const int num_chars = WideCharToMultiByte(CP_THREAD_ACP, 0, filename_w, -1,
+ NULL, 0, NULL, NULL);
+ if (num_chars <= 0) {
+ *filename = NULL;
+ return 0;
+ }
+ *filename = (char *)av_calloc(num_chars, sizeof(char));
+ if (!*filename) {
+ errno = ENOMEM;
+ return -1;
+ }
+ WideCharToMultiByte(CP_THREAD_ACP, 0, filename_w, -1,
+ *filename, num_chars, NULL, NULL);
+ return 0;
+}
+
+av_warn_unused_result
+static inline int utf8toansi(const char *filename_utf8, char **filename)
+{
+ wchar_t *filename_w = NULL;
+ int ret = -1;
+ if (utf8towchar(filename_utf8, &filename_w))
+ return -1;
+
+ if (!filename_w) {
+ *filename = NULL;
+ return 0;
+ }
+
+ ret = wchartoansi(filename_w, filename);
+ av_free(filename_w);
+ return ret;
+}
#endif
#endif /* AVUTIL_WCHAR_FILENAME_H */
--
2.32.0
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [FFmpeg-devel] [PATCH] Long path support for Windows (fixes #8885)
2022-02-13 12:28 [FFmpeg-devel] [PATCH] Long path support for Windows (fixes #8885) nihil-admirari
@ 2022-02-13 14:25 ` Timo Rothenpieler
2022-02-13 14:33 ` nihil-admirari
2022-02-13 19:48 ` nihil-admirari
1 sibling, 1 reply; 8+ messages in thread
From: Timo Rothenpieler @ 2022-02-13 14:25 UTC (permalink / raw)
To: ffmpeg-devel
[-- Attachment #1.1: Type: text/plain, Size: 59 bytes --]
Does this break compatibility with older Windows-Versions?
[-- Attachment #1.2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4494 bytes --]
[-- Attachment #2: Type: text/plain, Size: 251 bytes --]
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [FFmpeg-devel] [PATCH] Long path support for Windows (fixes #8885)
2022-02-13 14:25 ` Timo Rothenpieler
@ 2022-02-13 14:33 ` nihil-admirari
0 siblings, 0 replies; 8+ messages in thread
From: nihil-admirari @ 2022-02-13 14:33 UTC (permalink / raw)
To: FFmpeg development discussions and patches
It does not.
Feb 13, 2022, 14:25 by timo@rothenpieler.org:
> Does this break compatibility with older Windows-Versions?
>
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [FFmpeg-devel] [PATCH] Long path support for Windows (fixes #8885)
2022-02-13 12:28 [FFmpeg-devel] [PATCH] Long path support for Windows (fixes #8885) nihil-admirari
2022-02-13 14:25 ` Timo Rothenpieler
@ 2022-02-13 19:48 ` nihil-admirari
2022-02-13 19:52 ` nihil-admirari
1 sibling, 1 reply; 8+ messages in thread
From: nihil-admirari @ 2022-02-13 19:48 UTC (permalink / raw)
To: ffmpeg-devel
[-- Attachment #1: Type: text/plain, Size: 200 bytes --]
Previous patch got corrupted with lots of unbreakable spaces C2 A0, so it does not apply: https://patchwork.ffmpeg.org/project/ffmpeg/patch/Mvn2TLP--3-2@tutanota.com/. Let's retry with an attachment.
[-- Attachment #2: 0001-Long-path-support-for-Windows-fixes-8885.patch --]
[-- Type: text/x-patch, Size: 11060 bytes --]
From d328777fe84166c78124dc27708596dd830a99e2 Mon Sep 17 00:00:00 2001
From: nihil-admirari <50202386+nihil-admirari@users.noreply.github.com>
Date: Sun, 13 Feb 2022 13:43:56 +0300
Subject: [PATCH] Long path support for Windows (fixes #8885)
Long path support is enabled by adding a manifest to all of fftools.
MAX_PATH-sized buffers are replaced with dynamically sized ones.
Signed-off-by: nihil-admirari <50202386+nihil-admirari@users.noreply.github.com>
---
compat/w32dlfcn.h | 61 +++++++++++++++++++++++++++-----
fftools/Makefile | 5 +++
fftools/cmdutils.c | 31 ++++++++++++----
fftools/long_paths_utf8.manifest | 12 +++++++
fftools/long_paths_utf8.rc | 3 ++
libavformat/avisynth.c | 10 +++---
libavutil/wchar_filename.h | 37 +++++++++++++++++++
7 files changed, 139 insertions(+), 20 deletions(-)
create mode 100644 fftools/long_paths_utf8.manifest
create mode 100644 fftools/long_paths_utf8.rc
diff --git a/compat/w32dlfcn.h b/compat/w32dlfcn.h
index 52a94ef..ba2330a 100644
--- a/compat/w32dlfcn.h
+++ b/compat/w32dlfcn.h
@@ -25,6 +25,30 @@
#if (_WIN32_WINNT < 0x0602) || HAVE_WINRT
#include "libavutil/wchar_filename.h"
#endif
+
+static inline wchar_t *get_module_filename(const HMODULE module)
+{
+ wchar_t *path = NULL;
+ int path_size = 0, path_len = 0;
+
+ do {
+ path_size = path_size ? 1.5 * path_size : MAX_PATH;
+ wchar_t *new_path = av_realloc_array(path, path_size, sizeof *path);
+ if (!new_path) {
+ av_free(path);
+ return NULL;
+ }
+ path = new_path;
+ path_len = GetModuleFileNameW(module, path, path_size);
+ } while (path_len && path_size <= 32768 && path_size <= path_len);
+
+ if (!path_len) {
+ av_free(path);
+ return NULL;
+ }
+ return path;
+}
+
/**
* Safe function used to open dynamic libs. This attempts to improve program security
* by removing the current directory from the dll search path. Only dll's found in the
@@ -38,24 +62,43 @@ static inline HMODULE win32_dlopen(const char *name)
// Need to check if KB2533623 is available
if (!GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "SetDefaultDllDirectories")) {
HMODULE module = NULL;
- wchar_t *path = NULL, *name_w = NULL;
- DWORD pathlen;
+ wchar_t *path = NULL, *new_path = NULL, *name_w = NULL;
+ DWORD pathlen, pathsize, namelen;
if (utf8towchar(name, &name_w))
goto exit;
- path = (wchar_t *)av_calloc(MAX_PATH, sizeof(wchar_t));
+ namelen = wcslen(name_w);
// Try local directory first
- pathlen = GetModuleFileNameW(NULL, path, MAX_PATH);
- pathlen = wcsrchr(path, '\\') - path;
- if (pathlen == 0 || pathlen + wcslen(name_w) + 2 > MAX_PATH)
+ path = get_module_filename(NULL);
+ if (!path)
+ goto exit;
+ new_path = wcsrchr(path, '\\');
+ if (!new_path)
+ goto exit;
+ pathlen = new_path - path;
+ pathsize = pathlen + namelen + 2;
+ new_path = av_realloc_array(path, pathsize, sizeof *path);
+ if (!new_path)
goto exit;
- path[pathlen] = '\\';
+ path = new_path;
wcscpy(path + pathlen + 1, name_w);
module = LoadLibraryExW(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
if (module == NULL) {
// Next try System32 directory
- pathlen = GetSystemDirectoryW(path, MAX_PATH);
- if (pathlen == 0 || pathlen + wcslen(name_w) + 2 > MAX_PATH)
+ pathlen = GetSystemDirectoryW(path, pathsize);
+ if (!pathlen)
goto exit;
+ if (pathlen + namelen + 2 > pathsize) {
+ pathsize = pathlen + namelen + 2;
+ new_path = av_realloc_array(path, pathsize, sizeof *path);
+ if (!new_path)
+ goto exit;
+ path = new_path;
+ // The buffer might have been not enough for system directory
+ // in the first place.
+ pathlen = GetSystemDirectoryW(path, pathsize);
+ if (!pathlen)
+ goto exit;
+ }
path[pathlen] = '\\';
wcscpy(path + pathlen + 1, name_w);
module = LoadLibraryExW(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
diff --git a/fftools/Makefile b/fftools/Makefile
index da42078..53438b6 100644
--- a/fftools/Makefile
+++ b/fftools/Makefile
@@ -11,6 +11,11 @@ ALLAVPROGS_G = $(AVBASENAMES:%=%$(PROGSSUF)_g$(EXESUF))
OBJS-ffmpeg += fftools/ffmpeg_opt.o fftools/ffmpeg_filter.o fftools/ffmpeg_hw.o
+# Windows resource files
+OBJS-ffmpeg-$(HAVE_GNU_WINDRES) += fftools/long_paths_utf8.o
+OBJS-ffplay-$(HAVE_GNU_WINDRES) += fftools/long_paths_utf8.o
+OBJS-ffprobe-$(HAVE_GNU_WINDRES) += fftools/long_paths_utf8.o
+
define DOFFTOOL
OBJS-$(1) += fftools/cmdutils.o fftools/$(1).o $(OBJS-$(1)-yes)
$(1)$(PROGSSUF)_g$(EXESUF): $$(OBJS-$(1))
diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c
index 4b50e15..ea78897 100644
--- a/fftools/cmdutils.c
+++ b/fftools/cmdutils.c
@@ -62,6 +62,7 @@
#endif
#ifdef _WIN32
#include <windows.h>
+#include "compat/w32dlfcn.h"
#endif
static int init_report(const char *env);
@@ -2065,6 +2066,9 @@ FILE *get_preset_file(char *filename, size_t filename_size,
{
FILE *f = NULL;
int i;
+#if HAVE_GETMODULEHANDLE && defined(_WIN32)
+ char *datadir = NULL;
+#endif
const char *base[3] = { getenv("FFMPEG_DATADIR"),
getenv("HOME"),
FFMPEG_DATADIR, };
@@ -2074,19 +2078,31 @@ FILE *get_preset_file(char *filename, size_t filename_size,
f = fopen(filename, "r");
} else {
#if HAVE_GETMODULEHANDLE && defined(_WIN32)
- char datadir[MAX_PATH], *ls;
+ wchar_t *datadir_w = get_module_filename(NULL);
base[2] = NULL;
- if (GetModuleFileNameA(GetModuleHandleA(NULL), datadir, sizeof(datadir) - 1))
+ if (wchartoansi(datadir_w, &datadir))
+ datadir = NULL;
+ av_free(datadir_w);
+
+ if (datadir)
{
- for (ls = datadir; ls < datadir + strlen(datadir); ls++)
+ char *ls;
+ for (ls = datadir; *ls; ls++)
if (*ls == '\\') *ls = '/';
if (ls = strrchr(datadir, '/'))
{
- *ls = 0;
- strncat(datadir, "/ffpresets", sizeof(datadir) - 1 - strlen(datadir));
- base[2] = datadir;
+ const int datadir_len = ls - datadir;
+ const int desired_size = datadir_len + strlen("/ffpresets") + 1;
+ char *new_datadir = av_realloc_array(
+ datadir, desired_size, sizeof *datadir);
+ if (new_datadir) {
+ datadir = new_datadir;
+ datadir[datadir_len] = 0;
+ strncat(datadir, "/ffpresets", desired_size - 1 - datadir_len);
+ base[2] = datadir;
+ }
}
}
#endif
@@ -2106,6 +2122,9 @@ FILE *get_preset_file(char *filename, size_t filename_size,
}
}
+#if HAVE_GETMODULEHANDLE && defined(_WIN32)
+ av_free(datadir);
+#endif
return f;
}
diff --git a/fftools/long_paths_utf8.manifest b/fftools/long_paths_utf8.manifest
new file mode 100644
index 0000000..d1ac1e4
--- /dev/null
+++ b/fftools/long_paths_utf8.manifest
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+ <assemblyIdentity type="win32" name="FFmpeg" version="1.0.0.0"/>
+ <application xmlns="urn:schemas-microsoft-com:asm.v3">
+ <windowsSettings xmlns:ws2016="http://schemas.microsoft.com/SMI/2016/WindowsSettings"
+ xmlns:ws2019="http://schemas.microsoft.com/SMI/2019/WindowsSettings">
+ <ws2016:longPathAware>true</ws2016:longPathAware>
+ <ws2019:activeCodePage>UTF-8</ws2019:activeCodePage>
+ </windowsSettings>
+ </application>
+</assembly>
diff --git a/fftools/long_paths_utf8.rc b/fftools/long_paths_utf8.rc
new file mode 100644
index 0000000..f33de76
--- /dev/null
+++ b/fftools/long_paths_utf8.rc
@@ -0,0 +1,3 @@
+#include <windows.h>
+
+CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "long_paths_utf8.manifest"
diff --git a/libavformat/avisynth.c b/libavformat/avisynth.c
index 350ac6d..3738cb1 100644
--- a/libavformat/avisynth.c
+++ b/libavformat/avisynth.c
@@ -34,6 +34,7 @@
/* Platform-specific directives. */
#ifdef _WIN32
#include "compat/w32dlfcn.h"
+ #include "libavutil/wchar_filename.h"
#undef EXTERN_C
#define AVISYNTH_LIB "avisynth"
#else
@@ -572,8 +573,7 @@ static int avisynth_open_file(AVFormatContext *s)
AVS_Value arg, val;
int ret;
#ifdef _WIN32
- char filename_ansi[MAX_PATH * 4];
- wchar_t filename_wc[MAX_PATH * 4];
+ char *filename_ansi = NULL;
#endif
if (ret = avisynth_context_create(s))
@@ -581,10 +581,10 @@ static int avisynth_open_file(AVFormatContext *s)
#ifdef _WIN32
/* Convert UTF-8 to ANSI code page */
- MultiByteToWideChar(CP_UTF8, 0, s->url, -1, filename_wc, MAX_PATH * 4);
- WideCharToMultiByte(CP_THREAD_ACP, 0, filename_wc, -1, filename_ansi,
- MAX_PATH * 4, NULL, NULL);
+ if (utf8toansi(s->url, &filename_ansi))
+ goto fail;
arg = avs_new_value_string(filename_ansi);
+ av_free(filename_ansi);
#else
arg = avs_new_value_string(s->url);
#endif
diff --git a/libavutil/wchar_filename.h b/libavutil/wchar_filename.h
index 90f0824..32260a4 100644
--- a/libavutil/wchar_filename.h
+++ b/libavutil/wchar_filename.h
@@ -40,6 +40,43 @@ static inline int utf8towchar(const char *filename_utf8, wchar_t **filename_w)
MultiByteToWideChar(CP_UTF8, 0, filename_utf8, -1, *filename_w, num_chars);
return 0;
}
+
+av_warn_unused_result
+static inline int wchartoansi(const wchar_t *filename_w, char **filename)
+{
+ const int num_chars = WideCharToMultiByte(CP_THREAD_ACP, 0, filename_w, -1,
+ NULL, 0, NULL, NULL);
+ if (num_chars <= 0) {
+ *filename = NULL;
+ return 0;
+ }
+ *filename = (char *)av_calloc(num_chars, sizeof(char));
+ if (!*filename) {
+ errno = ENOMEM;
+ return -1;
+ }
+ WideCharToMultiByte(CP_THREAD_ACP, 0, filename_w, -1,
+ *filename, num_chars, NULL, NULL);
+ return 0;
+}
+
+av_warn_unused_result
+static inline int utf8toansi(const char *filename_utf8, char **filename)
+{
+ wchar_t *filename_w = NULL;
+ int ret = -1;
+ if (utf8towchar(filename_utf8, &filename_w))
+ return -1;
+
+ if (!filename_w) {
+ *filename = NULL;
+ return 0;
+ }
+
+ ret = wchartoansi(filename_w, filename);
+ av_free(filename_w);
+ return ret;
+}
#endif
#endif /* AVUTIL_WCHAR_FILENAME_H */
--
2.32.0
[-- Attachment #3: Type: text/plain, Size: 251 bytes --]
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [FFmpeg-devel] [PATCH] Long path support for Windows (fixes #8885)
2022-02-13 19:48 ` nihil-admirari
@ 2022-02-13 19:52 ` nihil-admirari
2022-02-13 19:54 ` nihil-admirari
0 siblings, 1 reply; 8+ messages in thread
From: nihil-admirari @ 2022-02-13 19:52 UTC (permalink / raw)
To: ffmpeg-devel
[-- Attachment #1: Type: text/plain, Size: 304 bytes --]
Let's try once again with .diff extension.
Feb 13, 2022, 19:48 by nihil-admirari@tutanota.com:
> Previous patch got corrupted with lots of unbreakable spaces C2 A0, so it does not apply: > https://patchwork.ffmpeg.org/project/ffmpeg/patch/Mvn2TLP--3-2@tutanota.com/> . Let's retry with an attachment.
>
[-- Attachment #2: 0001-Long-path-support-for-Windows-fixes-8885.diff --]
[-- Type: text/x-patch, Size: 11060 bytes --]
From d328777fe84166c78124dc27708596dd830a99e2 Mon Sep 17 00:00:00 2001
From: nihil-admirari <50202386+nihil-admirari@users.noreply.github.com>
Date: Sun, 13 Feb 2022 13:43:56 +0300
Subject: [PATCH] Long path support for Windows (fixes #8885)
Long path support is enabled by adding a manifest to all of fftools.
MAX_PATH-sized buffers are replaced with dynamically sized ones.
Signed-off-by: nihil-admirari <50202386+nihil-admirari@users.noreply.github.com>
---
compat/w32dlfcn.h | 61 +++++++++++++++++++++++++++-----
fftools/Makefile | 5 +++
fftools/cmdutils.c | 31 ++++++++++++----
fftools/long_paths_utf8.manifest | 12 +++++++
fftools/long_paths_utf8.rc | 3 ++
libavformat/avisynth.c | 10 +++---
libavutil/wchar_filename.h | 37 +++++++++++++++++++
7 files changed, 139 insertions(+), 20 deletions(-)
create mode 100644 fftools/long_paths_utf8.manifest
create mode 100644 fftools/long_paths_utf8.rc
diff --git a/compat/w32dlfcn.h b/compat/w32dlfcn.h
index 52a94ef..ba2330a 100644
--- a/compat/w32dlfcn.h
+++ b/compat/w32dlfcn.h
@@ -25,6 +25,30 @@
#if (_WIN32_WINNT < 0x0602) || HAVE_WINRT
#include "libavutil/wchar_filename.h"
#endif
+
+static inline wchar_t *get_module_filename(const HMODULE module)
+{
+ wchar_t *path = NULL;
+ int path_size = 0, path_len = 0;
+
+ do {
+ path_size = path_size ? 1.5 * path_size : MAX_PATH;
+ wchar_t *new_path = av_realloc_array(path, path_size, sizeof *path);
+ if (!new_path) {
+ av_free(path);
+ return NULL;
+ }
+ path = new_path;
+ path_len = GetModuleFileNameW(module, path, path_size);
+ } while (path_len && path_size <= 32768 && path_size <= path_len);
+
+ if (!path_len) {
+ av_free(path);
+ return NULL;
+ }
+ return path;
+}
+
/**
* Safe function used to open dynamic libs. This attempts to improve program security
* by removing the current directory from the dll search path. Only dll's found in the
@@ -38,24 +62,43 @@ static inline HMODULE win32_dlopen(const char *name)
// Need to check if KB2533623 is available
if (!GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "SetDefaultDllDirectories")) {
HMODULE module = NULL;
- wchar_t *path = NULL, *name_w = NULL;
- DWORD pathlen;
+ wchar_t *path = NULL, *new_path = NULL, *name_w = NULL;
+ DWORD pathlen, pathsize, namelen;
if (utf8towchar(name, &name_w))
goto exit;
- path = (wchar_t *)av_calloc(MAX_PATH, sizeof(wchar_t));
+ namelen = wcslen(name_w);
// Try local directory first
- pathlen = GetModuleFileNameW(NULL, path, MAX_PATH);
- pathlen = wcsrchr(path, '\\') - path;
- if (pathlen == 0 || pathlen + wcslen(name_w) + 2 > MAX_PATH)
+ path = get_module_filename(NULL);
+ if (!path)
+ goto exit;
+ new_path = wcsrchr(path, '\\');
+ if (!new_path)
+ goto exit;
+ pathlen = new_path - path;
+ pathsize = pathlen + namelen + 2;
+ new_path = av_realloc_array(path, pathsize, sizeof *path);
+ if (!new_path)
goto exit;
- path[pathlen] = '\\';
+ path = new_path;
wcscpy(path + pathlen + 1, name_w);
module = LoadLibraryExW(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
if (module == NULL) {
// Next try System32 directory
- pathlen = GetSystemDirectoryW(path, MAX_PATH);
- if (pathlen == 0 || pathlen + wcslen(name_w) + 2 > MAX_PATH)
+ pathlen = GetSystemDirectoryW(path, pathsize);
+ if (!pathlen)
goto exit;
+ if (pathlen + namelen + 2 > pathsize) {
+ pathsize = pathlen + namelen + 2;
+ new_path = av_realloc_array(path, pathsize, sizeof *path);
+ if (!new_path)
+ goto exit;
+ path = new_path;
+ // The buffer might have been not enough for system directory
+ // in the first place.
+ pathlen = GetSystemDirectoryW(path, pathsize);
+ if (!pathlen)
+ goto exit;
+ }
path[pathlen] = '\\';
wcscpy(path + pathlen + 1, name_w);
module = LoadLibraryExW(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
diff --git a/fftools/Makefile b/fftools/Makefile
index da42078..53438b6 100644
--- a/fftools/Makefile
+++ b/fftools/Makefile
@@ -11,6 +11,11 @@ ALLAVPROGS_G = $(AVBASENAMES:%=%$(PROGSSUF)_g$(EXESUF))
OBJS-ffmpeg += fftools/ffmpeg_opt.o fftools/ffmpeg_filter.o fftools/ffmpeg_hw.o
+# Windows resource files
+OBJS-ffmpeg-$(HAVE_GNU_WINDRES) += fftools/long_paths_utf8.o
+OBJS-ffplay-$(HAVE_GNU_WINDRES) += fftools/long_paths_utf8.o
+OBJS-ffprobe-$(HAVE_GNU_WINDRES) += fftools/long_paths_utf8.o
+
define DOFFTOOL
OBJS-$(1) += fftools/cmdutils.o fftools/$(1).o $(OBJS-$(1)-yes)
$(1)$(PROGSSUF)_g$(EXESUF): $$(OBJS-$(1))
diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c
index 4b50e15..ea78897 100644
--- a/fftools/cmdutils.c
+++ b/fftools/cmdutils.c
@@ -62,6 +62,7 @@
#endif
#ifdef _WIN32
#include <windows.h>
+#include "compat/w32dlfcn.h"
#endif
static int init_report(const char *env);
@@ -2065,6 +2066,9 @@ FILE *get_preset_file(char *filename, size_t filename_size,
{
FILE *f = NULL;
int i;
+#if HAVE_GETMODULEHANDLE && defined(_WIN32)
+ char *datadir = NULL;
+#endif
const char *base[3] = { getenv("FFMPEG_DATADIR"),
getenv("HOME"),
FFMPEG_DATADIR, };
@@ -2074,19 +2078,31 @@ FILE *get_preset_file(char *filename, size_t filename_size,
f = fopen(filename, "r");
} else {
#if HAVE_GETMODULEHANDLE && defined(_WIN32)
- char datadir[MAX_PATH], *ls;
+ wchar_t *datadir_w = get_module_filename(NULL);
base[2] = NULL;
- if (GetModuleFileNameA(GetModuleHandleA(NULL), datadir, sizeof(datadir) - 1))
+ if (wchartoansi(datadir_w, &datadir))
+ datadir = NULL;
+ av_free(datadir_w);
+
+ if (datadir)
{
- for (ls = datadir; ls < datadir + strlen(datadir); ls++)
+ char *ls;
+ for (ls = datadir; *ls; ls++)
if (*ls == '\\') *ls = '/';
if (ls = strrchr(datadir, '/'))
{
- *ls = 0;
- strncat(datadir, "/ffpresets", sizeof(datadir) - 1 - strlen(datadir));
- base[2] = datadir;
+ const int datadir_len = ls - datadir;
+ const int desired_size = datadir_len + strlen("/ffpresets") + 1;
+ char *new_datadir = av_realloc_array(
+ datadir, desired_size, sizeof *datadir);
+ if (new_datadir) {
+ datadir = new_datadir;
+ datadir[datadir_len] = 0;
+ strncat(datadir, "/ffpresets", desired_size - 1 - datadir_len);
+ base[2] = datadir;
+ }
}
}
#endif
@@ -2106,6 +2122,9 @@ FILE *get_preset_file(char *filename, size_t filename_size,
}
}
+#if HAVE_GETMODULEHANDLE && defined(_WIN32)
+ av_free(datadir);
+#endif
return f;
}
diff --git a/fftools/long_paths_utf8.manifest b/fftools/long_paths_utf8.manifest
new file mode 100644
index 0000000..d1ac1e4
--- /dev/null
+++ b/fftools/long_paths_utf8.manifest
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+ <assemblyIdentity type="win32" name="FFmpeg" version="1.0.0.0"/>
+ <application xmlns="urn:schemas-microsoft-com:asm.v3">
+ <windowsSettings xmlns:ws2016="http://schemas.microsoft.com/SMI/2016/WindowsSettings"
+ xmlns:ws2019="http://schemas.microsoft.com/SMI/2019/WindowsSettings">
+ <ws2016:longPathAware>true</ws2016:longPathAware>
+ <ws2019:activeCodePage>UTF-8</ws2019:activeCodePage>
+ </windowsSettings>
+ </application>
+</assembly>
diff --git a/fftools/long_paths_utf8.rc b/fftools/long_paths_utf8.rc
new file mode 100644
index 0000000..f33de76
--- /dev/null
+++ b/fftools/long_paths_utf8.rc
@@ -0,0 +1,3 @@
+#include <windows.h>
+
+CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "long_paths_utf8.manifest"
diff --git a/libavformat/avisynth.c b/libavformat/avisynth.c
index 350ac6d..3738cb1 100644
--- a/libavformat/avisynth.c
+++ b/libavformat/avisynth.c
@@ -34,6 +34,7 @@
/* Platform-specific directives. */
#ifdef _WIN32
#include "compat/w32dlfcn.h"
+ #include "libavutil/wchar_filename.h"
#undef EXTERN_C
#define AVISYNTH_LIB "avisynth"
#else
@@ -572,8 +573,7 @@ static int avisynth_open_file(AVFormatContext *s)
AVS_Value arg, val;
int ret;
#ifdef _WIN32
- char filename_ansi[MAX_PATH * 4];
- wchar_t filename_wc[MAX_PATH * 4];
+ char *filename_ansi = NULL;
#endif
if (ret = avisynth_context_create(s))
@@ -581,10 +581,10 @@ static int avisynth_open_file(AVFormatContext *s)
#ifdef _WIN32
/* Convert UTF-8 to ANSI code page */
- MultiByteToWideChar(CP_UTF8, 0, s->url, -1, filename_wc, MAX_PATH * 4);
- WideCharToMultiByte(CP_THREAD_ACP, 0, filename_wc, -1, filename_ansi,
- MAX_PATH * 4, NULL, NULL);
+ if (utf8toansi(s->url, &filename_ansi))
+ goto fail;
arg = avs_new_value_string(filename_ansi);
+ av_free(filename_ansi);
#else
arg = avs_new_value_string(s->url);
#endif
diff --git a/libavutil/wchar_filename.h b/libavutil/wchar_filename.h
index 90f0824..32260a4 100644
--- a/libavutil/wchar_filename.h
+++ b/libavutil/wchar_filename.h
@@ -40,6 +40,43 @@ static inline int utf8towchar(const char *filename_utf8, wchar_t **filename_w)
MultiByteToWideChar(CP_UTF8, 0, filename_utf8, -1, *filename_w, num_chars);
return 0;
}
+
+av_warn_unused_result
+static inline int wchartoansi(const wchar_t *filename_w, char **filename)
+{
+ const int num_chars = WideCharToMultiByte(CP_THREAD_ACP, 0, filename_w, -1,
+ NULL, 0, NULL, NULL);
+ if (num_chars <= 0) {
+ *filename = NULL;
+ return 0;
+ }
+ *filename = (char *)av_calloc(num_chars, sizeof(char));
+ if (!*filename) {
+ errno = ENOMEM;
+ return -1;
+ }
+ WideCharToMultiByte(CP_THREAD_ACP, 0, filename_w, -1,
+ *filename, num_chars, NULL, NULL);
+ return 0;
+}
+
+av_warn_unused_result
+static inline int utf8toansi(const char *filename_utf8, char **filename)
+{
+ wchar_t *filename_w = NULL;
+ int ret = -1;
+ if (utf8towchar(filename_utf8, &filename_w))
+ return -1;
+
+ if (!filename_w) {
+ *filename = NULL;
+ return 0;
+ }
+
+ ret = wchartoansi(filename_w, filename);
+ av_free(filename_w);
+ return ret;
+}
#endif
#endif /* AVUTIL_WCHAR_FILENAME_H */
--
2.32.0
[-- Attachment #3: Type: text/plain, Size: 251 bytes --]
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [FFmpeg-devel] [PATCH] Long path support for Windows (fixes #8885)
2022-02-13 19:52 ` nihil-admirari
@ 2022-02-13 19:54 ` nihil-admirari
2022-02-13 20:26 ` nihil-admirari
0 siblings, 1 reply; 8+ messages in thread
From: nihil-admirari @ 2022-02-13 19:54 UTC (permalink / raw)
To: ffmpeg-devel
[-- Attachment #1: Type: text/plain, Size: 399 bytes --]
Let's try once again with .txt
Feb 13, 2022, 19:52 by nihil-admirari@tutanota.com:
> Let's try once again with .diff extension.
>
> Feb 13, 2022, 19:48 by nihil-admirari@tutanota.com:
>
>> Previous patch got corrupted with lots of unbreakable spaces C2 A0, so it does not apply: >> https://patchwork.ffmpeg.org/project/ffmpeg/patch/Mvn2TLP--3-2@tutanota.com/>> . Let's retry with an attachment.
>>
[-- Attachment #2: 0001-Long-path-support-for-Windows-fixes-8885.txt --]
[-- Type: text/plain, Size: 11060 bytes --]
From d328777fe84166c78124dc27708596dd830a99e2 Mon Sep 17 00:00:00 2001
From: nihil-admirari <50202386+nihil-admirari@users.noreply.github.com>
Date: Sun, 13 Feb 2022 13:43:56 +0300
Subject: [PATCH] Long path support for Windows (fixes #8885)
Long path support is enabled by adding a manifest to all of fftools.
MAX_PATH-sized buffers are replaced with dynamically sized ones.
Signed-off-by: nihil-admirari <50202386+nihil-admirari@users.noreply.github.com>
---
compat/w32dlfcn.h | 61 +++++++++++++++++++++++++++-----
fftools/Makefile | 5 +++
fftools/cmdutils.c | 31 ++++++++++++----
fftools/long_paths_utf8.manifest | 12 +++++++
fftools/long_paths_utf8.rc | 3 ++
libavformat/avisynth.c | 10 +++---
libavutil/wchar_filename.h | 37 +++++++++++++++++++
7 files changed, 139 insertions(+), 20 deletions(-)
create mode 100644 fftools/long_paths_utf8.manifest
create mode 100644 fftools/long_paths_utf8.rc
diff --git a/compat/w32dlfcn.h b/compat/w32dlfcn.h
index 52a94ef..ba2330a 100644
--- a/compat/w32dlfcn.h
+++ b/compat/w32dlfcn.h
@@ -25,6 +25,30 @@
#if (_WIN32_WINNT < 0x0602) || HAVE_WINRT
#include "libavutil/wchar_filename.h"
#endif
+
+static inline wchar_t *get_module_filename(const HMODULE module)
+{
+ wchar_t *path = NULL;
+ int path_size = 0, path_len = 0;
+
+ do {
+ path_size = path_size ? 1.5 * path_size : MAX_PATH;
+ wchar_t *new_path = av_realloc_array(path, path_size, sizeof *path);
+ if (!new_path) {
+ av_free(path);
+ return NULL;
+ }
+ path = new_path;
+ path_len = GetModuleFileNameW(module, path, path_size);
+ } while (path_len && path_size <= 32768 && path_size <= path_len);
+
+ if (!path_len) {
+ av_free(path);
+ return NULL;
+ }
+ return path;
+}
+
/**
* Safe function used to open dynamic libs. This attempts to improve program security
* by removing the current directory from the dll search path. Only dll's found in the
@@ -38,24 +62,43 @@ static inline HMODULE win32_dlopen(const char *name)
// Need to check if KB2533623 is available
if (!GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "SetDefaultDllDirectories")) {
HMODULE module = NULL;
- wchar_t *path = NULL, *name_w = NULL;
- DWORD pathlen;
+ wchar_t *path = NULL, *new_path = NULL, *name_w = NULL;
+ DWORD pathlen, pathsize, namelen;
if (utf8towchar(name, &name_w))
goto exit;
- path = (wchar_t *)av_calloc(MAX_PATH, sizeof(wchar_t));
+ namelen = wcslen(name_w);
// Try local directory first
- pathlen = GetModuleFileNameW(NULL, path, MAX_PATH);
- pathlen = wcsrchr(path, '\\') - path;
- if (pathlen == 0 || pathlen + wcslen(name_w) + 2 > MAX_PATH)
+ path = get_module_filename(NULL);
+ if (!path)
+ goto exit;
+ new_path = wcsrchr(path, '\\');
+ if (!new_path)
+ goto exit;
+ pathlen = new_path - path;
+ pathsize = pathlen + namelen + 2;
+ new_path = av_realloc_array(path, pathsize, sizeof *path);
+ if (!new_path)
goto exit;
- path[pathlen] = '\\';
+ path = new_path;
wcscpy(path + pathlen + 1, name_w);
module = LoadLibraryExW(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
if (module == NULL) {
// Next try System32 directory
- pathlen = GetSystemDirectoryW(path, MAX_PATH);
- if (pathlen == 0 || pathlen + wcslen(name_w) + 2 > MAX_PATH)
+ pathlen = GetSystemDirectoryW(path, pathsize);
+ if (!pathlen)
goto exit;
+ if (pathlen + namelen + 2 > pathsize) {
+ pathsize = pathlen + namelen + 2;
+ new_path = av_realloc_array(path, pathsize, sizeof *path);
+ if (!new_path)
+ goto exit;
+ path = new_path;
+ // The buffer might have been not enough for system directory
+ // in the first place.
+ pathlen = GetSystemDirectoryW(path, pathsize);
+ if (!pathlen)
+ goto exit;
+ }
path[pathlen] = '\\';
wcscpy(path + pathlen + 1, name_w);
module = LoadLibraryExW(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
diff --git a/fftools/Makefile b/fftools/Makefile
index da42078..53438b6 100644
--- a/fftools/Makefile
+++ b/fftools/Makefile
@@ -11,6 +11,11 @@ ALLAVPROGS_G = $(AVBASENAMES:%=%$(PROGSSUF)_g$(EXESUF))
OBJS-ffmpeg += fftools/ffmpeg_opt.o fftools/ffmpeg_filter.o fftools/ffmpeg_hw.o
+# Windows resource files
+OBJS-ffmpeg-$(HAVE_GNU_WINDRES) += fftools/long_paths_utf8.o
+OBJS-ffplay-$(HAVE_GNU_WINDRES) += fftools/long_paths_utf8.o
+OBJS-ffprobe-$(HAVE_GNU_WINDRES) += fftools/long_paths_utf8.o
+
define DOFFTOOL
OBJS-$(1) += fftools/cmdutils.o fftools/$(1).o $(OBJS-$(1)-yes)
$(1)$(PROGSSUF)_g$(EXESUF): $$(OBJS-$(1))
diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c
index 4b50e15..ea78897 100644
--- a/fftools/cmdutils.c
+++ b/fftools/cmdutils.c
@@ -62,6 +62,7 @@
#endif
#ifdef _WIN32
#include <windows.h>
+#include "compat/w32dlfcn.h"
#endif
static int init_report(const char *env);
@@ -2065,6 +2066,9 @@ FILE *get_preset_file(char *filename, size_t filename_size,
{
FILE *f = NULL;
int i;
+#if HAVE_GETMODULEHANDLE && defined(_WIN32)
+ char *datadir = NULL;
+#endif
const char *base[3] = { getenv("FFMPEG_DATADIR"),
getenv("HOME"),
FFMPEG_DATADIR, };
@@ -2074,19 +2078,31 @@ FILE *get_preset_file(char *filename, size_t filename_size,
f = fopen(filename, "r");
} else {
#if HAVE_GETMODULEHANDLE && defined(_WIN32)
- char datadir[MAX_PATH], *ls;
+ wchar_t *datadir_w = get_module_filename(NULL);
base[2] = NULL;
- if (GetModuleFileNameA(GetModuleHandleA(NULL), datadir, sizeof(datadir) - 1))
+ if (wchartoansi(datadir_w, &datadir))
+ datadir = NULL;
+ av_free(datadir_w);
+
+ if (datadir)
{
- for (ls = datadir; ls < datadir + strlen(datadir); ls++)
+ char *ls;
+ for (ls = datadir; *ls; ls++)
if (*ls == '\\') *ls = '/';
if (ls = strrchr(datadir, '/'))
{
- *ls = 0;
- strncat(datadir, "/ffpresets", sizeof(datadir) - 1 - strlen(datadir));
- base[2] = datadir;
+ const int datadir_len = ls - datadir;
+ const int desired_size = datadir_len + strlen("/ffpresets") + 1;
+ char *new_datadir = av_realloc_array(
+ datadir, desired_size, sizeof *datadir);
+ if (new_datadir) {
+ datadir = new_datadir;
+ datadir[datadir_len] = 0;
+ strncat(datadir, "/ffpresets", desired_size - 1 - datadir_len);
+ base[2] = datadir;
+ }
}
}
#endif
@@ -2106,6 +2122,9 @@ FILE *get_preset_file(char *filename, size_t filename_size,
}
}
+#if HAVE_GETMODULEHANDLE && defined(_WIN32)
+ av_free(datadir);
+#endif
return f;
}
diff --git a/fftools/long_paths_utf8.manifest b/fftools/long_paths_utf8.manifest
new file mode 100644
index 0000000..d1ac1e4
--- /dev/null
+++ b/fftools/long_paths_utf8.manifest
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+ <assemblyIdentity type="win32" name="FFmpeg" version="1.0.0.0"/>
+ <application xmlns="urn:schemas-microsoft-com:asm.v3">
+ <windowsSettings xmlns:ws2016="http://schemas.microsoft.com/SMI/2016/WindowsSettings"
+ xmlns:ws2019="http://schemas.microsoft.com/SMI/2019/WindowsSettings">
+ <ws2016:longPathAware>true</ws2016:longPathAware>
+ <ws2019:activeCodePage>UTF-8</ws2019:activeCodePage>
+ </windowsSettings>
+ </application>
+</assembly>
diff --git a/fftools/long_paths_utf8.rc b/fftools/long_paths_utf8.rc
new file mode 100644
index 0000000..f33de76
--- /dev/null
+++ b/fftools/long_paths_utf8.rc
@@ -0,0 +1,3 @@
+#include <windows.h>
+
+CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "long_paths_utf8.manifest"
diff --git a/libavformat/avisynth.c b/libavformat/avisynth.c
index 350ac6d..3738cb1 100644
--- a/libavformat/avisynth.c
+++ b/libavformat/avisynth.c
@@ -34,6 +34,7 @@
/* Platform-specific directives. */
#ifdef _WIN32
#include "compat/w32dlfcn.h"
+ #include "libavutil/wchar_filename.h"
#undef EXTERN_C
#define AVISYNTH_LIB "avisynth"
#else
@@ -572,8 +573,7 @@ static int avisynth_open_file(AVFormatContext *s)
AVS_Value arg, val;
int ret;
#ifdef _WIN32
- char filename_ansi[MAX_PATH * 4];
- wchar_t filename_wc[MAX_PATH * 4];
+ char *filename_ansi = NULL;
#endif
if (ret = avisynth_context_create(s))
@@ -581,10 +581,10 @@ static int avisynth_open_file(AVFormatContext *s)
#ifdef _WIN32
/* Convert UTF-8 to ANSI code page */
- MultiByteToWideChar(CP_UTF8, 0, s->url, -1, filename_wc, MAX_PATH * 4);
- WideCharToMultiByte(CP_THREAD_ACP, 0, filename_wc, -1, filename_ansi,
- MAX_PATH * 4, NULL, NULL);
+ if (utf8toansi(s->url, &filename_ansi))
+ goto fail;
arg = avs_new_value_string(filename_ansi);
+ av_free(filename_ansi);
#else
arg = avs_new_value_string(s->url);
#endif
diff --git a/libavutil/wchar_filename.h b/libavutil/wchar_filename.h
index 90f0824..32260a4 100644
--- a/libavutil/wchar_filename.h
+++ b/libavutil/wchar_filename.h
@@ -40,6 +40,43 @@ static inline int utf8towchar(const char *filename_utf8, wchar_t **filename_w)
MultiByteToWideChar(CP_UTF8, 0, filename_utf8, -1, *filename_w, num_chars);
return 0;
}
+
+av_warn_unused_result
+static inline int wchartoansi(const wchar_t *filename_w, char **filename)
+{
+ const int num_chars = WideCharToMultiByte(CP_THREAD_ACP, 0, filename_w, -1,
+ NULL, 0, NULL, NULL);
+ if (num_chars <= 0) {
+ *filename = NULL;
+ return 0;
+ }
+ *filename = (char *)av_calloc(num_chars, sizeof(char));
+ if (!*filename) {
+ errno = ENOMEM;
+ return -1;
+ }
+ WideCharToMultiByte(CP_THREAD_ACP, 0, filename_w, -1,
+ *filename, num_chars, NULL, NULL);
+ return 0;
+}
+
+av_warn_unused_result
+static inline int utf8toansi(const char *filename_utf8, char **filename)
+{
+ wchar_t *filename_w = NULL;
+ int ret = -1;
+ if (utf8towchar(filename_utf8, &filename_w))
+ return -1;
+
+ if (!filename_w) {
+ *filename = NULL;
+ return 0;
+ }
+
+ ret = wchartoansi(filename_w, filename);
+ av_free(filename_w);
+ return ret;
+}
#endif
#endif /* AVUTIL_WCHAR_FILENAME_H */
--
2.32.0
[-- Attachment #3: Type: text/plain, Size: 251 bytes --]
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [FFmpeg-devel] [PATCH] Long path support for Windows (fixes #8885)
2022-02-13 19:54 ` nihil-admirari
@ 2022-02-13 20:26 ` nihil-admirari
2022-02-14 4:19 ` Gyan Doshi
0 siblings, 1 reply; 8+ messages in thread
From: nihil-admirari @ 2022-02-13 20:26 UTC (permalink / raw)
To: ffmpeg-devel
[-- Attachment #1: Type: text/plain, Size: 483 bytes --]
BASE64 encoded.
Feb 13, 2022, 19:54 by nihil-admirari@tutanota.com:
> Let's try once again with .txt
>
> Feb 13, 2022, 19:52 by nihil-admirari@tutanota.com:
>
>> Let's try once again with .diff extension.
>>
>> Feb 13, 2022, 19:48 by nihil-admirari@tutanota.com:
>>
>>> Previous patch got corrupted with lots of unbreakable spaces C2 A0, so it does not apply: >>> https://patchwork.ffmpeg.org/project/ffmpeg/patch/Mvn2TLP--3-2@tutanota.com/>>> . Let's retry with an attachment.
>>>
[-- Attachment #2: 0001-Long-path-support-for-Windows-fixes-8885.patch --]
[-- Type: text/x-patch, Size: 14943 bytes --]
RnJvbSBkMzI4Nzc3ZmU4NDE2NmM3ODEyNGRjMjc3MDg1OTZkZDgzMGE5OWUyIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBuaWhpbC1hZG1pcmFyaSA8NTAyMDIzODYrbmloaWwtYWRtaXJh
cmlAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgpEYXRlOiBTdW4sIDEzIEZlYiAyMDIyIDEzOjQz
OjU2ICswMzAwClN1YmplY3Q6IFtQQVRDSF0gTG9uZyBwYXRoIHN1cHBvcnQgZm9yIFdpbmRvd3Mg
KGZpeGVzICM4ODg1KQoKTG9uZyBwYXRoIHN1cHBvcnQgaXMgZW5hYmxlZCBieSBhZGRpbmcgYSBt
YW5pZmVzdCB0byBhbGwgb2YgZmZ0b29scy4KTUFYX1BBVEgtc2l6ZWQgYnVmZmVycyBhcmUgcmVw
bGFjZWQgd2l0aCBkeW5hbWljYWxseSBzaXplZCBvbmVzLgoKU2lnbmVkLW9mZi1ieTogbmloaWwt
YWRtaXJhcmkgPDUwMjAyMzg2K25paGlsLWFkbWlyYXJpQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNv
bT4KLS0tCiBjb21wYXQvdzMyZGxmY24uaCAgICAgICAgICAgICAgICB8IDYxICsrKysrKysrKysr
KysrKysrKysrKysrKysrKy0tLS0tCiBmZnRvb2xzL01ha2VmaWxlICAgICAgICAgICAgICAgICB8
ICA1ICsrKwogZmZ0b29scy9jbWR1dGlscy5jICAgICAgICAgICAgICAgfCAzMSArKysrKysrKysr
KystLS0tCiBmZnRvb2xzL2xvbmdfcGF0aHNfdXRmOC5tYW5pZmVzdCB8IDEyICsrKysrKysKIGZm
dG9vbHMvbG9uZ19wYXRoc191dGY4LnJjICAgICAgIHwgIDMgKysKIGxpYmF2Zm9ybWF0L2F2aXN5
bnRoLmMgICAgICAgICAgIHwgMTAgKysrLS0tCiBsaWJhdnV0aWwvd2NoYXJfZmlsZW5hbWUuaCAg
ICAgICB8IDM3ICsrKysrKysrKysrKysrKysrKysKIDcgZmlsZXMgY2hhbmdlZCwgMTM5IGluc2Vy
dGlvbnMoKyksIDIwIGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGZmdG9vbHMvbG9u
Z19wYXRoc191dGY4Lm1hbmlmZXN0CiBjcmVhdGUgbW9kZSAxMDA2NDQgZmZ0b29scy9sb25nX3Bh
dGhzX3V0ZjgucmMKCmRpZmYgLS1naXQgYS9jb21wYXQvdzMyZGxmY24uaCBiL2NvbXBhdC93MzJk
bGZjbi5oCmluZGV4IDUyYTk0ZWYuLmJhMjMzMGEgMTAwNjQ0Ci0tLSBhL2NvbXBhdC93MzJkbGZj
bi5oCisrKyBiL2NvbXBhdC93MzJkbGZjbi5oCkBAIC0yNSw2ICsyNSwzMCBAQAogI2lmIChfV0lO
MzJfV0lOTlQgPCAweDA2MDIpIHx8IEhBVkVfV0lOUlQKICNpbmNsdWRlICJsaWJhdnV0aWwvd2No
YXJfZmlsZW5hbWUuaCIKICNlbmRpZgorCitzdGF0aWMgaW5saW5lIHdjaGFyX3QgKmdldF9tb2R1
bGVfZmlsZW5hbWUoY29uc3QgSE1PRFVMRSBtb2R1bGUpCit7CisgICAgd2NoYXJfdCAqcGF0aCA9
IE5VTEw7CisgICAgaW50IHBhdGhfc2l6ZSA9IDAsIHBhdGhfbGVuID0gMDsKKworICAgIGRvIHsK
KyAgICAgICAgcGF0aF9zaXplID0gcGF0aF9zaXplID8gMS41ICogcGF0aF9zaXplIDogTUFYX1BB
VEg7CisgICAgICAgIHdjaGFyX3QgKm5ld19wYXRoID0gYXZfcmVhbGxvY19hcnJheShwYXRoLCBw
YXRoX3NpemUsIHNpemVvZiAqcGF0aCk7CisgICAgICAgIGlmICghbmV3X3BhdGgpIHsKKyAgICAg
ICAgICAgIGF2X2ZyZWUocGF0aCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAg
fQorICAgICAgICBwYXRoID0gbmV3X3BhdGg7CisgICAgICAgIHBhdGhfbGVuID0gR2V0TW9kdWxl
RmlsZU5hbWVXKG1vZHVsZSwgcGF0aCwgcGF0aF9zaXplKTsKKyAgICB9IHdoaWxlIChwYXRoX2xl
biAmJiBwYXRoX3NpemUgPD0gMzI3NjggJiYgcGF0aF9zaXplIDw9IHBhdGhfbGVuKTsKKworICAg
IGlmICghcGF0aF9sZW4pIHsKKyAgICAgICAgYXZfZnJlZShwYXRoKTsKKyAgICAgICAgcmV0dXJu
IE5VTEw7CisgICAgfQorICAgIHJldHVybiBwYXRoOworfQorCiAvKioKICAqIFNhZmUgZnVuY3Rp
b24gdXNlZCB0byBvcGVuIGR5bmFtaWMgbGlicy4gVGhpcyBhdHRlbXB0cyB0byBpbXByb3ZlIHBy
b2dyYW0gc2VjdXJpdHkKICAqIGJ5IHJlbW92aW5nIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBmcm9t
IHRoZSBkbGwgc2VhcmNoIHBhdGguIE9ubHkgZGxsJ3MgZm91bmQgaW4gdGhlCkBAIC0zOCwyNCAr
NjIsNDMgQEAgc3RhdGljIGlubGluZSBITU9EVUxFIHdpbjMyX2Rsb3Blbihjb25zdCBjaGFyICpu
YW1lKQogICAgIC8vIE5lZWQgdG8gY2hlY2sgaWYgS0IyNTMzNjIzIGlzIGF2YWlsYWJsZQogICAg
IGlmICghR2V0UHJvY0FkZHJlc3MoR2V0TW9kdWxlSGFuZGxlVyhMImtlcm5lbDMyLmRsbCIpLCAi
U2V0RGVmYXVsdERsbERpcmVjdG9yaWVzIikpIHsKICAgICAgICAgSE1PRFVMRSBtb2R1bGUgPSBO
VUxMOwotICAgICAgICB3Y2hhcl90ICpwYXRoID0gTlVMTCwgKm5hbWVfdyA9IE5VTEw7Ci0gICAg
ICAgIERXT1JEIHBhdGhsZW47CisgICAgICAgIHdjaGFyX3QgKnBhdGggPSBOVUxMLCAqbmV3X3Bh
dGggPSBOVUxMLCAqbmFtZV93ID0gTlVMTDsKKyAgICAgICAgRFdPUkQgcGF0aGxlbiwgcGF0aHNp
emUsIG5hbWVsZW47CiAgICAgICAgIGlmICh1dGY4dG93Y2hhcihuYW1lLCAmbmFtZV93KSkKICAg
ICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgcGF0aCA9ICh3Y2hhcl90ICopYXZfY2FsbG9j
KE1BWF9QQVRILCBzaXplb2Yod2NoYXJfdCkpOworICAgICAgICBuYW1lbGVuID0gd2NzbGVuKG5h
bWVfdyk7CiAgICAgICAgIC8vIFRyeSBsb2NhbCBkaXJlY3RvcnkgZmlyc3QKLSAgICAgICAgcGF0
aGxlbiA9IEdldE1vZHVsZUZpbGVOYW1lVyhOVUxMLCBwYXRoLCBNQVhfUEFUSCk7Ci0gICAgICAg
IHBhdGhsZW4gPSB3Y3NyY2hyKHBhdGgsICdcXCcpIC0gcGF0aDsKLSAgICAgICAgaWYgKHBhdGhs
ZW4gPT0gMCB8fCBwYXRobGVuICsgd2NzbGVuKG5hbWVfdykgKyAyID4gTUFYX1BBVEgpCisgICAg
ICAgIHBhdGggPSBnZXRfbW9kdWxlX2ZpbGVuYW1lKE5VTEwpOworICAgICAgICBpZiAoIXBhdGgp
CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIG5ld19wYXRoID0gd2NzcmNocihwYXRo
LCAnXFwnKTsKKyAgICAgICAgaWYgKCFuZXdfcGF0aCkKKyAgICAgICAgICAgIGdvdG8gZXhpdDsK
KyAgICAgICAgcGF0aGxlbiA9IG5ld19wYXRoIC0gcGF0aDsKKyAgICAgICAgcGF0aHNpemUgPSBw
YXRobGVuICsgbmFtZWxlbiArIDI7CisgICAgICAgIG5ld19wYXRoID0gYXZfcmVhbGxvY19hcnJh
eShwYXRoLCBwYXRoc2l6ZSwgc2l6ZW9mICpwYXRoKTsKKyAgICAgICAgaWYgKCFuZXdfcGF0aCkK
ICAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgcGF0aFtwYXRobGVuXSA9ICdcXCc7Cisg
ICAgICAgIHBhdGggPSBuZXdfcGF0aDsKICAgICAgICAgd2NzY3B5KHBhdGggKyBwYXRobGVuICsg
MSwgbmFtZV93KTsKICAgICAgICAgbW9kdWxlID0gTG9hZExpYnJhcnlFeFcocGF0aCwgTlVMTCwg
TE9BRF9XSVRIX0FMVEVSRURfU0VBUkNIX1BBVEgpOwogICAgICAgICBpZiAobW9kdWxlID09IE5V
TEwpIHsKICAgICAgICAgICAgIC8vIE5leHQgdHJ5IFN5c3RlbTMyIGRpcmVjdG9yeQotICAgICAg
ICAgICAgcGF0aGxlbiA9IEdldFN5c3RlbURpcmVjdG9yeVcocGF0aCwgTUFYX1BBVEgpOwotICAg
ICAgICAgICAgaWYgKHBhdGhsZW4gPT0gMCB8fCBwYXRobGVuICsgd2NzbGVuKG5hbWVfdykgKyAy
ID4gTUFYX1BBVEgpCisgICAgICAgICAgICBwYXRobGVuID0gR2V0U3lzdGVtRGlyZWN0b3J5Vyhw
YXRoLCBwYXRoc2l6ZSk7CisgICAgICAgICAgICBpZiAoIXBhdGhsZW4pCiAgICAgICAgICAgICAg
ICAgZ290byBleGl0OworICAgICAgICAgICAgaWYgKHBhdGhsZW4gKyBuYW1lbGVuICsgMiA+IHBh
dGhzaXplKSB7CisgICAgICAgICAgICAgICAgcGF0aHNpemUgPSBwYXRobGVuICsgbmFtZWxlbiAr
IDI7CisgICAgICAgICAgICAgICAgbmV3X3BhdGggPSBhdl9yZWFsbG9jX2FycmF5KHBhdGgsIHBh
dGhzaXplLCBzaXplb2YgKnBhdGgpOworICAgICAgICAgICAgICAgIGlmICghbmV3X3BhdGgpCisg
ICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICBwYXRoID0gbmV3
X3BhdGg7CisgICAgICAgICAgICAgICAgLy8gVGhlIGJ1ZmZlciBtaWdodCBoYXZlIGJlZW4gbm90
IGVub3VnaCBmb3Igc3lzdGVtIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgIC8vIGluIHRoZSBm
aXJzdCBwbGFjZS4KKyAgICAgICAgICAgICAgICBwYXRobGVuID0gR2V0U3lzdGVtRGlyZWN0b3J5
VyhwYXRoLCBwYXRoc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCFwYXRobGVuKQorICAgICAg
ICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBwYXRo
W3BhdGhsZW5dID0gJ1xcJzsKICAgICAgICAgICAgIHdjc2NweShwYXRoICsgcGF0aGxlbiArIDEs
IG5hbWVfdyk7CiAgICAgICAgICAgICBtb2R1bGUgPSBMb2FkTGlicmFyeUV4VyhwYXRoLCBOVUxM
LCBMT0FEX1dJVEhfQUxURVJFRF9TRUFSQ0hfUEFUSCk7CmRpZmYgLS1naXQgYS9mZnRvb2xzL01h
a2VmaWxlIGIvZmZ0b29scy9NYWtlZmlsZQppbmRleCBkYTQyMDc4Li41MzQzOGI2IDEwMDY0NAot
LS0gYS9mZnRvb2xzL01ha2VmaWxlCisrKyBiL2ZmdG9vbHMvTWFrZWZpbGUKQEAgLTExLDYgKzEx
LDExIEBAIEFMTEFWUFJPR1NfRyA9ICQoQVZCQVNFTkFNRVM6JT0lJChQUk9HU1NVRilfZyQoRVhF
U1VGKSkKIAogT0JKUy1mZm1wZWcgICAgICAgICAgICAgICAgICAgICAgICArPSBmZnRvb2xzL2Zm
bXBlZ19vcHQubyBmZnRvb2xzL2ZmbXBlZ19maWx0ZXIubyBmZnRvb2xzL2ZmbXBlZ19ody5vCiAK
KyMgV2luZG93cyByZXNvdXJjZSBmaWxlcworT0JKUy1mZm1wZWctJChIQVZFX0dOVV9XSU5EUkVT
KSArPSBmZnRvb2xzL2xvbmdfcGF0aHNfdXRmOC5vCitPQkpTLWZmcGxheS0kKEhBVkVfR05VX1dJ
TkRSRVMpICs9IGZmdG9vbHMvbG9uZ19wYXRoc191dGY4Lm8KK09CSlMtZmZwcm9iZS0kKEhBVkVf
R05VX1dJTkRSRVMpICs9IGZmdG9vbHMvbG9uZ19wYXRoc191dGY4Lm8KKwogZGVmaW5lIERPRkZU
T09MCiBPQkpTLSQoMSkgKz0gZmZ0b29scy9jbWR1dGlscy5vIGZmdG9vbHMvJCgxKS5vICQoT0JK
Uy0kKDEpLXllcykKICQoMSkkKFBST0dTU1VGKV9nJChFWEVTVUYpOiAkJChPQkpTLSQoMSkpCmRp
ZmYgLS1naXQgYS9mZnRvb2xzL2NtZHV0aWxzLmMgYi9mZnRvb2xzL2NtZHV0aWxzLmMKaW5kZXgg
NGI1MGUxNS4uZWE3ODg5NyAxMDA2NDQKLS0tIGEvZmZ0b29scy9jbWR1dGlscy5jCisrKyBiL2Zm
dG9vbHMvY21kdXRpbHMuYwpAQCAtNjIsNiArNjIsNyBAQAogI2VuZGlmCiAjaWZkZWYgX1dJTjMy
CiAjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgImNvbXBhdC93MzJkbGZjbi5oIgogI2Vu
ZGlmCiAKIHN0YXRpYyBpbnQgaW5pdF9yZXBvcnQoY29uc3QgY2hhciAqZW52KTsKQEAgLTIwNjUs
NiArMjA2Niw5IEBAIEZJTEUgKmdldF9wcmVzZXRfZmlsZShjaGFyICpmaWxlbmFtZSwgc2l6ZV90
IGZpbGVuYW1lX3NpemUsCiB7CiAgICAgRklMRSAqZiA9IE5VTEw7CiAgICAgaW50IGk7CisjaWYg
SEFWRV9HRVRNT0RVTEVIQU5ETEUgJiYgZGVmaW5lZChfV0lOMzIpCisgICAgY2hhciAqZGF0YWRp
ciA9IE5VTEw7CisjZW5kaWYKICAgICBjb25zdCBjaGFyICpiYXNlWzNdID0geyBnZXRlbnYoIkZG
TVBFR19EQVRBRElSIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0ZW52KCJIT01F
IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNUEVHX0RBVEFESVIsIH07CkBAIC0y
MDc0LDE5ICsyMDc4LDMxIEBAIEZJTEUgKmdldF9wcmVzZXRfZmlsZShjaGFyICpmaWxlbmFtZSwg
c2l6ZV90IGZpbGVuYW1lX3NpemUsCiAgICAgICAgIGYgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsK
ICAgICB9IGVsc2UgewogI2lmIEhBVkVfR0VUTU9EVUxFSEFORExFICYmIGRlZmluZWQoX1dJTjMy
KQotICAgICAgICBjaGFyIGRhdGFkaXJbTUFYX1BBVEhdLCAqbHM7CisgICAgICAgIHdjaGFyX3Qg
KmRhdGFkaXJfdyA9IGdldF9tb2R1bGVfZmlsZW5hbWUoTlVMTCk7CiAgICAgICAgIGJhc2VbMl0g
PSBOVUxMOwogCi0gICAgICAgIGlmIChHZXRNb2R1bGVGaWxlTmFtZUEoR2V0TW9kdWxlSGFuZGxl
QShOVUxMKSwgZGF0YWRpciwgc2l6ZW9mKGRhdGFkaXIpIC0gMSkpCisgICAgICAgIGlmICh3Y2hh
cnRvYW5zaShkYXRhZGlyX3csICZkYXRhZGlyKSkKKyAgICAgICAgICAgIGRhdGFkaXIgPSBOVUxM
OworICAgICAgICBhdl9mcmVlKGRhdGFkaXJfdyk7CisKKyAgICAgICAgaWYgKGRhdGFkaXIpCiAg
ICAgICAgIHsKLSAgICAgICAgICAgIGZvciAobHMgPSBkYXRhZGlyOyBscyA8IGRhdGFkaXIgKyBz
dHJsZW4oZGF0YWRpcik7IGxzKyspCisgICAgICAgICAgICBjaGFyICpsczsKKyAgICAgICAgICAg
IGZvciAobHMgPSBkYXRhZGlyOyAqbHM7IGxzKyspCiAgICAgICAgICAgICAgICAgaWYgKCpscyA9
PSAnXFwnKSAqbHMgPSAnLyc7CiAKICAgICAgICAgICAgIGlmIChscyA9IHN0cnJjaHIoZGF0YWRp
ciwgJy8nKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqbHMgPSAwOwotICAgICAg
ICAgICAgICAgIHN0cm5jYXQoZGF0YWRpciwgIi9mZnByZXNldHMiLCAgc2l6ZW9mKGRhdGFkaXIp
IC0gMSAtIHN0cmxlbihkYXRhZGlyKSk7Ci0gICAgICAgICAgICAgICAgYmFzZVsyXSA9IGRhdGFk
aXI7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGRhdGFkaXJfbGVuID0gbHMgLSBkYXRhZGly
OworICAgICAgICAgICAgICAgIGNvbnN0IGludCBkZXNpcmVkX3NpemUgPSBkYXRhZGlyX2xlbiAr
IHN0cmxlbigiL2ZmcHJlc2V0cyIpICsgMTsKKyAgICAgICAgICAgICAgICBjaGFyICpuZXdfZGF0
YWRpciA9IGF2X3JlYWxsb2NfYXJyYXkoCisgICAgICAgICAgICAgICAgICAgIGRhdGFkaXIsIGRl
c2lyZWRfc2l6ZSwgc2l6ZW9mICpkYXRhZGlyKTsKKyAgICAgICAgICAgICAgICBpZiAobmV3X2Rh
dGFkaXIpIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YWRpciA9IG5ld19kYXRhZGlyOworICAg
ICAgICAgICAgICAgICAgICBkYXRhZGlyW2RhdGFkaXJfbGVuXSA9IDA7CisgICAgICAgICAgICAg
ICAgICAgIHN0cm5jYXQoZGF0YWRpciwgIi9mZnByZXNldHMiLCAgZGVzaXJlZF9zaXplIC0gMSAt
IGRhdGFkaXJfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgYmFzZVsyXSA9IGRhdGFkaXI7Cisg
ICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAjZW5kaWYKQEAgLTIx
MDYsNiArMjEyMiw5IEBAIEZJTEUgKmdldF9wcmVzZXRfZmlsZShjaGFyICpmaWxlbmFtZSwgc2l6
ZV90IGZpbGVuYW1lX3NpemUsCiAgICAgICAgIH0KICAgICB9CiAKKyNpZiBIQVZFX0dFVE1PRFVM
RUhBTkRMRSAmJiBkZWZpbmVkKF9XSU4zMikKKyAgICBhdl9mcmVlKGRhdGFkaXIpOworI2VuZGlm
CiAgICAgcmV0dXJuIGY7CiB9CiAKZGlmZiAtLWdpdCBhL2ZmdG9vbHMvbG9uZ19wYXRoc191dGY4
Lm1hbmlmZXN0IGIvZmZ0b29scy9sb25nX3BhdGhzX3V0ZjgubWFuaWZlc3QKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFhYzFlNAotLS0gL2Rldi9udWxsCisrKyBiL2ZmdG9v
bHMvbG9uZ19wYXRoc191dGY4Lm1hbmlmZXN0CkBAIC0wLDAgKzEsMTIgQEAKKzw/eG1sIHZlcnNp
b249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKworPGFzc2VtYmx5
IHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MSIgbWFuaWZlc3RWZXJzaW9u
PSIxLjAiPgorICA8YXNzZW1ibHlJZGVudGl0eSB0eXBlPSJ3aW4zMiIgbmFtZT0iRkZtcGVnIiB2
ZXJzaW9uPSIxLjAuMC4wIi8+CisgIDxhcHBsaWNhdGlvbiB4bWxucz0idXJuOnNjaGVtYXMtbWlj
cm9zb2Z0LWNvbTphc20udjMiPgorICAgIDx3aW5kb3dzU2V0dGluZ3MgeG1sbnM6d3MyMDE2PSJo
dHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL1NNSS8yMDE2L1dpbmRvd3NTZXR0aW5ncyIKKyAg
ICAgICAgICAgICAgICAgICAgIHhtbG5zOndzMjAxOT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0
LmNvbS9TTUkvMjAxOS9XaW5kb3dzU2V0dGluZ3MiPgorICAgICAgPHdzMjAxNjpsb25nUGF0aEF3
YXJlPnRydWU8L3dzMjAxNjpsb25nUGF0aEF3YXJlPgorICAgICAgPHdzMjAxOTphY3RpdmVDb2Rl
UGFnZT5VVEYtODwvd3MyMDE5OmFjdGl2ZUNvZGVQYWdlPgorICAgIDwvd2luZG93c1NldHRpbmdz
PgorICA8L2FwcGxpY2F0aW9uPgorPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL2ZmdG9vbHMvbG9u
Z19wYXRoc191dGY4LnJjIGIvZmZ0b29scy9sb25nX3BhdGhzX3V0ZjgucmMKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzZGU3NgotLS0gL2Rldi9udWxsCisrKyBiL2ZmdG9v
bHMvbG9uZ19wYXRoc191dGY4LnJjCkBAIC0wLDAgKzEsMyBAQAorI2luY2x1ZGUgPHdpbmRvd3Mu
aD4KKworQ1JFQVRFUFJPQ0VTU19NQU5JRkVTVF9SRVNPVVJDRV9JRCBSVF9NQU5JRkVTVCAibG9u
Z19wYXRoc191dGY4Lm1hbmlmZXN0IgpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvYXZpc3ludGgu
YyBiL2xpYmF2Zm9ybWF0L2F2aXN5bnRoLmMKaW5kZXggMzUwYWM2ZC4uMzczOGNiMSAxMDA2NDQK
LS0tIGEvbGliYXZmb3JtYXQvYXZpc3ludGguYworKysgYi9saWJhdmZvcm1hdC9hdmlzeW50aC5j
CkBAIC0zNCw2ICszNCw3IEBACiAvKiBQbGF0Zm9ybS1zcGVjaWZpYyBkaXJlY3RpdmVzLiAqLwog
I2lmZGVmIF9XSU4zMgogICAjaW5jbHVkZSAiY29tcGF0L3czMmRsZmNuLmgiCisgICNpbmNsdWRl
ICJsaWJhdnV0aWwvd2NoYXJfZmlsZW5hbWUuaCIKICAgI3VuZGVmIEVYVEVSTl9DCiAgICNkZWZp
bmUgQVZJU1lOVEhfTElCICJhdmlzeW50aCIKICNlbHNlCkBAIC01NzIsOCArNTczLDcgQEAgc3Rh
dGljIGludCBhdmlzeW50aF9vcGVuX2ZpbGUoQVZGb3JtYXRDb250ZXh0ICpzKQogICAgIEFWU19W
YWx1ZSBhcmcsIHZhbDsKICAgICBpbnQgcmV0OwogI2lmZGVmIF9XSU4zMgotICAgIGNoYXIgZmls
ZW5hbWVfYW5zaVtNQVhfUEFUSCAqIDRdOwotICAgIHdjaGFyX3QgZmlsZW5hbWVfd2NbTUFYX1BB
VEggKiA0XTsKKyAgICBjaGFyICpmaWxlbmFtZV9hbnNpID0gTlVMTDsKICNlbmRpZgogCiAgICAg
aWYgKHJldCA9IGF2aXN5bnRoX2NvbnRleHRfY3JlYXRlKHMpKQpAQCAtNTgxLDEwICs1ODEsMTAg
QEAgc3RhdGljIGludCBhdmlzeW50aF9vcGVuX2ZpbGUoQVZGb3JtYXRDb250ZXh0ICpzKQogCiAj
aWZkZWYgX1dJTjMyCiAgICAgLyogQ29udmVydCBVVEYtOCB0byBBTlNJIGNvZGUgcGFnZSAqLwot
ICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVVRGOCwgMCwgcy0+dXJsLCAtMSwgZmlsZW5hbWVf
d2MsIE1BWF9QQVRIICogNCk7Ci0gICAgV2lkZUNoYXJUb011bHRpQnl0ZShDUF9USFJFQURfQUNQ
LCAwLCBmaWxlbmFtZV93YywgLTEsIGZpbGVuYW1lX2Fuc2ksCi0gICAgICAgICAgICAgICAgICAg
ICAgICBNQVhfUEFUSCAqIDQsIE5VTEwsIE5VTEwpOworICAgIGlmICh1dGY4dG9hbnNpKHMtPnVy
bCwgJmZpbGVuYW1lX2Fuc2kpKQorICAgICAgICBnb3RvIGZhaWw7CiAgICAgYXJnID0gYXZzX25l
d192YWx1ZV9zdHJpbmcoZmlsZW5hbWVfYW5zaSk7CisgICAgYXZfZnJlZShmaWxlbmFtZV9hbnNp
KTsKICNlbHNlCiAgICAgYXJnID0gYXZzX25ld192YWx1ZV9zdHJpbmcocy0+dXJsKTsKICNlbmRp
ZgpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3djaGFyX2ZpbGVuYW1lLmggYi9saWJhdnV0aWwvd2No
YXJfZmlsZW5hbWUuaAppbmRleCA5MGYwODI0Li4zMjI2MGE0IDEwMDY0NAotLS0gYS9saWJhdnV0
aWwvd2NoYXJfZmlsZW5hbWUuaAorKysgYi9saWJhdnV0aWwvd2NoYXJfZmlsZW5hbWUuaApAQCAt
NDAsNiArNDAsNDMgQEAgc3RhdGljIGlubGluZSBpbnQgdXRmOHRvd2NoYXIoY29uc3QgY2hhciAq
ZmlsZW5hbWVfdXRmOCwgd2NoYXJfdCAqKmZpbGVuYW1lX3cpCiAgICAgTXVsdGlCeXRlVG9XaWRl
Q2hhcihDUF9VVEY4LCAwLCBmaWxlbmFtZV91dGY4LCAtMSwgKmZpbGVuYW1lX3csIG51bV9jaGFy
cyk7CiAgICAgcmV0dXJuIDA7CiB9CisKK2F2X3dhcm5fdW51c2VkX3Jlc3VsdAorc3RhdGljIGlu
bGluZSBpbnQgd2NoYXJ0b2Fuc2koY29uc3Qgd2NoYXJfdCAqZmlsZW5hbWVfdywgY2hhciAqKmZp
bGVuYW1lKQoreworICAgIGNvbnN0IGludCBudW1fY2hhcnMgPSBXaWRlQ2hhclRvTXVsdGlCeXRl
KENQX1RIUkVBRF9BQ1AsIDAsIGZpbGVuYW1lX3csIC0xLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIE5VTEwsIE5VTEwpOworICAgIGlmIChu
dW1fY2hhcnMgPD0gMCkgeworICAgICAgICAqZmlsZW5hbWUgPSBOVUxMOworICAgICAgICByZXR1
cm4gMDsKKyAgICB9CisgICAgKmZpbGVuYW1lID0gKGNoYXIgKilhdl9jYWxsb2MobnVtX2NoYXJz
LCBzaXplb2YoY2hhcikpOworICAgIGlmICghKmZpbGVuYW1lKSB7CisgICAgICAgIGVycm5vID0g
RU5PTUVNOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFdpZGVDaGFyVG9NdWx0aUJ5
dGUoQ1BfVEhSRUFEX0FDUCwgMCwgZmlsZW5hbWVfdywgLTEsCisgICAgICAgICAgICAgICAgICAg
ICAgICAqZmlsZW5hbWUsIG51bV9jaGFycywgTlVMTCwgTlVMTCk7CisgICAgcmV0dXJuIDA7Cit9
CisKK2F2X3dhcm5fdW51c2VkX3Jlc3VsdAorc3RhdGljIGlubGluZSBpbnQgdXRmOHRvYW5zaShj
b25zdCBjaGFyICpmaWxlbmFtZV91dGY4LCBjaGFyICoqZmlsZW5hbWUpCit7CisgICAgd2NoYXJf
dCAqZmlsZW5hbWVfdyA9IE5VTEw7CisgICAgaW50IHJldCA9IC0xOworICAgIGlmICh1dGY4dG93
Y2hhcihmaWxlbmFtZV91dGY4LCAmZmlsZW5hbWVfdykpCisgICAgICAgIHJldHVybiAtMTsKKwor
ICAgIGlmICghZmlsZW5hbWVfdykgeworICAgICAgICAqZmlsZW5hbWUgPSBOVUxMOworICAgICAg
ICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXQgPSB3Y2hhcnRvYW5zaShmaWxlbmFtZV93LCBm
aWxlbmFtZSk7CisgICAgYXZfZnJlZShmaWxlbmFtZV93KTsKKyAgICByZXR1cm4gcmV0OworfQog
I2VuZGlmCiAKICNlbmRpZiAvKiBBVlVUSUxfV0NIQVJfRklMRU5BTUVfSCAqLwotLSAKMi4zMi4w
Cgo=
[-- Attachment #3: Type: text/plain, Size: 251 bytes --]
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [FFmpeg-devel] [PATCH] Long path support for Windows (fixes #8885)
2022-02-13 20:26 ` nihil-admirari
@ 2022-02-14 4:19 ` Gyan Doshi
0 siblings, 0 replies; 8+ messages in thread
From: Gyan Doshi @ 2022-02-14 4:19 UTC (permalink / raw)
To: ffmpeg-devel
On 2022-02-14 01:56 am, nihil-admirari@tutanota.com wrote:
> BASE64 encoded.
Rebase against current HEAD and submit via git send-email.
If not possible, export mbox patch using git format-patch,
test with git am locally. Then send as attachment.
Regards,
Gyan
>
> Feb 13, 2022, 19:54 by nihil-admirari@tutanota.com:
>
>> Let's try once again with .txt
>>
>> Feb 13, 2022, 19:52 by nihil-admirari@tutanota.com:
>>
>>> Let's try once again with .diff extension.
>>>
>>> Feb 13, 2022, 19:48 by nihil-admirari@tutanota.com:
>>>
>>>> Previous patch got corrupted with lots of unbreakable spaces C2 A0, so it does not apply: >>> https://patchwork.ffmpeg.org/project/ffmpeg/patch/Mvn2TLP--3-2@tutanota.com/>>> . Let's retry with an attachment.
>>> >
>>>
>>> _______________________________________________
>>> ffmpeg-devel mailing list
>>> ffmpeg-devel@ffmpeg.org
>>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>>
>>> To unsubscribe, visit link above, or email
>>> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2022-02-14 4:20 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-13 12:28 [FFmpeg-devel] [PATCH] Long path support for Windows (fixes #8885) nihil-admirari
2022-02-13 14:25 ` Timo Rothenpieler
2022-02-13 14:33 ` nihil-admirari
2022-02-13 19:48 ` nihil-admirari
2022-02-13 19:52 ` nihil-admirari
2022-02-13 19:54 ` nihil-admirari
2022-02-13 20:26 ` nihil-admirari
2022-02-14 4:19 ` Gyan Doshi
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git