Merge "Clone fence inside QueueBufferInput on retrieval."
diff --git a/media/libstagefright/omx/hal/1.0/impl/Conversion.h b/media/libstagefright/omx/hal/1.0/impl/Conversion.h
index d5cf029..117d1c8 100644
--- a/media/libstagefright/omx/hal/1.0/impl/Conversion.h
+++ b/media/libstagefright/omx/hal/1.0/impl/Conversion.h
@@ -1018,7 +1018,7 @@
if (*nh == nullptr) {
return NO_MEMORY;
}
- *fence = hidl_handle(*nh);
+ *fence = *nh;
++fds;
--numFds;
} else {
@@ -1264,6 +1264,7 @@
return NO_MEMORY;
}
+ *nh = nullptr;
::android::FenceTime::Snapshot::State state;
FlattenableUtils::read(buffer, size, state);
switch (state) {
@@ -1865,6 +1866,7 @@
* \brief Flatten `IOmxBufferProducer::QueueBufferInput`.
*
* \param[in] t The source `IOmxBufferProducer::QueueBufferInput`.
+ * \param[out] nh The native handle cloned from `t.fence`.
* \param[in,out] buffer The pointer to the flat non-fd buffer.
* \param[in,out] size The size of the flat non-fd buffer.
* \param[in,out] fds The pointer to the flat fd buffer.
@@ -1873,6 +1875,7 @@
*
* This function will duplicate the file descriptor in `t.fence`. */
inline status_t flatten(IOmxBufferProducer::QueueBufferInput const& t,
+ native_handle_t** nh,
void*& buffer, size_t& size, int*& fds, size_t& numFds) {
if (size < getFlattenedSize(t)) {
return NO_MEMORY;
@@ -1892,7 +1895,9 @@
FlattenableUtils::write(buffer, size, t.stickyTransform);
FlattenableUtils::write(buffer, size, t.getFrameTimestamps);
- status_t status = flattenFence(t.fence, buffer, size, fds, numFds);
+ *nh = t.fence.getNativeHandle() == nullptr ?
+ nullptr : native_handle_clone(t.fence);
+ status_t status = flattenFence(hidl_handle(*nh), buffer, size, fds, numFds);
if (status != NO_ERROR) {
return status;
}
@@ -2034,7 +2039,8 @@
size_t size = baseSize;
int* fds = baseFds.get();
size_t numFds = baseNumFds;
- if (flatten(t, buffer, size, fds, numFds) != NO_ERROR) {
+ native_handle_t* nh;
+ if (flatten(t, &nh, buffer, size, fds, numFds) != NO_ERROR) {
return false;
}
@@ -2043,9 +2049,12 @@
int const* constFds = static_cast<int const*>(baseFds.get());
numFds = baseNumFds;
if (l->unflatten(constBuffer, size, constFds, numFds) != NO_ERROR) {
+ native_handle_close(nh);
+ native_handle_delete(nh);
return false;
}
+ native_handle_delete(nh);
return true;
}
diff --git a/media/libstagefright/omx/hal/1.0/utils/Conversion.h b/media/libstagefright/omx/hal/1.0/utils/Conversion.h
index 375c7f9..c4876ac 100644
--- a/media/libstagefright/omx/hal/1.0/utils/Conversion.h
+++ b/media/libstagefright/omx/hal/1.0/utils/Conversion.h
@@ -1018,7 +1018,7 @@
if (*nh == nullptr) {
return NO_MEMORY;
}
- *fence = hidl_handle(*nh);
+ *fence = *nh;
++fds;
--numFds;
} else {
@@ -1264,6 +1264,7 @@
return NO_MEMORY;
}
+ *nh = nullptr;
::android::FenceTime::Snapshot::State state;
FlattenableUtils::read(buffer, size, state);
switch (state) {
@@ -1865,6 +1866,7 @@
* \brief Flatten `IOmxBufferProducer::QueueBufferInput`.
*
* \param[in] t The source `IOmxBufferProducer::QueueBufferInput`.
+ * \param[out] nh The native handle cloned from `t.fence`.
* \param[in,out] buffer The pointer to the flat non-fd buffer.
* \param[in,out] size The size of the flat non-fd buffer.
* \param[in,out] fds The pointer to the flat fd buffer.
@@ -1873,6 +1875,7 @@
*
* This function will duplicate the file descriptor in `t.fence`. */
inline status_t flatten(IOmxBufferProducer::QueueBufferInput const& t,
+ native_handle_t** nh,
void*& buffer, size_t& size, int*& fds, size_t& numFds) {
if (size < getFlattenedSize(t)) {
return NO_MEMORY;
@@ -1892,7 +1895,9 @@
FlattenableUtils::write(buffer, size, t.stickyTransform);
FlattenableUtils::write(buffer, size, t.getFrameTimestamps);
- status_t status = flattenFence(t.fence, buffer, size, fds, numFds);
+ *nh = t.fence.getNativeHandle() == nullptr ?
+ nullptr : native_handle_clone(t.fence);
+ status_t status = flattenFence(hidl_handle(*nh), buffer, size, fds, numFds);
if (status != NO_ERROR) {
return status;
}
@@ -2034,7 +2039,8 @@
size_t size = baseSize;
int* fds = baseFds.get();
size_t numFds = baseNumFds;
- if (flatten(t, buffer, size, fds, numFds) != NO_ERROR) {
+ native_handle_t* nh;
+ if (flatten(t, &nh, buffer, size, fds, numFds) != NO_ERROR) {
return false;
}
@@ -2043,9 +2049,12 @@
int const* constFds = static_cast<int const*>(baseFds.get());
numFds = baseNumFds;
if (l->unflatten(constBuffer, size, constFds, numFds) != NO_ERROR) {
+ native_handle_close(nh);
+ native_handle_delete(nh);
return false;
}
+ native_handle_delete(nh);
return true;
}