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