From d06a69c877ca7d472e2184e377e6f63b2ca3cd6c Mon Sep 17 00:00:00 2001
From: Arthur Hsu <arthurhsu@google.com>
Date: Wed, 20 Jun 2018 21:24:34 +0000
Subject: [PATCH] Revert "Remove C2ArcVideoAcceleratorFactory."

This reverts commit efd335ff6b75833bff29753b7462a6c0e32dc525.

Reason for revert: break pi-dev build

Change-Id: I019cee1aa9ad19dd1845a501e15f2d97d5a107d5
---
 Android.bp                             | 32 ++++++++++
 Android.mk                             |  3 +-
 C2ArcVideoAcceleratorFactory.cpp       | 87 ++++++++++++++++++++++++++
 C2VDAAdaptorProxy.cpp                  |  4 +-
 include/C2ArcVideoAcceleratorFactory.h | 37 +++++++++++
 5 files changed, 159 insertions(+), 4 deletions(-)
 create mode 100644 Android.bp
 create mode 100644 C2ArcVideoAcceleratorFactory.cpp
 create mode 100644 include/C2ArcVideoAcceleratorFactory.h

diff --git a/Android.bp b/Android.bp
new file mode 100644
index 0000000..db4d39f
--- /dev/null
+++ b/Android.bp
@@ -0,0 +1,32 @@
+cc_library_shared {
+    name: "libv4l2_codec2_arcva_factory",
+    vendor_available: true,
+    product_variables: {
+        arc: {
+            srcs: ["C2ArcVideoAcceleratorFactory.cpp"],
+
+            shared_libs: [
+                "libarcbridge",
+                "libarcbridgeservice",
+                "libarcvideobridge",
+                "libbinder",
+                "libchrome",
+                "liblog",
+                "libmojo",
+                "libutils",
+            ],
+
+            // -Wno-unused-parameter is needed for libchrome/base codes
+            cflags: [
+                "-Wall",
+                "-Werror",
+                "-Wno-unused-parameter",
+                "-std=c++14",
+            ],
+        },
+    },
+    clang: true,
+    export_include_dirs: [
+        "include",
+    ],
+}
diff --git a/Android.mk b/Android.mk
index 2c2b14e..cfb8442 100644
--- a/Android.mk
+++ b/Android.mk
@@ -56,8 +56,7 @@ LOCAL_SRC_FILES := $(filter-out C2VDAAdaptor.cpp, $(LOCAL_SRC_FILES))
 LOCAL_SHARED_LIBRARIES += libarcbridge \
                           libarcbridgeservice \
                           libmojo \
-                          vendor.google_arc.arcvideobridge@1.0 \
-                          vendor.google_arc.arcvideobridge@1.0-client \
+                          libv4l2_codec2_arcva_factory \
 
 endif # ifneq (,$(findstring cheets_,$(TARGET_PRODUCT)))
 
diff --git a/C2ArcVideoAcceleratorFactory.cpp b/C2ArcVideoAcceleratorFactory.cpp
new file mode 100644
index 0000000..07997d1
--- /dev/null
+++ b/C2ArcVideoAcceleratorFactory.cpp
@@ -0,0 +1,87 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// #define LOG_NDEBUG 0
+#define LOG_TAG "C2ArcVideoAcceleratorFactory"
+
+#include <C2ArcVideoAcceleratorFactory.h>
+
+#include <base/bind.h>
+#include <binder/IServiceManager.h>
+#include <mojo/edk/embedder/embedder.h>
+#include <mojo/public/cpp/bindings/interface_request.h>
+#include <mojo/public/cpp/system/handle.h>
+#include <utils/Log.h>
+
+namespace android {
+
+ANDROID_SINGLETON_STATIC_INSTANCE(C2ArcVideoAcceleratorFactory)
+
+bool C2ArcVideoAcceleratorFactory::createVideoDecodeAccelerator(
+        ::arc::mojom::VideoDecodeAcceleratorRequest request) {
+    if (!mRemoteFactory) {
+        ALOGE("Factory is not ready");
+        return false;
+    }
+    mRemoteFactory->CreateDecodeAccelerator(std::move(request));
+    return true;
+}
+
+bool C2ArcVideoAcceleratorFactory::createVideoEncodeAccelerator(
+        ::arc::mojom::VideoEncodeAcceleratorRequest request) {
+    if (!mRemoteFactory) {
+        ALOGE("Factory is not ready");
+        return false;
+    }
+    mRemoteFactory->CreateEncodeAccelerator(std::move(request));
+    return true;
+}
+
+bool C2ArcVideoAcceleratorFactory::createVideoProtectedBufferAllocator(
+        ::arc::mojom::VideoProtectedBufferAllocatorRequest request) {
+    if (!mRemoteFactory) {
+        ALOGE("Factory is not ready");
+        return false;
+    }
+    mRemoteFactory->CreateProtectedBufferAllocator(std::move(request));
+    return true;
+}
+
+int32_t C2ArcVideoAcceleratorFactory::hostVersion() const {
+    return mHostVersion;
+}
+
+C2ArcVideoAcceleratorFactory::C2ArcVideoAcceleratorFactory() : mHostVersion(0) {
+    sp<IBinder> binder =
+            defaultServiceManager()->getService(String16("android.os.IArcVideoBridge"));
+    if (binder == nullptr) {
+        ALOGE("Failed to find IArcVideoBridge service");
+        return;
+    }
+    mArcVideoBridge = interface_cast<IArcVideoBridge>(binder);
+    mHostVersion = mArcVideoBridge->hostVersion();
+    if (mHostVersion < 4) {
+        ALOGW("HostVersion(%d) is outdated", mHostVersion);
+        return;
+    }
+
+    ALOGV("HostVersion: %d", mHostVersion);
+
+    ::arc::MojoBootstrapResult bootstrapResult =
+            mArcVideoBridge->bootstrapVideoAcceleratorFactory();
+    if (!bootstrapResult.is_valid()) {
+        ALOGE("bootstrapVideoAcceleratorFactory returns invalid result");
+        return;
+    }
+    mojo::edk::ScopedPlatformHandle handle(
+            mojo::edk::PlatformHandle(bootstrapResult.releaseFd().release()));
+    ALOGV("SetParentPipeHandle(fd=%d)", handle.get().handle);
+    mojo::edk::SetParentPipeHandle(std::move(handle));
+    mojo::ScopedMessagePipeHandle server_pipe =
+            mojo::edk::CreateChildMessagePipe(bootstrapResult.releaseToken());
+    mRemoteFactory.Bind(mojo::InterfacePtrInfo<::arc::mojom::VideoAcceleratorFactory>(
+            std::move(server_pipe), 7u));
+}
+
+}  // namespace android
diff --git a/C2VDAAdaptorProxy.cpp b/C2VDAAdaptorProxy.cpp
index ea47545..2c44e6b 100644
--- a/C2VDAAdaptorProxy.cpp
+++ b/C2VDAAdaptorProxy.cpp
@@ -5,11 +5,11 @@
 // #define LOG_NDEBUG 0
 #define LOG_TAG "C2VDAAdaptorProxy"
 
+#include <C2ArcVideoAcceleratorFactory.h>
 #include <C2VDAAdaptorProxy.h>
 
 #include <videodev2.h>
 
-#include <arc/ArcVideoAcceleratorFactory.h>
 #include <arc/MojoProcessSupport.h>
 #include <arc/MojoThread.h>
 #include <base/bind.h>
@@ -64,7 +64,7 @@ bool C2VDAAdaptorProxy::establishChannel() {
 }
 
 void C2VDAAdaptorProxy::establishChannelOnMojoThread(std::shared_ptr<::arc::Future<bool>> future) {
-    ::arc::ArcVideoAcceleratorFactory& factory = ::arc::ArcVideoAcceleratorFactory::getInstance();
+    C2ArcVideoAcceleratorFactory& factory = ::android::C2ArcVideoAcceleratorFactory::getInstance();
 
     if (!factory.createVideoDecodeAccelerator(mojo::MakeRequest(&mVDAPtr))) {
         future->set(false);
diff --git a/include/C2ArcVideoAcceleratorFactory.h b/include/C2ArcVideoAcceleratorFactory.h
new file mode 100644
index 0000000..9cdaf37
--- /dev/null
+++ b/include/C2ArcVideoAcceleratorFactory.h
@@ -0,0 +1,37 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ANDROID_C2_ARC_VIDEO_ACCELERATOR_FACTORY_H
+#define ANDROID_C2_ARC_VIDEO_ACCELERATOR_FACTORY_H
+
+#include <media/arcvideobridge/IArcVideoBridge.h>
+#include <utils/Singleton.h>
+
+#include <components/arc/common/video.mojom.h>
+#include <components/arc/common/video_decode_accelerator.mojom.h>
+#include <components/arc/common/video_encode_accelerator.mojom.h>
+
+namespace android {
+// Helper class to create message pipe to the ArcVideoAccelerator.
+// This class should only be used in the Mojo thread.
+class C2ArcVideoAcceleratorFactory : public Singleton<C2ArcVideoAcceleratorFactory> {
+public:
+    bool createVideoDecodeAccelerator(::arc::mojom::VideoDecodeAcceleratorRequest request);
+    bool createVideoEncodeAccelerator(::arc::mojom::VideoEncodeAcceleratorRequest request);
+    bool createVideoProtectedBufferAllocator(
+            ::arc::mojom::VideoProtectedBufferAllocatorRequest request);
+    int32_t hostVersion() const;
+
+private:
+    C2ArcVideoAcceleratorFactory();
+
+    uint32_t mHostVersion;
+    sp<IArcVideoBridge> mArcVideoBridge;
+    ::arc::mojom::VideoAcceleratorFactoryPtr mRemoteFactory;
+
+    friend class Singleton<C2ArcVideoAcceleratorFactory>;
+};
+}  // namespace android
+
+#endif  // ANDROID_C2_ARC_VIDEO_ACCELERATOR_FACTORY_H
-- 
GitLab