From e2b5d112909b9dfd764f14833b82e38e4bc2f81f Mon Sep 17 00:00:00 2001
From: Alexander Alekhin <alexander.alekhin@intel.com>
Date: Mon, 9 Jul 2018 17:19:35 +0300
Subject: [PATCH] dnn: allow to use external protobuf

"custom layers" feature will not work properly in these builds.
---
 modules/dnn/CMakeLists.txt         | 4 ++++
 modules/dnn/src/caffe/caffe_io.cpp | 4 ++++
 modules/dnn/test/test_layers.cpp   | 4 ++++
 3 files changed, 12 insertions(+)

diff --git a/modules/dnn/CMakeLists.txt b/modules/dnn/CMakeLists.txt
index e306dde188..a2f741cda1 100644
--- a/modules/dnn/CMakeLists.txt
+++ b/modules/dnn/CMakeLists.txt
@@ -48,6 +48,10 @@ if(ANDROID)
   add_definitions(-DDISABLE_POSIX_MEMALIGN -DTH_DISABLE_HEAP_TRACKING)
 endif()
 
+if(NOT BUILD_PROTOBUF)
+  add_definitions(-DOPENCV_DNN_EXTERNAL_PROTOBUF=1)
+endif()
+
 add_definitions(-DHAVE_PROTOBUF=1)
 
 #suppress warnings in autogenerated caffe.pb.* files
diff --git a/modules/dnn/src/caffe/caffe_io.cpp b/modules/dnn/src/caffe/caffe_io.cpp
index 730c752cef..9f4e31c7b0 100644
--- a/modules/dnn/src/caffe/caffe_io.cpp
+++ b/modules/dnn/src/caffe/caffe_io.cpp
@@ -1120,7 +1120,11 @@ bool ReadProtoFromTextFile(const char* filename, Message* proto) {
     std::ifstream fs(filename, std::ifstream::in);
     CHECK(fs.is_open()) << "Can't open \"" << filename << "\"";
     IstreamInputStream input(&fs);
+#ifndef OPENCV_DNN_EXTERNAL_PROTOBUF
     return google::protobuf::TextFormat::Parser(true).Parse(&input, proto);
+#else
+    return google::protobuf::TextFormat::Parser().Parse(&input, proto);
+#endif
 }
 
 bool ReadProtoFromBinaryFile(const char* filename, Message* proto) {
diff --git a/modules/dnn/test/test_layers.cpp b/modules/dnn/test/test_layers.cpp
index 3d20df5346..1a6aad0d62 100644
--- a/modules/dnn/test/test_layers.cpp
+++ b/modules/dnn/test/test_layers.cpp
@@ -1149,7 +1149,11 @@ private:
     int outWidth, outHeight, zoomFactor;
 };
 
+#ifndef OPENCV_DNN_EXTERNAL_PROTOBUF
 TEST_P(Test_Caffe_layers, Interp)
+#else
+TEST_P(Test_Caffe_layers, DISABLED_Interp)  // requires patched protobuf (available in OpenCV source tree only)
+#endif
 {
     if (backend == DNN_BACKEND_INFERENCE_ENGINE && target == DNN_TARGET_MYRIAD)
         throw SkipTestException("");