stagefright: pass HIDL backed persistent surface cross binder
Bug: 67591367
Change-Id: I20b70813a96c65822c35240448fafa9e5c749ae1
diff --git a/media/libmedia/Android.bp b/media/libmedia/Android.bp
index 9d9ac8c..1a1d6b3 100644
--- a/media/libmedia/Android.bp
+++ b/media/libmedia/Android.bp
@@ -203,6 +203,7 @@
],
shared_libs: [
+ "android.hidl.token@1.0-utils",
"liblog",
"libcutils",
"libutils",
diff --git a/media/libstagefright/include/media/stagefright/PersistentSurface.h b/media/libstagefright/include/media/stagefright/PersistentSurface.h
index 173fe91..49b36c9 100644
--- a/media/libstagefright/include/media/stagefright/PersistentSurface.h
+++ b/media/libstagefright/include/media/stagefright/PersistentSurface.h
@@ -21,6 +21,7 @@
#include <android/IGraphicBufferSource.h>
#include <binder/Parcel.h>
#include <hidl/HidlSupport.h>
+#include <hidl/HybridInterface.h>
#include <gui/IGraphicBufferProducer.h>
#include <media/stagefright/foundation/ABase.h>
@@ -59,7 +60,19 @@
status_t writeToParcel(Parcel *parcel) const {
parcel->writeStrongBinder(IInterface::asBinder(mBufferProducer));
+ // this can handle null
parcel->writeStrongBinder(IInterface::asBinder(mBufferSource));
+ // write hidl target
+ if (mHidlTarget != nullptr) {
+ HalToken token;
+ bool result = createHalToken(mHidlTarget, &token);
+ parcel->writeBool(result);
+ if (result) {
+ parcel->writeByteArray(token.size(), token.data());
+ }
+ } else {
+ parcel->writeBool(false);
+ }
return NO_ERROR;
}
@@ -68,6 +81,17 @@
parcel->readStrongBinder());
mBufferSource = interface_cast<IGraphicBufferSource>(
parcel->readStrongBinder());
+ // read hidl target
+ bool haveHidlTarget = parcel->readBool();
+ if (haveHidlTarget) {
+ std::vector<uint8_t> tokenVector;
+ parcel->readByteVector(&tokenVector);
+ HalToken token = HalToken(tokenVector);
+ mHidlTarget = retrieveHalInterface(token);
+ deleteHalToken(token);
+ } else {
+ mHidlTarget.clear();
+ }
return NO_ERROR;
}