summaryrefslogtreecommitdiff
path: root/libs/gui/IGraphicBufferProducer.cpp
diff options
context:
space:
mode:
author Xin Li <delphij@google.com> 2018-06-08 15:11:57 -0700
committer Xin Li <delphij@google.com> 2018-06-08 15:11:57 -0700
commitf11e2bd016d886a333345dea853ebda23a408d5c (patch)
tree905bd4d25d6ab2b046620ff459777d8dcfa5d7de /libs/gui/IGraphicBufferProducer.cpp
parentaabd6b7fa343654cd85b3b2da392e424d037d15a (diff)
parent5c947cdf72270fd1f766b2248d526ebc8c7227f6 (diff)
Merge pi-dev-plus-aosp-without-vendor into stage-aosp-master
Bug: 79597307 Change-Id: I6d6bee71b9424eb478780bbfc06b830eb8ded342
Diffstat (limited to 'libs/gui/IGraphicBufferProducer.cpp')
-rw-r--r--libs/gui/IGraphicBufferProducer.cpp111
1 files changed, 99 insertions, 12 deletions
diff --git a/libs/gui/IGraphicBufferProducer.cpp b/libs/gui/IGraphicBufferProducer.cpp
index 23e9ddc014..0749fde1ad 100644
--- a/libs/gui/IGraphicBufferProducer.cpp
+++ b/libs/gui/IGraphicBufferProducer.cpp
@@ -27,6 +27,9 @@
#include <binder/Parcel.h>
#include <binder/IInterface.h>
+#ifndef NO_BUFFERHUB
+#include <gui/BufferHubProducer.h>
+#endif
#include <gui/BufferQueueDefs.h>
#include <gui/IGraphicBufferProducer.h>
#include <gui/IProducerListener.h>
@@ -187,10 +190,10 @@ public:
virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer,
sp<Fence>* outFence) {
- if (outBuffer == nullptr) {
+ if (outBuffer == NULL) {
ALOGE("detachNextBuffer: outBuffer must not be NULL");
return BAD_VALUE;
- } else if (outFence == nullptr) {
+ } else if (outFence == NULL) {
ALOGE("detachNextBuffer: outFence must not be NULL");
return BAD_VALUE;
}
@@ -298,7 +301,7 @@ public:
int api, bool producerControlledByApp, QueueBufferOutput* output) {
Parcel data, reply;
data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
- if (listener != nullptr) {
+ if (listener != NULL) {
data.writeInt32(1);
data.writeStrongBinder(IInterface::asBinder(listener));
} else {
@@ -653,6 +656,79 @@ IMPLEMENT_HYBRID_META_INTERFACE(GraphicBufferProducer, HGraphicBufferProducer,
// ----------------------------------------------------------------------
+status_t IGraphicBufferProducer::exportToParcel(Parcel* parcel) {
+ status_t res = OK;
+ res = parcel->writeUint32(USE_BUFFER_QUEUE);
+ if (res != NO_ERROR) {
+ ALOGE("exportToParcel: Cannot write magic, res=%d.", res);
+ return res;
+ }
+
+ return parcel->writeStrongBinder(IInterface::asBinder(this));
+}
+
+/* static */
+status_t IGraphicBufferProducer::exportToParcel(const sp<IGraphicBufferProducer>& producer,
+ Parcel* parcel) {
+ if (parcel == nullptr) {
+ ALOGE("exportToParcel: Invalid parcel object.");
+ return BAD_VALUE;
+ }
+
+ if (producer == nullptr) {
+ status_t res = OK;
+ res = parcel->writeUint32(IGraphicBufferProducer::USE_BUFFER_QUEUE);
+ if (res != NO_ERROR) return res;
+ return parcel->writeStrongBinder(nullptr);
+ } else {
+ return producer->exportToParcel(parcel);
+ }
+}
+
+/* static */
+sp<IGraphicBufferProducer> IGraphicBufferProducer::createFromParcel(const Parcel* parcel) {
+ uint32_t outMagic = 0;
+ status_t res = NO_ERROR;
+
+ res = parcel->readUint32(&outMagic);
+ if (res != NO_ERROR) {
+ ALOGE("createFromParcel: Failed to read magic, error=%d.", res);
+ return nullptr;
+ }
+
+ switch (outMagic) {
+ case USE_BUFFER_QUEUE: {
+ sp<IBinder> binder;
+ res = parcel->readNullableStrongBinder(&binder);
+ if (res != NO_ERROR) {
+ ALOGE("createFromParcel: Can't read strong binder.");
+ return nullptr;
+ }
+ return interface_cast<IGraphicBufferProducer>(binder);
+ }
+ case USE_BUFFER_HUB: {
+ ALOGE("createFromParcel: BufferHub not implemented.");
+#ifndef NO_BUFFERHUB
+ dvr::ProducerQueueParcelable producerParcelable;
+ res = producerParcelable.readFromParcel(parcel);
+ if (res != NO_ERROR) {
+ ALOGE("createFromParcel: Failed to read from parcel, error=%d", res);
+ return nullptr;
+ }
+ return BufferHubProducer::Create(std::move(producerParcelable));
+#else
+ return nullptr;
+#endif
+ }
+ default: {
+ ALOGE("createFromParcel: Unexpected mgaic: 0x%x.", outMagic);
+ return nullptr;
+ }
+ }
+}
+
+// ----------------------------------------------------------------------------
+
status_t BnGraphicBufferProducer::onTransact(
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
@@ -662,8 +738,8 @@ status_t BnGraphicBufferProducer::onTransact(
int bufferIdx = data.readInt32();
sp<GraphicBuffer> buffer;
int result = requestBuffer(bufferIdx, &buffer);
- reply->writeInt32(buffer != nullptr);
- if (buffer != nullptr) {
+ reply->writeInt32(buffer != 0);
+ if (buffer != 0) {
reply->write(*buffer);
}
reply->writeInt32(result);
@@ -721,12 +797,12 @@ status_t BnGraphicBufferProducer::onTransact(
int32_t result = detachNextBuffer(&buffer, &fence);
reply->writeInt32(result);
if (result == NO_ERROR) {
- reply->writeInt32(buffer != nullptr);
- if (buffer != nullptr) {
+ reply->writeInt32(buffer != NULL);
+ if (buffer != NULL) {
reply->write(*buffer);
}
- reply->writeInt32(fence != nullptr);
- if (fence != nullptr) {
+ reply->writeInt32(fence != NULL);
+ if (fence != NULL) {
reply->write(*fence);
}
}
@@ -951,7 +1027,8 @@ constexpr size_t IGraphicBufferProducer::QueueBufferInput::minFlattenedSize() {
size_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const {
return minFlattenedSize() +
fence->getFlattenedSize() +
- surfaceDamage.getFlattenedSize();
+ surfaceDamage.getFlattenedSize() +
+ hdrMetadata.getFlattenedSize();
}
size_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const {
@@ -978,7 +1055,12 @@ status_t IGraphicBufferProducer::QueueBufferInput::flatten(
if (result != NO_ERROR) {
return result;
}
- return surfaceDamage.flatten(buffer, size);
+ result = surfaceDamage.flatten(buffer, size);
+ if (result != NO_ERROR) {
+ return result;
+ }
+ FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize());
+ return hdrMetadata.flatten(buffer, size);
}
status_t IGraphicBufferProducer::QueueBufferInput::unflatten(
@@ -1002,7 +1084,12 @@ status_t IGraphicBufferProducer::QueueBufferInput::unflatten(
if (result != NO_ERROR) {
return result;
}
- return surfaceDamage.unflatten(buffer, size);
+ result = surfaceDamage.unflatten(buffer, size);
+ if (result != NO_ERROR) {
+ return result;
+ }
+ FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize());
+ return hdrMetadata.unflatten(buffer, size);
}
// ----------------------------------------------------------------------------