Skip to content

Commit eeeb7c9

Browse files
authored
fix: open files whose paths contain non-ascii characters (#1424)
1 parent cf4c11d commit eeeb7c9

1 file changed

Lines changed: 90 additions & 4 deletions

File tree

third_party/mediapipe_workaround.diff

Lines changed: 90 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,50 @@
1+
diff --git a/mediapipe/framework/deps/BUILD b/mediapipe/framework/deps/BUILD
2+
index 2dc600ada..953e12127 100644
3+
--- a/mediapipe/framework/deps/BUILD
4+
+++ b/mediapipe/framework/deps/BUILD
5+
@@ -114,6 +114,10 @@ cc_library(
6+
name = "platform_strings",
7+
srcs = ["platform_strings.cc"],
8+
hdrs = ["platform_strings.h"],
9+
+ local_defines = select({
10+
+ "@platforms//os:windows": ["UNICODE"],
11+
+ "//conditions:default": [],
12+
+ }),
13+
visibility = ["//visibility:public"],
14+
)
15+
16+
diff --git a/mediapipe/framework/deps/platform_strings.cc b/mediapipe/framework/deps/platform_strings.cc
17+
index fa8f3c791..e053d549f 100644
18+
--- a/mediapipe/framework/deps/platform_strings.cc
19+
+++ b/mediapipe/framework/deps/platform_strings.cc
20+
@@ -26,21 +26,21 @@ std::string FormatLastError() {
21+
return std::string("(no error reported)");
22+
}
23+
24+
- LPSTR message_buffer = nullptr;
25+
- DWORD size = FormatMessage(
26+
+ LPWSTR message_buffer = nullptr;
27+
+ DWORD size = FormatMessageW(
28+
/*dwFlags=*/(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
29+
FORMAT_MESSAGE_IGNORE_INSERTS),
30+
/*lpSource=*/NULL,
31+
/*dwMessageId=*/message_id,
32+
/*dwLanguageId=*/MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
33+
- /*lpBuffer=*/(LPSTR)&message_buffer,
34+
+ /*lpBuffer=*/reinterpret_cast<LPWSTR>(&message_buffer),
35+
/*nSize=*/0,
36+
/*Arguments=*/NULL);
37+
if (size == 0) {
38+
return "(error while trying to format the error message)";
39+
}
40+
41+
- std::string message(message_buffer, size);
42+
+ std::wstring message(message_buffer, size);
43+
LocalFree(message_buffer);
44+
return NativeToUtf8(message);
45+
}
146
diff --git a/mediapipe/framework/output_stream_handler.cc b/mediapipe/framework/output_stream_handler.cc
2-
index e27d1c68..55f2f3bd 100644
47+
index e27d1c688..55f2f3bd3 100644
348
--- a/mediapipe/framework/output_stream_handler.cc
449
+++ b/mediapipe/framework/output_stream_handler.cc
550
@@ -143,9 +143,7 @@ OutputStreamHandler::GetMonitoringInfo() {
@@ -14,7 +59,7 @@ index e27d1c68..55f2f3bd 100644
1459
return monitoring_info_vector;
1560
}
1661
diff --git a/mediapipe/framework/port/opencv_core_inc.h b/mediapipe/framework/port/opencv_core_inc.h
17-
index 12862472..1a409417 100644
62+
index 128624725..1a4094173 100644
1863
--- a/mediapipe/framework/port/opencv_core_inc.h
1964
+++ b/mediapipe/framework/port/opencv_core_inc.h
2065
@@ -20,7 +20,7 @@
@@ -26,8 +71,49 @@ index 12862472..1a409417 100644
2671
#include <opencv2/cvconfig.h>
2772
#endif
2873

74+
diff --git a/mediapipe/tasks/cc/core/BUILD b/mediapipe/tasks/cc/core/BUILD
75+
index 9c53dcca7..bd283bf08 100644
76+
--- a/mediapipe/tasks/cc/core/BUILD
77+
+++ b/mediapipe/tasks/cc/core/BUILD
78+
@@ -57,7 +57,12 @@ cc_library(
79+
name = "external_file_handler",
80+
srcs = ["external_file_handler.cc"],
81+
hdrs = ["external_file_handler.h"],
82+
+ local_defines = select({
83+
+ "@platforms//os:windows": ["UNICODE"],
84+
+ "//conditions:default": [],
85+
+ }),
86+
deps = [
87+
+ "//mediapipe/framework/deps:platform_strings",
88+
"//mediapipe/framework/port:integral_types",
89+
"//mediapipe/framework/port:status",
90+
"//mediapipe/tasks/cc:common",
91+
diff --git a/mediapipe/tasks/cc/core/external_file_handler.cc b/mediapipe/tasks/cc/core/external_file_handler.cc
92+
index 069b904e9..d8b5e0364 100644
93+
--- a/mediapipe/tasks/cc/core/external_file_handler.cc
94+
+++ b/mediapipe/tasks/cc/core/external_file_handler.cc
95+
@@ -40,6 +40,7 @@ limitations under the License.
96+
#include "absl/strings/match.h"
97+
#include "absl/strings/str_format.h"
98+
#include "absl/strings/string_view.h"
99+
+#include "mediapipe/framework/deps/platform_strings.h"
100+
#include "mediapipe/framework/port/status_macros.h"
101+
#include "mediapipe/tasks/cc/common.h"
102+
#include "mediapipe/tasks/cc/core/proto/external_file.pb.h"
103+
@@ -124,7 +125,11 @@ absl::Status ExternalFileHandler::MapExternalFile() {
104+
if (!external_file_.file_name().empty()) {
105+
MP_ASSIGN_OR_RETURN(std::string file_name,
106+
PathToResourceAsFile(external_file_.file_name()));
107+
+#ifdef _WIN32
108+
+ owned_fd_ = _wopen(Utf8ToNative(file_name).c_str(), O_RDONLY | O_BINARY);
109+
+#else
110+
owned_fd_ = open(file_name.c_str(), O_RDONLY | O_BINARY);
111+
+#endif
112+
if (owned_fd_ < 0) {
113+
const std::string error_message = absl::StrFormat(
114+
"Unable to open file at %s", external_file_.file_name());
29115
diff --git a/mediapipe/tasks/cc/core/task_api_factory.h b/mediapipe/tasks/cc/core/task_api_factory.h
30-
index a11a23fc..dbb5fe6c 100644
116+
index a11a23fcf..dbb5fe6ca 100644
31117
--- a/mediapipe/tasks/cc/core/task_api_factory.h
32118
+++ b/mediapipe/tasks/cc/core/task_api_factory.h
33119
@@ -76,15 +76,17 @@ class TaskApiFactory {
@@ -50,7 +136,7 @@ index a11a23fc..dbb5fe6c 100644
50136
std::move(graph_config), std::move(resolver),
51137
std::move(packets_callback), std::move(default_executor),
52138
diff --git a/mediapipe/tasks/cc/vision/holistic_landmarker/holistic_landmarker_graph.cc b/mediapipe/tasks/cc/vision/holistic_landmarker/holistic_landmarker_graph.cc
53-
index 2ff140c0..128a4326 100644
139+
index 2ff140c07..128a43263 100644
54140
--- a/mediapipe/tasks/cc/vision/holistic_landmarker/holistic_landmarker_graph.cc
55141
+++ b/mediapipe/tasks/cc/vision/holistic_landmarker/holistic_landmarker_graph.cc
56142
@@ -387,6 +387,13 @@ class HolisticLandmarkerGraph : public core::ModelTaskGraph {

0 commit comments

Comments
 (0)