Merge "Remove system library classes from DataSourceBase"
diff --git a/drm/libmediadrm/CryptoHal.cpp b/drm/libmediadrm/CryptoHal.cpp
index 4377154..61b5127 100644
--- a/drm/libmediadrm/CryptoHal.cpp
+++ b/drm/libmediadrm/CryptoHal.cpp
@@ -23,13 +23,14 @@
 
 #include <binder/IMemory.h>
 #include <cutils/native_handle.h>
-#include <media/CryptoHal.h>
+#include <hidlmemory/FrameworkUtils.h>
 #include <media/hardware/CryptoAPI.h>
 #include <media/stagefright/foundation/ADebug.h>
 #include <media/stagefright/foundation/AString.h>
 #include <media/stagefright/foundation/hexdump.h>
 #include <media/stagefright/MediaErrors.h>
-#include <hidlmemory/FrameworkUtils.h>
+#include <mediadrm/CryptoHal.h>
+
 
 using ::android::hardware::drm::V1_0::BufferType;
 using ::android::hardware::drm::V1_0::DestinationBuffer;
diff --git a/drm/libmediadrm/DrmHal.cpp b/drm/libmediadrm/DrmHal.cpp
index 068a52b..292895f 100644
--- a/drm/libmediadrm/DrmHal.cpp
+++ b/drm/libmediadrm/DrmHal.cpp
@@ -27,9 +27,6 @@
 #include <android/hidl/manager/1.0/IServiceManager.h>
 #include <hidl/ServiceManagement.h>
 
-#include <media/DrmHal.h>
-#include <media/DrmSessionClientInterface.h>
-#include <media/DrmSessionManager.h>
 #include <media/EventMetric.h>
 #include <media/PluginMetricsReporting.h>
 #include <media/drm/DrmAPI.h>
@@ -37,6 +34,9 @@
 #include <media/stagefright/foundation/AString.h>
 #include <media/stagefright/foundation/hexdump.h>
 #include <media/stagefright/MediaErrors.h>
+#include <mediadrm/DrmHal.h>
+#include <mediadrm/DrmSessionClientInterface.h>
+#include <mediadrm/DrmSessionManager.h>
 
 using drm::V1_0::KeyedVector;
 using drm::V1_0::KeyStatusType;
@@ -771,7 +771,8 @@
     Mutex::Autolock autoLock(mLock);
     INIT_CHECK();
 
-    return toStatusT(mPlugin->removeKeys(toHidlVec(keySetId)));
+    Return<Status> status = mPlugin->removeKeys(toHidlVec(keySetId));
+    return status.isOk() ? toStatusT(status) : DEAD_OBJECT;
 }
 
 status_t DrmHal::restoreKeys(Vector<uint8_t> const &sessionId,
@@ -781,8 +782,9 @@
 
     DrmSessionManager::Instance()->useSession(sessionId);
 
-    return toStatusT(mPlugin->restoreKeys(toHidlVec(sessionId),
-                    toHidlVec(keySetId)));
+    Return<Status> status = mPlugin->restoreKeys(toHidlVec(sessionId),
+            toHidlVec(keySetId));
+    return status.isOk() ? toStatusT(status) : DEAD_OBJECT;
 }
 
 status_t DrmHal::queryKeyStatus(Vector<uint8_t> const &sessionId,
@@ -923,13 +925,15 @@
     Mutex::Autolock autoLock(mLock);
     INIT_CHECK();
 
+    Return<Status> status(Status::ERROR_DRM_UNKNOWN);
     if (mPluginV1_1 != NULL) {
         SecureStopRelease secureStopRelease;
         secureStopRelease.opaqueData = toHidlVec(ssRelease);
-        return toStatusT(mPluginV1_1->releaseSecureStops(secureStopRelease));
+        status = mPluginV1_1->releaseSecureStops(secureStopRelease);
+    } else {
+        status = mPlugin->releaseSecureStop(toHidlVec(ssRelease));
     }
-
-    return toStatusT(mPlugin->releaseSecureStop(toHidlVec(ssRelease)));
+    return status.isOk() ? toStatusT(status) : DEAD_OBJECT;
 }
 
 status_t DrmHal::removeSecureStop(Vector<uint8_t> const &ssid) {
@@ -943,17 +947,21 @@
         return ERROR_DRM_CANNOT_HANDLE;
     }
 
-    return toStatusT(mPluginV1_1->removeSecureStop(toHidlVec(ssid)));
+    Return<Status> status = mPluginV1_1->removeSecureStop(toHidlVec(ssid));
+    return status.isOk() ? toStatusT(status) : DEAD_OBJECT;
 }
 
 status_t DrmHal::removeAllSecureStops() {
     Mutex::Autolock autoLock(mLock);
     INIT_CHECK();
 
+    Return<Status> status(Status::ERROR_DRM_UNKNOWN);
     if (mPluginV1_1 != NULL) {
-        return toStatusT(mPluginV1_1->removeAllSecureStops());
+        status = mPluginV1_1->removeAllSecureStops();
+    } else {
+        status = mPlugin->releaseAllSecureStops();
     }
-    return toStatusT(mPlugin->releaseAllSecureStops());
+    return status.isOk() ? toStatusT(status) : DEAD_OBJECT;
 }
 
 status_t DrmHal::getHdcpLevels(DrmPlugin::HdcpLevel *connected,
@@ -1099,9 +1107,9 @@
     Mutex::Autolock autoLock(mLock);
     INIT_CHECK();
 
-    Status status = mPlugin->setPropertyString(toHidlString(name),
+    Return<Status> status = mPlugin->setPropertyString(toHidlString(name),
             toHidlString(value));
-    return toStatusT(status);
+    return status.isOk() ? toStatusT(status) : DEAD_OBJECT;
 }
 
 status_t DrmHal::setPropertyByteArray(String8 const &name,
@@ -1109,9 +1117,9 @@
     Mutex::Autolock autoLock(mLock);
     INIT_CHECK();
 
-    Status status = mPlugin->setPropertyByteArray(toHidlString(name),
+    Return<Status> status = mPlugin->setPropertyByteArray(toHidlString(name),
             toHidlVec(value));
-    return toStatusT(status);
+    return status.isOk() ? toStatusT(status) : DEAD_OBJECT;
 }
 
 status_t DrmHal::getMetrics(PersistableBundle* item) {
diff --git a/drm/libmediadrm/DrmMetrics.cpp b/drm/libmediadrm/DrmMetrics.cpp
index 03bd88a..96cc2cd 100644
--- a/drm/libmediadrm/DrmMetrics.cpp
+++ b/drm/libmediadrm/DrmMetrics.cpp
@@ -18,8 +18,8 @@
 #include <utility>
 
 #include <android-base/macros.h>
-#include <media/DrmMetrics.h>
 #include <media/stagefright/foundation/base64.h>
+#include <mediadrm/DrmMetrics.h>
 #include <sys/time.h>
 #include <utils/Log.h>
 #include <utils/Timers.h>
diff --git a/drm/libmediadrm/DrmPluginPath.cpp b/drm/libmediadrm/DrmPluginPath.cpp
index c760825..ac8607c 100644
--- a/drm/libmediadrm/DrmPluginPath.cpp
+++ b/drm/libmediadrm/DrmPluginPath.cpp
@@ -19,7 +19,7 @@
 #include <utils/Log.h>
 
 #include <cutils/properties.h>
-#include <media/DrmPluginPath.h>
+#include <mediadrm/DrmPluginPath.h>
 
 namespace android {
 
diff --git a/drm/libmediadrm/DrmSessionManager.cpp b/drm/libmediadrm/DrmSessionManager.cpp
index 02270d0..375644c 100644
--- a/drm/libmediadrm/DrmSessionManager.cpp
+++ b/drm/libmediadrm/DrmSessionManager.cpp
@@ -21,9 +21,9 @@
 #include <binder/IPCThreadState.h>
 #include <binder/IProcessInfoService.h>
 #include <binder/IServiceManager.h>
-#include <media/DrmSessionManager.h>
-#include <media/DrmSessionClientInterface.h>
 #include <media/stagefright/ProcessInfo.h>
+#include <mediadrm/DrmSessionClientInterface.h>
+#include <mediadrm/DrmSessionManager.h>
 #include <unistd.h>
 #include <utils/String8.h>
 
diff --git a/drm/libmediadrm/ICrypto.cpp b/drm/libmediadrm/ICrypto.cpp
index 1d70a4e..40aeb9f 100644
--- a/drm/libmediadrm/ICrypto.cpp
+++ b/drm/libmediadrm/ICrypto.cpp
@@ -19,10 +19,10 @@
 #include <binder/Parcel.h>
 #include <binder/IMemory.h>
 #include <cutils/log.h>
-#include <media/ICrypto.h>
 #include <media/stagefright/MediaErrors.h>
 #include <media/stagefright/foundation/ADebug.h>
 #include <media/stagefright/foundation/AString.h>
+#include <mediadrm/ICrypto.h>
 #include <utils/Log.h>
 
 namespace android {
diff --git a/drm/libmediadrm/IDrm.cpp b/drm/libmediadrm/IDrm.cpp
index 22e4e6c..509961f 100644
--- a/drm/libmediadrm/IDrm.cpp
+++ b/drm/libmediadrm/IDrm.cpp
@@ -19,10 +19,10 @@
 #include <utils/Log.h>
 
 #include <binder/Parcel.h>
-#include <media/IDrm.h>
 #include <media/stagefright/MediaErrors.h>
 #include <media/stagefright/foundation/ADebug.h>
 #include <media/stagefright/foundation/AString.h>
+#include <mediadrm/IDrm.h>
 
 namespace android {
 
diff --git a/drm/libmediadrm/IDrmClient.cpp b/drm/libmediadrm/IDrmClient.cpp
index 444201f..357de9d 100644
--- a/drm/libmediadrm/IDrmClient.cpp
+++ b/drm/libmediadrm/IDrmClient.cpp
@@ -24,7 +24,7 @@
 #include <binder/Parcel.h>
 
 #include <media/IMediaPlayerClient.h>
-#include <media/IDrmClient.h>
+#include <mediadrm/IDrmClient.h>
 
 namespace android {
 
diff --git a/drm/libmediadrm/IMediaDrmService.cpp b/drm/libmediadrm/IMediaDrmService.cpp
index 84812dc..f320d0b 100644
--- a/drm/libmediadrm/IMediaDrmService.cpp
+++ b/drm/libmediadrm/IMediaDrmService.cpp
@@ -20,9 +20,9 @@
 
 #include <binder/Parcel.h>
 #include <binder/IMemory.h>
-#include <media/ICrypto.h>
-#include <media/IDrm.h>
-#include <media/IMediaDrmService.h>
+#include <mediadrm/ICrypto.h>
+#include <mediadrm/IDrm.h>
+#include <mediadrm/IMediaDrmService.h>
 
 #include <utils/Errors.h>  // for status_t
 #include <utils/String8.h>
diff --git a/drm/libmediadrm/SharedLibrary.cpp b/drm/libmediadrm/SharedLibrary.cpp
index bebafa8..b2d635d 100644
--- a/drm/libmediadrm/SharedLibrary.cpp
+++ b/drm/libmediadrm/SharedLibrary.cpp
@@ -19,7 +19,7 @@
 
 #include <dlfcn.h>
 #include <media/stagefright/foundation/ADebug.h>
-#include <media/SharedLibrary.h>
+#include <mediadrm/SharedLibrary.h>
 #include <utils/Log.h>
 
 namespace android {
diff --git a/drm/libmediadrm/tests/DrmMetrics_test.cpp b/drm/libmediadrm/tests/DrmMetrics_test.cpp
index fe762c9..7303806 100644
--- a/drm/libmediadrm/tests/DrmMetrics_test.cpp
+++ b/drm/libmediadrm/tests/DrmMetrics_test.cpp
@@ -15,7 +15,7 @@
  */
 
 #define LOG_TAG "DrmMetricsTest"
-#include "DrmMetrics.h"
+#include "mediadrm/DrmMetrics.h"
 
 #include <binder/PersistableBundle.h>
 #include <google/protobuf/text_format.h>
diff --git a/include/media/Crypto.h b/include/mediadrm/Crypto.h
similarity index 100%
rename from include/media/Crypto.h
rename to include/mediadrm/Crypto.h
diff --git a/include/media/CryptoHal.h b/include/mediadrm/CryptoHal.h
similarity index 100%
rename from include/media/CryptoHal.h
rename to include/mediadrm/CryptoHal.h
diff --git a/include/media/Drm.h b/include/mediadrm/Drm.h
similarity index 100%
rename from include/media/Drm.h
rename to include/mediadrm/Drm.h
diff --git a/include/media/DrmHal.h b/include/mediadrm/DrmHal.h
similarity index 100%
rename from include/media/DrmHal.h
rename to include/mediadrm/DrmHal.h
diff --git a/include/media/DrmMetrics.h b/include/mediadrm/DrmMetrics.h
similarity index 100%
rename from include/media/DrmMetrics.h
rename to include/mediadrm/DrmMetrics.h
diff --git a/include/media/DrmPluginPath.h b/include/mediadrm/DrmPluginPath.h
similarity index 100%
rename from include/media/DrmPluginPath.h
rename to include/mediadrm/DrmPluginPath.h
diff --git a/include/media/DrmSessionClientInterface.h b/include/mediadrm/DrmSessionClientInterface.h
similarity index 100%
rename from include/media/DrmSessionClientInterface.h
rename to include/mediadrm/DrmSessionClientInterface.h
diff --git a/include/media/DrmSessionManager.h b/include/mediadrm/DrmSessionManager.h
similarity index 100%
rename from include/media/DrmSessionManager.h
rename to include/mediadrm/DrmSessionManager.h
diff --git a/include/media/ICrypto.h b/include/mediadrm/ICrypto.h
similarity index 100%
rename from include/media/ICrypto.h
rename to include/mediadrm/ICrypto.h
diff --git a/include/media/IDrm.h b/include/mediadrm/IDrm.h
similarity index 100%
rename from include/media/IDrm.h
rename to include/mediadrm/IDrm.h
diff --git a/include/media/IDrmClient.h b/include/mediadrm/IDrmClient.h
similarity index 100%
rename from include/media/IDrmClient.h
rename to include/mediadrm/IDrmClient.h
diff --git a/include/media/IMediaDrmService.h b/include/mediadrm/IMediaDrmService.h
similarity index 100%
rename from include/media/IMediaDrmService.h
rename to include/mediadrm/IMediaDrmService.h
diff --git a/include/mediadrm/OWNERS b/include/mediadrm/OWNERS
new file mode 100644
index 0000000..e788754
--- /dev/null
+++ b/include/mediadrm/OWNERS
@@ -0,0 +1 @@
+jtinker@google.com
diff --git a/include/media/SharedLibrary.h b/include/mediadrm/SharedLibrary.h
similarity index 100%
rename from include/media/SharedLibrary.h
rename to include/mediadrm/SharedLibrary.h
diff --git a/media/libaaudio/src/client/AudioStreamInternalPlay.cpp b/media/libaaudio/src/client/AudioStreamInternalPlay.cpp
index 5660c1b..a0a0a54 100644
--- a/media/libaaudio/src/client/AudioStreamInternalPlay.cpp
+++ b/media/libaaudio/src/client/AudioStreamInternalPlay.cpp
@@ -38,6 +38,18 @@
 
 AudioStreamInternalPlay::~AudioStreamInternalPlay() {}
 
+constexpr int kRampMSec = 10; // time to apply a change in volume
+
+aaudio_result_t AudioStreamInternalPlay::open(const AudioStreamBuilder &builder) {
+    aaudio_result_t result = AudioStreamInternal::open(builder);
+    if (result == AAUDIO_OK) {
+        // Sample rate is constrained to common values by now and should not overflow.
+        int32_t numFrames = kRampMSec * getSampleRate() / AAUDIO_MILLIS_PER_SECOND;
+        mVolumeRamp.setLengthInFrames(numFrames);
+    }
+    return result;
+}
+
 aaudio_result_t AudioStreamInternalPlay::requestPause()
 {
     aaudio_result_t result = stopCallback();
@@ -45,7 +57,7 @@
         return result;
     }
     if (mServiceStreamHandle == AAUDIO_HANDLE_INVALID) {
-        ALOGE("AudioStreamInternal::requestPauseInternal() mServiceStreamHandle invalid = 0x%08X",
+        ALOGE("requestPauseInternal() mServiceStreamHandle invalid = 0x%08X",
               mServiceStreamHandle);
         return AAUDIO_ERROR_INVALID_STATE;
     }
diff --git a/media/libaaudio/src/client/AudioStreamInternalPlay.h b/media/libaaudio/src/client/AudioStreamInternalPlay.h
index 04e4a62..977a909 100644
--- a/media/libaaudio/src/client/AudioStreamInternalPlay.h
+++ b/media/libaaudio/src/client/AudioStreamInternalPlay.h
@@ -33,6 +33,8 @@
     AudioStreamInternalPlay(AAudioServiceInterface  &serviceInterface, bool inService = false);
     virtual ~AudioStreamInternalPlay();
 
+    aaudio_result_t open(const AudioStreamBuilder &builder) override;
+
     aaudio_result_t requestPause() override;
 
     aaudio_result_t requestFlush() override;
diff --git a/media/libmedia/include/media/CryptoHal.h b/media/libmedia/include/media/CryptoHal.h
index ed16f44..4414e9d 100644
--- a/media/libmedia/include/media/CryptoHal.h
+++ b/media/libmedia/include/media/CryptoHal.h
@@ -22,7 +22,7 @@
 #include <android/hardware/drm/1.0/ICryptoPlugin.h>
 #include <android/hardware/drm/1.1/ICryptoFactory.h>
 
-#include <media/ICrypto.h>
+#include <mediadrm/ICrypto.h>
 #include <utils/KeyedVector.h>
 #include <utils/threads.h>
 
diff --git a/media/libmedia/include/media/DrmHal.h b/media/libmedia/include/media/DrmHal.h
index c64b003..b0e1cc8 100644
--- a/media/libmedia/include/media/DrmHal.h
+++ b/media/libmedia/include/media/DrmHal.h
@@ -24,10 +24,10 @@
 #include <android/hardware/drm/1.1/IDrmFactory.h>
 #include <android/hardware/drm/1.1/IDrmPlugin.h>
 
-#include <media/DrmMetrics.h>
-#include <media/IDrm.h>
-#include <media/IDrmClient.h>
 #include <media/MediaAnalyticsItem.h>
+#include <mediadrm/DrmMetrics.h>
+#include <mediadrm/IDrm.h>
+#include <mediadrm/IDrmClient.h>
 #include <utils/threads.h>
 
 namespace drm = ::android::hardware::drm;
diff --git a/media/libmedia/include/media/IDrm.h b/media/libmedia/include/media/IDrm.h
index a19b06b..8e9eb3a 100644
--- a/media/libmedia/include/media/IDrm.h
+++ b/media/libmedia/include/media/IDrm.h
@@ -18,8 +18,8 @@
 #include <binder/PersistableBundle.h>
 #include <media/stagefright/foundation/ABase.h>
 #include <media/drm/DrmAPI.h>
-#include <media/IDrmClient.h>
 #include <media/MediaAnalyticsItem.h>
+#include <mediadrm/IDrmClient.h>
 
 #ifndef ANDROID_IDRM_H_
 
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDrm.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDrm.cpp
index 165e483..bde0862 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDrm.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDrm.cpp
@@ -20,7 +20,7 @@
 #include "NuPlayerDrm.h"
 
 #include <binder/IServiceManager.h>
-#include <media/IMediaDrmService.h>
+#include <mediadrm/IMediaDrmService.h>
 #include <utils/Log.h>
 
 
diff --git a/media/libmediaplayerservice/tests/DrmSessionManager_test.cpp b/media/libmediaplayerservice/tests/DrmSessionManager_test.cpp
index 2c6a41b..d81ee05 100644
--- a/media/libmediaplayerservice/tests/DrmSessionManager_test.cpp
+++ b/media/libmediaplayerservice/tests/DrmSessionManager_test.cpp
@@ -20,11 +20,11 @@
 
 #include <gtest/gtest.h>
 
-#include <media/DrmHal.h>
-#include <media/DrmSessionClientInterface.h>
-#include <media/DrmSessionManager.h>
 #include <media/stagefright/foundation/ADebug.h>
 #include <media/stagefright/ProcessInfoInterface.h>
+#include <mediadrm/DrmHal.h>
+#include <mediadrm/DrmSessionClientInterface.h>
+#include <mediadrm/DrmSessionManager.h>
 
 namespace android {
 
diff --git a/media/libstagefright/codec2/vndk/bufferpool/Android.bp b/media/libstagefright/codec2/vndk/bufferpool/Android.bp
index f0588d5..c7aa07b 100644
--- a/media/libstagefright/codec2/vndk/bufferpool/Android.bp
+++ b/media/libstagefright/codec2/vndk/bufferpool/Android.bp
@@ -1,5 +1,5 @@
-cc_library_shared {
-    name: "android.hardware.media.bufferpool@1.0-impl",
+cc_library {
+    name: "libstagefright_bufferpool@1.0",
     vendor_available: true,
     vndk: {
         enabled: true,
diff --git a/media/libstagefright/codec2/vndk/bufferpool/vts/Android.bp b/media/libstagefright/codec2/vndk/bufferpool/vts/Android.bp
new file mode 100644
index 0000000..074d4bc
--- /dev/null
+++ b/media/libstagefright/codec2/vndk/bufferpool/vts/Android.bp
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2018 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.
+ */
+
+cc_test {
+    name: "VtsVndkHidlBufferpoolV1_0TargetSingleTest",
+    defaults: ["VtsHalTargetTestDefaults"],
+    srcs: [
+        "single.cpp",
+    ],
+    static_libs: [
+        "android.hardware.media.bufferpool@1.0",
+        "libion",
+        "libstagefright_bufferpool@1.0",
+    ],
+    shared_libs: [
+        "libfmq",
+        "libstagefright_codec2",
+        "libstagefright_codec2_vndk",
+    ],
+    compile_multilib: "both",
+}
+
+cc_test {
+    name: "VtsVndkHidlBufferpoolV1_0TargetMultiTest",
+    defaults: ["VtsHalTargetTestDefaults"],
+    srcs: [
+        "multi.cpp",
+    ],
+    static_libs: [
+        "android.hardware.media.bufferpool@1.0",
+        "libion",
+        "libstagefright_bufferpool@1.0",
+    ],
+    shared_libs: [
+        "libfmq",
+        "libstagefright_codec2",
+        "libstagefright_codec2_vndk",
+    ],
+    compile_multilib: "both",
+}
diff --git a/media/libstagefright/codec2/vndk/bufferpool/vts/OWNERS b/media/libstagefright/codec2/vndk/bufferpool/vts/OWNERS
new file mode 100644
index 0000000..4c3f7a1
--- /dev/null
+++ b/media/libstagefright/codec2/vndk/bufferpool/vts/OWNERS
@@ -0,0 +1,7 @@
+# Media team
+taklee@google.com
+lajos@google.com
+
+# VTS team
+yim@google.com
+zhuoyao@google.com
diff --git a/media/libstagefright/codec2/vndk/bufferpool/vts/multi.cpp b/media/libstagefright/codec2/vndk/bufferpool/vts/multi.cpp
new file mode 100644
index 0000000..3ad8b6c
--- /dev/null
+++ b/media/libstagefright/codec2/vndk/bufferpool/vts/multi.cpp
@@ -0,0 +1,240 @@
+/*
+ * Copyright (C) 2018 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.
+ */
+
+#define LOG_TAG "buffferpool_unit_test"
+
+#include <gtest/gtest.h>
+
+#include <C2AllocatorIon.h>
+#include <C2Buffer.h>
+#include <C2PlatformSupport.h>
+#include <ClientManager.h>
+#include <android-base/logging.h>
+#include <binder/ProcessState.h>
+#include <hidl/HidlSupport.h>
+#include <hidl/HidlTransportSupport.h>
+#include <hidl/LegacySupport.h>
+#include <hidl/Status.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include <iostream>
+#include <memory>
+#include <vector>
+
+using android::C2AllocatorIon;
+using android::C2PlatformAllocatorStore;
+using android::hardware::configureRpcThreadpool;
+using android::hardware::hidl_handle;
+using android::hardware::media::bufferpool::V1_0::IAccessor;
+using android::hardware::media::bufferpool::V1_0::IClientManager;
+using android::hardware::media::bufferpool::V1_0::ResultStatus;
+using android::hardware::media::bufferpool::V1_0::implementation::BufferId;
+using android::hardware::media::bufferpool::V1_0::implementation::ClientManager;
+using android::hardware::media::bufferpool::V1_0::implementation::ConnectionId;
+using android::hardware::media::bufferpool::V1_0::implementation::TransactionId;
+
+namespace {
+
+// Buffer allocation size for tests.
+constexpr static int kAllocationSize = 1024 * 10;
+
+// communication message types between processes.
+enum PipeCommand : int32_t {
+    INIT_OK = 0,
+    INIT_ERROR,
+    SEND,
+    RECEIVE_OK,
+    RECEIVE_ERROR,
+};
+
+// communication message between processes.
+union PipeMessage {
+    struct  {
+        int32_t command;
+        BufferId bufferId;
+        ConnectionId connectionId;
+        TransactionId transactionId;
+        int64_t  timestampUs;
+    } data;
+    char array[0];
+};
+
+// media.bufferpool test setup
+class BufferpoolMultiTest : public ::testing::Test {
+ public:
+  virtual void SetUp() override {
+    ResultStatus status;
+    mReceiverPid = -1;
+
+    ASSERT_TRUE(pipe(mCommandPipeFds) == 0);
+    ASSERT_TRUE(pipe(mResultPipeFds) == 0);
+
+    mReceiverPid = fork();
+    ASSERT_TRUE(mReceiverPid >= 0);
+
+    if (mReceiverPid == 0) {
+       doReceiver();
+       return;
+    }
+
+    mManager = ClientManager::getInstance();
+    ASSERT_NE(mManager, nullptr);
+
+    mAllocator =
+        std::make_shared<C2AllocatorIon>(C2PlatformAllocatorStore::ION);
+    ASSERT_TRUE((bool)mAllocator);
+
+    status = mManager->create(mAllocator, true, &mConnectionId);
+    ASSERT_TRUE(status == ResultStatus::OK);
+
+    status = mManager->getAccessor(mConnectionId, &mAccessor);
+    ASSERT_TRUE(status == ResultStatus::OK && (bool)mAccessor);
+  }
+
+  virtual void TearDown() override {
+      if (mReceiverPid > 0) {
+          kill(mReceiverPid, SIGKILL);
+          int wstatus;
+          wait(&wstatus);
+      }
+  }
+
+ protected:
+  static void description(const std::string& description) {
+    RecordProperty("description", description);
+  }
+
+  android::sp<ClientManager> mManager;
+  android::sp<IAccessor> mAccessor;
+  std::shared_ptr<C2Allocator> mAllocator;
+  ConnectionId mConnectionId;
+  pid_t mReceiverPid;
+  int mCommandPipeFds[2];
+  int mResultPipeFds[2];
+
+  void getAllocationParams(std::vector<uint8_t>* vecParams) {
+    union Params {
+      struct {
+        uint32_t capacity;
+        C2MemoryUsage usage;
+      } data;
+      uint8_t array[0];
+      Params()
+          : data{kAllocationSize,
+                 {C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE}} {}
+    } params;
+    vecParams->assign(params.array, params.array + sizeof(params));
+  }
+
+  bool sendMessage(int *pipes, const PipeMessage &message) {
+    int ret = write(pipes[1], message.array, sizeof(PipeMessage));
+    return ret == sizeof(PipeMessage);
+  }
+
+  bool receiveMessage(int *pipes, PipeMessage *message) {
+    int ret = read(pipes[0], message->array, sizeof(PipeMessage));
+    return ret == sizeof(PipeMessage);
+  }
+
+  void doReceiver() {
+    configureRpcThreadpool(1, false);
+    PipeMessage message;
+    mManager = ClientManager::getInstance();
+    if (!mManager) {
+      message.data.command = PipeCommand::INIT_ERROR;
+      sendMessage(mResultPipeFds, message);
+      return;
+    }
+    android::status_t status = mManager->registerAsService();
+    if (status != android::OK) {
+      message.data.command = PipeCommand::INIT_ERROR;
+      sendMessage(mResultPipeFds, message);
+      return;
+    }
+    message.data.command = PipeCommand::INIT_OK;
+    sendMessage(mResultPipeFds, message);
+
+    receiveMessage(mCommandPipeFds, &message);
+    {
+      std::shared_ptr<_C2BlockPoolData> rbuffer;
+      ResultStatus status = mManager->receive(
+          message.data.connectionId, message.data.transactionId,
+          message.data.bufferId, message.data.timestampUs, &rbuffer);
+      if (status != ResultStatus::OK) {
+        message.data.command = PipeCommand::RECEIVE_ERROR;
+        sendMessage(mResultPipeFds, message);
+        return;
+      }
+    }
+    message.data.command = PipeCommand::RECEIVE_OK;
+    sendMessage(mResultPipeFds, message);
+    while(1); // An easy way to ignore gtest behaviour.
+  }
+};
+
+// Buffer transfer test between processes.
+TEST_F(BufferpoolMultiTest, TransferBuffer) {
+  ResultStatus status;
+  PipeMessage message;
+
+  ASSERT_TRUE(receiveMessage(mResultPipeFds, &message));
+
+  android::sp<IClientManager> receiver = IClientManager::getService();
+  ConnectionId receiverId;
+  ASSERT_TRUE((bool)receiver);
+
+  receiver->registerSender(
+      mAccessor, [&status, &receiverId]
+      (ResultStatus outStatus, ConnectionId outId) {
+        status = outStatus;
+        receiverId = outId;
+      });
+  ASSERT_TRUE(status == ResultStatus::OK);
+  {
+    std::shared_ptr<_C2BlockPoolData> sbuffer;
+    TransactionId transactionId;
+    int64_t postUs;
+    std::vector<uint8_t> vecParams;
+
+    getAllocationParams(&vecParams);
+    status = mManager->allocate(mConnectionId, vecParams, &sbuffer);
+    ASSERT_TRUE(status == ResultStatus::OK);
+
+    status = mManager->postSend(mConnectionId, receiverId, sbuffer,
+                               &transactionId, &postUs);
+    ASSERT_TRUE(status == ResultStatus::OK);
+
+    message.data.command = PipeCommand::SEND;
+    message.data.bufferId = sbuffer->mId;
+    message.data.connectionId = receiverId;
+    message.data.transactionId = transactionId;
+    message.data.timestampUs = postUs;
+    sendMessage(mCommandPipeFds, message);
+  }
+  EXPECT_TRUE(receiveMessage(mResultPipeFds, &message));
+}
+
+}  // anonymous namespace
+
+int main(int argc, char** argv) {
+  setenv("TREBLE_TESTING_OVERRIDE", "true", true);
+  ::testing::InitGoogleTest(&argc, argv);
+  int status = RUN_ALL_TESTS();
+  LOG(INFO) << "Test result = " << status;
+  return status;
+}
diff --git a/media/libstagefright/codec2/vndk/bufferpool/vts/single.cpp b/media/libstagefright/codec2/vndk/bufferpool/vts/single.cpp
new file mode 100644
index 0000000..89eb631
--- /dev/null
+++ b/media/libstagefright/codec2/vndk/bufferpool/vts/single.cpp
@@ -0,0 +1,182 @@
+/*
+ * Copyright (C) 2018 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.
+ */
+
+#define LOG_TAG "buffferpool_unit_test"
+
+#include <gtest/gtest.h>
+
+#include <C2AllocatorIon.h>
+#include <C2Buffer.h>
+#include <C2PlatformSupport.h>
+#include <ClientManager.h>
+#include <android-base/logging.h>
+#include <binder/ProcessState.h>
+#include <hidl/HidlSupport.h>
+#include <hidl/HidlTransportSupport.h>
+#include <hidl/LegacySupport.h>
+#include <hidl/Status.h>
+#include <unistd.h>
+#include <iostream>
+#include <memory>
+#include <vector>
+
+using android::C2AllocatorIon;
+using android::C2PlatformAllocatorStore;
+using android::hardware::hidl_handle;
+using android::hardware::media::bufferpool::V1_0::IAccessor;
+using android::hardware::media::bufferpool::V1_0::ResultStatus;
+using android::hardware::media::bufferpool::V1_0::implementation::BufferId;
+using android::hardware::media::bufferpool::V1_0::implementation::ClientManager;
+using android::hardware::media::bufferpool::V1_0::implementation::ConnectionId;
+using android::hardware::media::bufferpool::V1_0::implementation::TransactionId;
+
+namespace {
+
+// Buffer allocation size for tests.
+constexpr static int kAllocationSize = 1024 * 10;
+
+// Number of iteration for buffer allocation test.
+constexpr static int kNumAllocationTest = 3;
+
+// Number of iteration for buffer recycling test.
+constexpr static int kNumRecycleTest = 3;
+
+// media.bufferpool test setup
+class BufferpoolSingleTest : public ::testing::Test {
+ public:
+  virtual void SetUp() override {
+    ResultStatus status;
+
+    mManager = ClientManager::getInstance();
+    ASSERT_NE(mManager, nullptr);
+
+    mAllocator =
+        std::make_shared<C2AllocatorIon>(C2PlatformAllocatorStore::ION);
+    ASSERT_TRUE((bool)mAllocator);
+
+    status = mManager->create(mAllocator, true, &mConnectionId);
+    ASSERT_TRUE(status == ResultStatus::OK);
+
+    status = mManager->getAccessor(mConnectionId, &mAccessor);
+    ASSERT_TRUE(status == ResultStatus::OK && (bool)mAccessor);
+
+    ConnectionId& receiverId = mReceiverId;
+    mManager->registerSender(
+        mAccessor,
+        [&status, &receiverId](ResultStatus hidlStatus, ConnectionId hidlId) {
+          status = hidlStatus;
+          receiverId = hidlId;
+        });
+    ASSERT_TRUE(status == ResultStatus::ALREADY_EXISTS &&
+                receiverId == mConnectionId);
+  }
+
+ protected:
+  static void description(const std::string& description) {
+    RecordProperty("description", description);
+  }
+
+  android::sp<ClientManager> mManager;
+  android::sp<IAccessor> mAccessor;
+  std::shared_ptr<C2Allocator> mAllocator;
+  ConnectionId mConnectionId;
+  ConnectionId mReceiverId;
+
+  void getAllocationParams(std::vector<uint8_t>* vecParams) {
+    union Params {
+      struct {
+        uint32_t capacity;
+        C2MemoryUsage usage;
+      } data;
+      uint8_t array[0];
+      Params()
+          : data{kAllocationSize,
+                 {C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE}} {}
+    } params;
+    vecParams->assign(params.array, params.array + sizeof(params));
+  }
+};
+
+// Buffer allocation test.
+// Check whether each buffer allocation is done successfully with
+// unique buffer id.
+TEST_F(BufferpoolSingleTest, AllocateBuffer) {
+  ResultStatus status;
+  std::vector<uint8_t> vecParams;
+  getAllocationParams(&vecParams);
+
+  std::shared_ptr<_C2BlockPoolData> buffer[kNumAllocationTest];
+  for (int i = 0; i < kNumAllocationTest; ++i) {
+    status = mManager->allocate(mConnectionId, vecParams, &buffer[i]);
+    ASSERT_TRUE(status == ResultStatus::OK);
+  }
+  for (int i = 0; i < kNumAllocationTest; ++i) {
+    for (int j = i + 1; j < kNumAllocationTest; ++j) {
+      ASSERT_TRUE(buffer[i]->mId != buffer[j]->mId);
+    }
+  }
+  EXPECT_TRUE(kNumAllocationTest > 1);
+}
+
+// Buffer recycle test.
+// Check whether de-allocated buffers are recycled.
+TEST_F(BufferpoolSingleTest, RecycleBuffer) {
+  ResultStatus status;
+  std::vector<uint8_t> vecParams;
+  getAllocationParams(&vecParams);
+
+  BufferId bid[kNumRecycleTest];
+  for (int i = 0; i < kNumRecycleTest; ++i) {
+    std::shared_ptr<_C2BlockPoolData> buffer;
+    status = mManager->allocate(mConnectionId, vecParams, &buffer);
+    ASSERT_TRUE(status == ResultStatus::OK);
+    bid[i] = buffer->mId;
+  }
+  for (int i = 1; i < kNumRecycleTest; ++i) {
+    ASSERT_TRUE(bid[i - 1] == bid[i]);
+  }
+  EXPECT_TRUE(kNumRecycleTest > 1);
+}
+
+// Buffer transfer test.
+// Check whether buffer is transferred to another client successfully.
+TEST_F(BufferpoolSingleTest, TransferBuffer) {
+  ResultStatus status;
+  std::vector<uint8_t> vecParams;
+  getAllocationParams(&vecParams);
+  std::shared_ptr<_C2BlockPoolData> sbuffer, rbuffer;
+
+  TransactionId transactionId;
+  int64_t postUs;
+
+  status = mManager->allocate(mConnectionId, vecParams, &sbuffer);
+  ASSERT_TRUE(status == ResultStatus::OK);
+  status = mManager->postSend(mConnectionId, mReceiverId, sbuffer,
+                              &transactionId, &postUs);
+  ASSERT_TRUE(status == ResultStatus::OK);
+  status = mManager->receive(mReceiverId, transactionId, sbuffer->mId, postUs,
+                             &rbuffer);
+  EXPECT_TRUE(status == ResultStatus::OK);
+}
+
+}  // anonymous namespace
+
+int main(int argc, char** argv) {
+  ::testing::InitGoogleTest(&argc, argv);
+  int status = RUN_ALL_TESTS();
+  LOG(INFO) << "Test result = " << status;
+  return status;
+}
diff --git a/services/mediadrm/MediaDrmService.cpp b/services/mediadrm/MediaDrmService.cpp
index a368c11..5afd079 100644
--- a/services/mediadrm/MediaDrmService.cpp
+++ b/services/mediadrm/MediaDrmService.cpp
@@ -24,8 +24,8 @@
 #include <binder/IServiceManager.h>
 #include <utils/Log.h>
 
-#include <media/CryptoHal.h>
-#include <media/DrmHal.h>
+#include <mediadrm/CryptoHal.h>
+#include <mediadrm/DrmHal.h>
 
 namespace android {
 
diff --git a/services/mediadrm/MediaDrmService.h b/services/mediadrm/MediaDrmService.h
index ecc2da7..3607201 100644
--- a/services/mediadrm/MediaDrmService.h
+++ b/services/mediadrm/MediaDrmService.h
@@ -24,7 +24,7 @@
 
 #include <media/Metadata.h>
 #include <media/stagefright/foundation/ABase.h>
-#include <media/IMediaDrmService.h>
+#include <mediadrm/IMediaDrmService.h>
 
 namespace android {