Notify swcodec crashes too
Bug: 129426284
Test: manual/CTS
Change-Id: I086a2b8253757f941e4dd2e160490cbb59edb627
diff --git a/media/libmediaplayerservice/Android.bp b/media/libmediaplayerservice/Android.bp
index 46a1c24..90097f2 100644
--- a/media/libmediaplayerservice/Android.bp
+++ b/media/libmediaplayerservice/Android.bp
@@ -11,6 +11,7 @@
],
shared_libs: [
+ "android.hardware.media.c2@1.0",
"android.hardware.media.omx@1.0",
"libbase",
"libaudioclient",
@@ -21,7 +22,6 @@
"libdl",
"libgui",
"libhidlbase",
- "libhidlmemory",
"liblog",
"libmedia",
"libmedia_omx",
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index da95817..71a7370 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -34,6 +34,8 @@
#include <utils/misc.h>
+#include <android/hardware/media/omx/1.0/IOmxStore.h>
+#include <android/hardware/media/c2/1.0/IComponentStore.h>
#include <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>
#include <binder/MemoryHeapBase.h>
@@ -650,17 +652,17 @@
const sp<MediaPlayerBase>& listener,
int which) {
mService = service;
- mOmx = nullptr;
+ mHService = nullptr;
mListener = listener;
mWhich = which;
}
MediaPlayerService::Client::ServiceDeathNotifier::ServiceDeathNotifier(
- const sp<IOmx>& omx,
+ const sp<android::hidl::base::V1_0::IBase>& hService,
const sp<MediaPlayerBase>& listener,
int which) {
mService = nullptr;
- mOmx = omx;
+ mHService = hService;
mListener = listener;
mWhich = which;
}
@@ -692,9 +694,9 @@
if (mService != nullptr) {
mService->unlinkToDeath(this);
mService = nullptr;
- } else if (mOmx != nullptr) {
- mOmx->unlinkToDeath(this);
- mOmx = nullptr;
+ } else if (mHService != nullptr) {
+ mHService->unlinkToDeath(this);
+ mHService = nullptr;
}
}
@@ -714,10 +716,12 @@
mExtractorDeathListener->unlinkToDeath();
mExtractorDeathListener = nullptr;
}
- if (mCodecDeathListener != nullptr) {
- mCodecDeathListener->unlinkToDeath();
- mCodecDeathListener = nullptr;
+ for (const sp<ServiceDeathNotifier>& codecDeathListener : mCodecDeathListeners) {
+ if (codecDeathListener != nullptr) {
+ codecDeathListener->unlinkToDeath();
+ }
}
+ mCodecDeathListeners.clear();
}
sp<MediaPlayerBase> MediaPlayerService::Client::setDataSource_pre(
@@ -741,20 +745,45 @@
new ServiceDeathNotifier(binder, p, MEDIAEXTRACTOR_PROCESS_DEATH);
binder->linkToDeath(extractorDeathListener);
- sp<IOmx> omx = IOmx::getService();
- if (omx == nullptr) {
- ALOGE("IOmx service is not available");
- return NULL;
+ std::vector<sp<ServiceDeathNotifier>> codecDeathListeners;
+ {
+ using ::android::hidl::base::V1_0::IBase;
+
+ // Listen to OMX's IOmxStore/default
+ {
+ sp<IBase> store = ::android::hardware::media::omx::V1_0::
+ IOmxStore::getService();
+ if (store == nullptr) {
+ ALOGD("OMX service is not available");
+ } else {
+ sp<ServiceDeathNotifier> codecDeathListener =
+ new ServiceDeathNotifier(store, p, MEDIACODEC_PROCESS_DEATH);
+ store->linkToDeath(codecDeathListener, 0);
+ codecDeathListeners.emplace_back(codecDeathListener);
+ }
+ }
+
+ // Listen to Codec2's IComponentStore/software
+ // TODO: Listen to all Codec2 services.
+ {
+ sp<IBase> store = ::android::hardware::media::c2::V1_0::
+ IComponentStore::getService();
+ if (store == nullptr) {
+ ALOGD("Codec2 system service is not available");
+ } else {
+ sp<ServiceDeathNotifier> codecDeathListener =
+ new ServiceDeathNotifier(store, p, MEDIACODEC_PROCESS_DEATH);
+ store->linkToDeath(codecDeathListener, 0);
+ codecDeathListeners.emplace_back(codecDeathListener);
+ }
+ }
}
- sp<ServiceDeathNotifier> codecDeathListener =
- new ServiceDeathNotifier(omx, p, MEDIACODEC_PROCESS_DEATH);
- omx->linkToDeath(codecDeathListener, 0);
Mutex::Autolock lock(mLock);
clearDeathNotifiers_l();
mExtractorDeathListener = extractorDeathListener;
- mCodecDeathListener = codecDeathListener;
+ mCodecDeathListeners.swap(codecDeathListeners);
mAudioDeviceUpdatedListener = new AudioDeviceUpdatedNotifier(p);
if (!p->hardwareOutput()) {
diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h
index bfb7cc2..26bfa71 100644
--- a/media/libmediaplayerservice/MediaPlayerService.h
+++ b/media/libmediaplayerservice/MediaPlayerService.h
@@ -30,7 +30,7 @@
#include <media/Metadata.h>
#include <media/stagefright/foundation/ABase.h>
-#include <android/hardware/media/omx/1.0/IOmx.h>
+#include <hidl/HidlSupport.h>
#include <system/audio.h>
@@ -42,7 +42,6 @@
class IDataSource;
class IMediaRecorder;
class IMediaMetadataRetriever;
-class IOMX;
class IRemoteDisplay;
class IRemoteDisplayClient;
class MediaRecorderClient;
@@ -70,7 +69,6 @@
class MediaPlayerService : public BnMediaPlayerService
{
class Client;
- typedef ::android::hardware::media::omx::V1_0::IOmx IOmx;
class AudioOutput : public MediaPlayerBase::AudioSink
{
@@ -400,7 +398,7 @@
const sp<MediaPlayerBase>& listener,
int which);
ServiceDeathNotifier(
- const sp<IOmx>& omx,
+ const sp<android::hidl::base::V1_0::IBase>& hService,
const sp<MediaPlayerBase>& listener,
int which);
virtual ~ServiceDeathNotifier();
@@ -413,7 +411,7 @@
private:
int mWhich;
sp<IBinder> mService;
- sp<IOmx> mOmx;
+ sp<android::hidl::base::V1_0::IBase> mHService; // HIDL service
wp<MediaPlayerBase> mListener;
};
@@ -509,7 +507,7 @@
media::Metadata::Filter mMetadataUpdated; // protected by mLock
sp<ServiceDeathNotifier> mExtractorDeathListener;
- sp<ServiceDeathNotifier> mCodecDeathListener;
+ std::vector<sp<ServiceDeathNotifier>> mCodecDeathListeners;
sp<AudioDeviceUpdatedNotifier> mAudioDeviceUpdatedListener;
#if CALLBACK_ANTAGONIZER
Antagonizer* mAntagonizer;
diff --git a/media/libstagefright/Android.bp b/media/libstagefright/Android.bp
index da35889..ba832d6 100644
--- a/media/libstagefright/Android.bp
+++ b/media/libstagefright/Android.bp
@@ -227,6 +227,7 @@
export_shared_lib_headers: [
"libgui",
+ "libhidlmemory",
"libmedia",
"android.hidl.allocator@1.0",
],