MediaCodecInfo: keep capabilities from XML when updating them from codec

Bug: 27115490
Change-Id: Ie15bf538a3026829ff8029fb8b96b8d254517d1c
diff --git a/include/media/MediaCodecInfo.h b/include/media/MediaCodecInfo.h
index e6f9661..26dc1ce 100644
--- a/include/media/MediaCodecInfo.h
+++ b/include/media/MediaCodecInfo.h
@@ -126,8 +126,9 @@
     void addQuirk(const char *name);
     status_t addMime(const char *mime);
     status_t updateMime(const char *mime);
-    // after this call Capabilities will be owned by MediaCodecInfo
-    status_t setCapabilities(const sp<Capabilities> &caps);
+  
+    // after this call |caps| will be owned by MediaCodecInfo, which may modify it
+    status_t setCapabilitiesFromCodec(const sp<Capabilities> &caps);
     void addDetail(const AString &key, const AString &value);
     void addFeature(const AString &key, int32_t value);
     void addFeature(const AString &key, const char *value);
diff --git a/media/libmedia/MediaCodecInfo.cpp b/media/libmedia/MediaCodecInfo.cpp
index 3b53f4c..8351af6 100644
--- a/media/libmedia/MediaCodecInfo.cpp
+++ b/media/libmedia/MediaCodecInfo.cpp
@@ -238,7 +238,11 @@
     }
 }
 
-status_t MediaCodecInfo::setCapabilities(const sp<Capabilities> &caps) {
+status_t MediaCodecInfo::setCapabilitiesFromCodec(const sp<Capabilities> &caps) {
+    if (mCurrentCaps != NULL) {
+        // keep current capabilities map
+        caps->mDetails = mCurrentCaps->mDetails;
+    }
     mCurrentCaps = caps;
     return OK;
 }
diff --git a/media/libstagefright/MediaCodecList.cpp b/media/libstagefright/MediaCodecList.cpp
index 34d85e7..200796c 100644
--- a/media/libstagefright/MediaCodecList.cpp
+++ b/media/libstagefright/MediaCodecList.cpp
@@ -767,7 +767,7 @@
         return UNKNOWN_ERROR;
     }
 
-    return mCurrentInfo->setCapabilities(caps);
+    return mCurrentInfo->setCapabilitiesFromCodec(caps);
 }
 
 status_t MediaCodecList::addQuirk(const char **attrs) {