// 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