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