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",
     ],