Merge changes from topics "c2aidl-service", "c2fuzzer" into main
* changes:
codec2 hal: fuzzer
codec2 hal: example AIDL service
diff --git a/media/codec2/hal/aidl/Android.bp b/media/codec2/hal/aidl/Android.bp
index a9a00be..a4715f8 100644
--- a/media/codec2/hal/aidl/Android.bp
+++ b/media/codec2/hal/aidl/Android.bp
@@ -150,3 +150,28 @@
"libcodec2_aidl_client",
],
}
+
+cc_fuzz {
+ name: "libcodec2-aidl-fuzzer",
+ vendor: true,
+ srcs: [
+ "fuzzer.cpp",
+ ],
+ defaults: [
+ "libcodec2-aidl-defaults",
+ "service_fuzzer_defaults",
+ ],
+ shared_libs: [
+ "libcodec2_vndk",
+
+ "libcodec2_soft_avcdec",
+ "libcodec2_soft_avcenc",
+ "libcodec2_soft_aacdec",
+ "libcodec2_soft_aacenc",
+ ],
+ fuzz_config: {
+ cc: [
+ "wonsik@google.com",
+ ],
+ },
+}
diff --git a/media/codec2/hal/aidl/fuzzer.cpp b/media/codec2/hal/aidl/fuzzer.cpp
new file mode 100644
index 0000000..c1a2762
--- /dev/null
+++ b/media/codec2/hal/aidl/fuzzer.cpp
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <fuzzbinder/libbinder_ndk_driver.h>
+#include <fuzzer/FuzzedDataProvider.h>
+
+#include <C2PlatformSupport.h>
+
+#include <android/binder_interface_utils.h>
+#include <codec2/aidl/ComponentStore.h>
+
+using aidl::android::hardware::media::c2::utils::ComponentStore;
+using android::fuzzService;
+using ndk::SharedRefBase;
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+ std::shared_ptr<C2ComponentStore> store = ::android::GetCodec2PlatformComponentStore();
+ std::shared_ptr<ComponentStore> binder = SharedRefBase::make<ComponentStore>(store);
+
+ fuzzService(binder->asBinder().get(), FuzzedDataProvider(data, size));
+
+ return 0;
+}
diff --git a/media/codec2/hal/services/Android.bp b/media/codec2/hal/services/Android.bp
index 524519c..663e159 100644
--- a/media/codec2/hal/services/Android.bp
+++ b/media/codec2/hal/services/Android.bp
@@ -39,13 +39,17 @@
}
cc_binary {
- name: "android.hardware.media.c2@1.2-default-service",
+ name: "android.hardware.media.c2-default-service",
vendor: true,
relative_install_path: "hw",
- init_rc: ["android.hardware.media.c2@1.2-default-service.rc"],
+ init_rc: ["android.hardware.media.c2-default-service.rc"],
- defaults: ["libcodec2-hidl-defaults"],
+ defaults: [
+ "libcodec2-hidl-defaults",
+ "libcodec2-aidl-defaults",
+ ],
+
srcs: [
"vendor.cpp",
],
@@ -54,13 +58,14 @@
shared_libs: [
"libavservices_minijail",
"libbinder",
+ "libbinder_ndk",
],
- required: ["android.hardware.media.c2@1.2-default-seccomp_policy"],
+ required: ["android.hardware.media.c2-default-seccomp_policy"],
- // The content in manifest_media_c2_V1_1_default.xml can be included
+ // The content in manifest_media_c2_default.xml can be included
// directly in the main device manifest.xml file or via vintf_fragments.
// (Remove the line below if the entry is already in the main manifest.)
- vintf_fragments: ["manifest_media_c2_V1_1_default.xml"],
+ vintf_fragments: ["manifest_media_c2_default.xml"],
// Remove this line to enable this module.
enabled: false,
@@ -73,30 +78,29 @@
// Files in the "seccomp_policy" subdirectory are only provided as examples.
// They may not work on some devices and/or architectures without modification.
prebuilt_etc {
- name: "android.hardware.media.c2@1.2-default-seccomp_policy",
+ name: "android.hardware.media.c2-default-seccomp_policy",
vendor: true,
sub_dir: "seccomp_policy",
// If a specific architecture is targeted, multiple choices are not needed.
arch: {
arm: {
- src: "seccomp_policy/android.hardware.media.c2@1.2-default-arm.policy",
+ src: "seccomp_policy/android.hardware.media.c2-default-arm.policy",
},
arm64: {
- src: "seccomp_policy/android.hardware.media.c2@1.2-default-arm64.policy",
+ src: "seccomp_policy/android.hardware.media.c2-default-arm64.policy",
},
riscv64: {
- src: "seccomp_policy/android.hardware.media.c2@1.2-default-riscv64.policy",
+ src: "seccomp_policy/android.hardware.media.c2-default-riscv64.policy",
},
x86: {
- src: "seccomp_policy/android.hardware.media.c2@1.2-default-x86.policy",
+ src: "seccomp_policy/android.hardware.media.c2-default-x86.policy",
},
x86_64: {
- src: "seccomp_policy/android.hardware.media.c2@1.2-default-x86_64.policy",
+ src: "seccomp_policy/android.hardware.media.c2-default-x86_64.policy",
},
},
// This may be removed.
required: ["crash_dump.policy"],
}
-
diff --git a/media/codec2/hal/services/android.hardware.media.c2-default-service.rc b/media/codec2/hal/services/android.hardware.media.c2-default-service.rc
new file mode 100644
index 0000000..dcc8e71
--- /dev/null
+++ b/media/codec2/hal/services/android.hardware.media.c2-default-service.rc
@@ -0,0 +1,7 @@
+service android-hardware-media-c2-hal /vendor/bin/hw/android.hardware.media.c2-default-service
+ class hal
+ user mediacodec
+ group camera mediadrm drmrpc
+ ioprio rt 4
+ task_profiles ProcessCapacityHigh
+
diff --git a/media/codec2/hal/services/android.hardware.media.c2@1.2-default-service.rc b/media/codec2/hal/services/android.hardware.media.c2@1.2-default-service.rc
deleted file mode 100644
index 12da593..0000000
--- a/media/codec2/hal/services/android.hardware.media.c2@1.2-default-service.rc
+++ /dev/null
@@ -1,7 +0,0 @@
-service android-hardware-media-c2-hal-1-2 /vendor/bin/hw/android.hardware.media.c2@1.2-default-service
- class hal
- user mediacodec
- group camera mediadrm drmrpc
- ioprio rt 4
- task_profiles ProcessCapacityHigh
-
diff --git a/media/codec2/hal/services/manifest_media_c2_V1_0_default.xml b/media/codec2/hal/services/manifest_media_c2_V1_0_default.xml
deleted file mode 100644
index e97c3ce..0000000
--- a/media/codec2/hal/services/manifest_media_c2_V1_0_default.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<manifest version="1.0" type="device">
- <hal>
- <name>android.hardware.media.c2</name>
- <transport>hwbinder</transport>
- <version>1.0</version>
- <interface>
- <name>IComponentStore</name>
- <instance>default</instance>
- </interface>
- </hal>
-</manifest>
diff --git a/media/codec2/hal/services/manifest_media_c2_V1_1_default.xml b/media/codec2/hal/services/manifest_media_c2_V1_1_default.xml
deleted file mode 100644
index bf0d72f..0000000
--- a/media/codec2/hal/services/manifest_media_c2_V1_1_default.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<manifest version="1.0" type="device">
- <hal>
- <name>android.hardware.media.c2</name>
- <transport>hwbinder</transport>
- <version>1.1</version>
- <interface>
- <name>IComponentStore</name>
- <instance>default</instance>
- </interface>
- </hal>
-</manifest>
diff --git a/media/codec2/hal/services/manifest_media_c2_V1_2_default.xml b/media/codec2/hal/services/manifest_media_c2_V1_2_default.xml
deleted file mode 100644
index a5e8d87..0000000
--- a/media/codec2/hal/services/manifest_media_c2_V1_2_default.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<manifest version="1.0" type="device">
- <hal>
- <name>android.hardware.media.c2</name>
- <transport>hwbinder</transport>
- <version>1.2</version>
- <interface>
- <name>IComponentStore</name>
- <instance>default</instance>
- </interface>
- </hal>
-</manifest>
diff --git a/media/codec2/hal/services/manifest_media_c2_default.xml b/media/codec2/hal/services/manifest_media_c2_default.xml
new file mode 100644
index 0000000..5e3d060
--- /dev/null
+++ b/media/codec2/hal/services/manifest_media_c2_default.xml
@@ -0,0 +1,18 @@
+<manifest version="1.0" type="device">
+ <!-- HIDL fragment -->
+ <hal>
+ <name>android.hardware.media.c2</name>
+ <transport>hwbinder</transport>
+ <version>1.2</version>
+ <interface>
+ <name>IComponentStore</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <!-- AIDL fragment -->
+ <hal format="aidl">
+ <name>android.hardware.media.c2</name>
+ <version>1</version>
+ <fqname>IComponentStore/default</fqname>
+ </hal>
+</manifest>
diff --git a/media/codec2/hal/services/seccomp_policy/android.hardware.media.c2@1.2-default-arm.policy b/media/codec2/hal/services/seccomp_policy/android.hardware.media.c2-default-arm.policy
similarity index 100%
rename from media/codec2/hal/services/seccomp_policy/android.hardware.media.c2@1.2-default-arm.policy
rename to media/codec2/hal/services/seccomp_policy/android.hardware.media.c2-default-arm.policy
diff --git a/media/codec2/hal/services/seccomp_policy/android.hardware.media.c2@1.2-default-arm64.policy b/media/codec2/hal/services/seccomp_policy/android.hardware.media.c2-default-arm64.policy
similarity index 100%
rename from media/codec2/hal/services/seccomp_policy/android.hardware.media.c2@1.2-default-arm64.policy
rename to media/codec2/hal/services/seccomp_policy/android.hardware.media.c2-default-arm64.policy
diff --git a/media/codec2/hal/services/seccomp_policy/android.hardware.media.c2@1.2-default-riscv64.policy b/media/codec2/hal/services/seccomp_policy/android.hardware.media.c2-default-riscv64.policy
similarity index 100%
rename from media/codec2/hal/services/seccomp_policy/android.hardware.media.c2@1.2-default-riscv64.policy
rename to media/codec2/hal/services/seccomp_policy/android.hardware.media.c2-default-riscv64.policy
diff --git a/media/codec2/hal/services/seccomp_policy/android.hardware.media.c2@1.2-default-x86.policy b/media/codec2/hal/services/seccomp_policy/android.hardware.media.c2-default-x86.policy
similarity index 100%
rename from media/codec2/hal/services/seccomp_policy/android.hardware.media.c2@1.2-default-x86.policy
rename to media/codec2/hal/services/seccomp_policy/android.hardware.media.c2-default-x86.policy
diff --git a/media/codec2/hal/services/seccomp_policy/android.hardware.media.c2@1.2-default-x86_64.policy b/media/codec2/hal/services/seccomp_policy/android.hardware.media.c2-default-x86_64.policy
similarity index 100%
rename from media/codec2/hal/services/seccomp_policy/android.hardware.media.c2@1.2-default-x86_64.policy
rename to media/codec2/hal/services/seccomp_policy/android.hardware.media.c2-default-x86_64.policy
diff --git a/media/codec2/hal/services/vendor.cpp b/media/codec2/hal/services/vendor.cpp
index 0d0684d..7cb7e6d 100644
--- a/media/codec2/hal/services/vendor.cpp
+++ b/media/codec2/hal/services/vendor.cpp
@@ -15,29 +15,43 @@
*/
//#define LOG_NDEBUG 0
-#define LOG_TAG "android.hardware.media.c2@1.2-service"
+#define LOG_TAG "android.hardware.media.c2-service"
#include <android-base/logging.h>
-#include <binder/ProcessState.h>
-#include <codec2/hidl/1.2/ComponentStore.h>
-#include <hidl/HidlTransportSupport.h>
#include <minijail.h>
#include <util/C2InterfaceHelper.h>
#include <C2Component.h>
#include <C2Config.h>
+// HIDL
+#include <binder/ProcessState.h>
+#include <codec2/hidl/1.2/ComponentStore.h>
+#include <hidl/HidlTransportSupport.h>
+
+// AIDL
+#include <android/binder_manager.h>
+#include <android/binder_process.h>
+#include <codec2/aidl/ComponentStore.h>
+#include <codec2/aidl/ParamTypes.h>
+
// This is the absolute on-device path of the prebuild_etc module
-// "android.hardware.media.c2@1.1-default-seccomp_policy" in Android.bp.
+// "android.hardware.media.c2-default-seccomp_policy" in Android.bp.
static constexpr char kBaseSeccompPolicyPath[] =
"/vendor/etc/seccomp_policy/"
- "android.hardware.media.c2@1.2-default-seccomp-policy";
+ "android.hardware.media.c2-default-seccomp_policy";
// Additional seccomp permissions can be added in this file.
// This file does not exist by default.
static constexpr char kExtSeccompPolicyPath[] =
"/vendor/etc/seccomp_policy/"
- "android.hardware.media.c2@1.2-extended-seccomp-policy";
+ "android.hardware.media.c2-extended-seccomp_policy";
+
+// We want multiple threads to be running so that a blocking operation
+// on one codec does not block the other codecs.
+// For HIDL: Extra threads may be needed to handle a stacked IPC sequence that
+// contains alternating binder and hwbinder calls. (See b/35283480.)
+static constexpr int kThreadCount = 8;
class StoreImpl : public C2ComponentStore {
public:
@@ -125,12 +139,12 @@
addParameter(
DefineParam(mDmaBufUsageInfo, "dmabuf-usage")
- .withDefault(new C2StoreDmaBufUsageInfo())
+ .withDefault(C2StoreDmaBufUsageInfo::AllocShared(128))
.withFields({
- C2F(mDmaBufUsageInfo, usage).flags({C2MemoryUsage::CPU_READ | C2MemoryUsage::CPU_WRITE}),
- C2F(mDmaBufUsageInfo, capacity).inRange(0, UINT32_MAX, 1024),
- C2F(mDmaBufUsageInfo, heapName).any(),
- C2F(mDmaBufUsageInfo, allocFlags).flags({}),
+ C2F(mDmaBufUsageInfo, m.usage).flags({C2MemoryUsage::CPU_READ | C2MemoryUsage::CPU_WRITE}),
+ C2F(mDmaBufUsageInfo, m.capacity).inRange(0, UINT32_MAX, 1024),
+ C2F(mDmaBufUsageInfo, m.allocFlags).flags({}),
+ C2F(mDmaBufUsageInfo, m.heapName).any(),
})
.withSetter(SetDmaBufUsage)
.build());
@@ -162,21 +176,49 @@
Interface mInterface;
};
-int main(int /* argc */, char** /* argv */) {
- using namespace ::android;
- LOG(DEBUG) << "android.hardware.media.c2@1.2-service starting...";
+void runAidlService() {
+ ABinderProcess_setThreadPoolMaxThreadCount(kThreadCount);
+ ABinderProcess_startThreadPool();
- // Set up minijail to limit system calls.
- signal(SIGPIPE, SIG_IGN);
- SetUpMinijail(kBaseSeccompPolicyPath, kExtSeccompPolicyPath);
+ // Create IComponentStore service.
+ using namespace ::aidl::android::hardware::media::c2;
+ std::shared_ptr<IComponentStore> store;
+
+ // TODO: Replace this with
+ // store = new utils::ComponentStore(
+ // /* implementation of C2ComponentStore */);
+ LOG(DEBUG) << "Instantiating Codec2's IComponentStore service...";
+ store = ::ndk::SharedRefBase::make<utils::ComponentStore>(
+ std::make_shared<StoreImpl>());
+
+ if (store == nullptr) {
+ LOG(ERROR) << "Cannot create Codec2's IComponentStore service.";
+ } else {
+ const std::string serviceName =
+ std::string(IComponentStore::descriptor) + "/default";
+ binder_exception_t ex = AServiceManager_addService(
+ store->asBinder().get(), serviceName.c_str());
+ if (ex != EX_NONE) {
+ LOG(ERROR) << "Cannot register Codec2's IComponentStore service"
+ " with instance name << \""
+ << serviceName << "\".";
+ } else {
+ LOG(DEBUG) << "Codec2's IComponentStore service registered. "
+ "Instance name: \"" << serviceName << "\".";
+ }
+ }
+
+ ABinderProcess_joinThreadPool();
+}
+
+void runHidlService() {
+ using namespace ::android;
// Enable vndbinder to allow vendor-to-vendor binder calls.
ProcessState::initWithDriver("/dev/vndbinder");
ProcessState::self()->startThreadPool();
- // Extra threads may be needed to handle a stacked IPC sequence that
- // contains alternating binder and hwbinder calls. (See b/35283480.)
- hardware::configureRpcThreadpool(8, true /* callerWillJoin */);
+ hardware::configureRpcThreadpool(kThreadCount, true /* callerWillJoin */);
// Create IComponentStore service.
{
@@ -206,5 +248,20 @@
}
hardware::joinRpcThreadpool();
+}
+
+int main(int /* argc */, char** /* argv */) {
+ const bool aidlEnabled = ::aidl::android::hardware::media::c2::utils::IsEnabled();
+ LOG(DEBUG) << "android.hardware.media.c2" << (aidlEnabled ? "-V1" : "@1.2")
+ << "-service starting...";
+
+ // Set up minijail to limit system calls.
+ signal(SIGPIPE, SIG_IGN);
+ android::SetUpMinijail(kBaseSeccompPolicyPath, kExtSeccompPolicyPath);
+ if (aidlEnabled) {
+ runAidlService();
+ } else {
+ runHidlService();
+ }
return 0;
}