codec2 hal: Codec2Client AIDL implementation
- Implement Codec2Client API on top of AIDL implementation
- TODO: input surface implementation is missing
- Fix libmediaplayerservice Codec2Client dependency
Bug: 251850069
Test: presubmit
Change-Id: I30c3cf24b408d20e4cae1c7e3d98bad8a7301e74
diff --git a/media/libmediaplayerservice/Android.bp b/media/libmediaplayerservice/Android.bp
index 44e78d6..718f782 100644
--- a/media/libmediaplayerservice/Android.bp
+++ b/media/libmediaplayerservice/Android.bp
@@ -47,6 +47,7 @@
"framework-permission-aidl-cpp",
"libaudioclient_aidl_conversion",
"libbase",
+ "libbinder_ndk",
"libactivitymanager_aidl",
"libandroid_net",
"libaudioclient",
diff --git a/media/libmediaplayerservice/DeathNotifier.cpp b/media/libmediaplayerservice/DeathNotifier.cpp
index d13bdf5..ab22f67 100644
--- a/media/libmediaplayerservice/DeathNotifier.cpp
+++ b/media/libmediaplayerservice/DeathNotifier.cpp
@@ -31,6 +31,10 @@
DeathRecipient(Notify const& notify): mNotify{notify} {
}
+ void initNdk() {
+ mNdkRecipient.set(AIBinder_DeathRecipient_new(OnBinderDied));
+ }
+
virtual void binderDied(wp<IBinder> const&) override {
mNotify();
}
@@ -39,8 +43,18 @@
mNotify();
}
+ static void OnBinderDied(void *cookie) {
+ DeathRecipient *thiz = (DeathRecipient *)cookie;
+ thiz->mNotify();
+ }
+
+ AIBinder_DeathRecipient *getNdkRecipient() {
+ return mNdkRecipient.get();;
+ }
+
private:
Notify mNotify;
+ ::ndk::ScopedAIBinder_DeathRecipient mNdkRecipient;
};
DeathNotifier::DeathNotifier(sp<IBinder> const& service, Notify const& notify)
@@ -55,6 +69,14 @@
service->linkToDeath(mDeathRecipient, 0);
}
+DeathNotifier::DeathNotifier(::ndk::SpAIBinder const& service, Notify const& notify)
+ : mService{std::in_place_index<3>, service},
+ mDeathRecipient{new DeathRecipient(notify)} {
+ mDeathRecipient->initNdk();
+ AIBinder_linkToDeath(
+ service.get(), mDeathRecipient->getNdkRecipient(), mDeathRecipient.get());
+}
+
DeathNotifier::DeathNotifier(DeathNotifier&& other)
: mService{other.mService}, mDeathRecipient{other.mDeathRecipient} {
other.mService.emplace<0>();
@@ -71,6 +93,12 @@
case 2:
std::get<2>(mService)->unlinkToDeath(mDeathRecipient);
break;
+ case 3:
+ AIBinder_unlinkToDeath(
+ std::get<3>(mService).get(),
+ mDeathRecipient->getNdkRecipient(),
+ mDeathRecipient.get());
+ break;
default:
CHECK(false) << "Corrupted service type during destruction.";
}
diff --git a/media/libmediaplayerservice/DeathNotifier.h b/media/libmediaplayerservice/DeathNotifier.h
index 7bc2611..24e45a3 100644
--- a/media/libmediaplayerservice/DeathNotifier.h
+++ b/media/libmediaplayerservice/DeathNotifier.h
@@ -17,6 +17,7 @@
#ifndef ANDROID_MEDIASERVICE_DEATHNOTIFIER_H
#define ANDROID_MEDIASERVICE_DEATHNOTIFIER_H
+#include <android/binder_auto_utils.h>
#include <android/hidl/base/1.0/IBase.h>
#include <binder/Binder.h>
#include <hidl/HidlSupport.h>
@@ -32,11 +33,12 @@
DeathNotifier(sp<IBinder> const& service, Notify const& notify);
DeathNotifier(sp<HBase> const& service, Notify const& notify);
+ DeathNotifier(::ndk::SpAIBinder const& service, Notify const& notify);
DeathNotifier(DeathNotifier&& other);
~DeathNotifier();
private:
- std::variant<std::monostate, sp<IBinder>, sp<HBase>> mService;
+ std::variant<std::monostate, sp<IBinder>, sp<HBase>, ::ndk::SpAIBinder> mService;
class DeathRecipient;
sp<DeathRecipient> mDeathRecipient;
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index f08c516..4c3b04e 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -927,10 +927,10 @@
{
for (std::shared_ptr<Codec2Client> const& client :
Codec2Client::CreateFromAllServices()) {
- sp<IBase> base = client->getBase();
- deathNotifiers.emplace_back(
- base, [l = wp<MediaPlayerBase>(p),
- name = std::string(client->getServiceName())]() {
+ sp<IBase> hidlBase = client->getHidlBase();
+ ::ndk::SpAIBinder aidlBase = client->getAidlBase();
+ auto onBinderDied = [l = wp<MediaPlayerBase>(p),
+ name = std::string(client->getServiceName())]() {
sp<MediaPlayerBase> listener = l.promote();
if (listener) {
ALOGI("Codec2 service \"%s\" died. "
@@ -944,7 +944,12 @@
"without a death handler.",
name.c_str());
}
- });
+ };
+ if (hidlBase) {
+ deathNotifiers.emplace_back(hidlBase, onBinderDied);
+ } else if (aidlBase.get() != nullptr) {
+ deathNotifiers.emplace_back(aidlBase, onBinderDied);
+ }
}
}
}
diff --git a/media/libmediaplayerservice/MediaRecorderClient.cpp b/media/libmediaplayerservice/MediaRecorderClient.cpp
index d6b1c90..ed3ec89 100644
--- a/media/libmediaplayerservice/MediaRecorderClient.cpp
+++ b/media/libmediaplayerservice/MediaRecorderClient.cpp
@@ -22,6 +22,7 @@
#include "MediaPlayerService.h"
#include "StagefrightRecorder.h"
+#include <android/binder_auto_utils.h>
#include <android/hardware/media/omx/1.0/IOmx.h>
#include <android/hardware/media/c2/1.0/IComponentStore.h>
#include <binder/IPCThreadState.h>
@@ -490,9 +491,9 @@
{
for (std::shared_ptr<Codec2Client> const& client :
Codec2Client::CreateFromAllServices()) {
- sp<IBase> base = client->getBase();
- mDeathNotifiers.emplace_back(
- base, [l = wp<IMediaRecorderClient>(listener),
+ sp<IBase> hidlBase = client->getHidlBase();
+ ::ndk::SpAIBinder aidlBase = client->getAidlBase();
+ auto onBinderDied = [l = wp<IMediaRecorderClient>(listener),
name = std::string(client->getServiceName())]() {
sp<IMediaRecorderClient> listener = l.promote();
if (listener) {
@@ -507,7 +508,12 @@
"without a death handler",
name.c_str());
}
- });
+ };
+ if (hidlBase) {
+ mDeathNotifiers.emplace_back(hidlBase, onBinderDied);
+ } else if (aidlBase.get() != nullptr) {
+ mDeathNotifiers.emplace_back(aidlBase, onBinderDied);
+ }
}
}
}
diff --git a/media/libmediaplayerservice/fuzzer/Android.bp b/media/libmediaplayerservice/fuzzer/Android.bp
index f564efa..2429057 100644
--- a/media/libmediaplayerservice/fuzzer/Android.bp
+++ b/media/libmediaplayerservice/fuzzer/Android.bp
@@ -35,6 +35,7 @@
shared_libs: [
"framework-permission-aidl-cpp",
"libbinder",
+ "libbinder_ndk",
"libcutils",
"libmedia",
"libstagefright",