X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=libs%2Fgui%2FIGraphicBufferProducer.cpp;h=6b3881167a60a872a771180705b7fb0a94a507d4;hb=ba960b01937cbffaac69c1bcc78eb10f6cb10968;hp=e3d2a20dfd5807e2f3b08272a1ce9fcb128484dc;hpb=86cd09d388d8f6dd52ec1b3e19170966e99caacb;p=android-x86%2Fframeworks-native.git diff --git a/libs/gui/IGraphicBufferProducer.cpp b/libs/gui/IGraphicBufferProducer.cpp index e3d2a20dfd..6b3881167a 100644 --- a/libs/gui/IGraphicBufferProducer.cpp +++ b/libs/gui/IGraphicBufferProducer.cpp @@ -41,7 +41,6 @@ enum { DISCONNECT, }; - class BpGraphicBufferProducer : public BpInterface { public: @@ -113,7 +112,12 @@ public: if (result != NO_ERROR) { return result; } - memcpy(output, reply.readInplace(sizeof(*output)), sizeof(*output)); + const void *out_data =reply.readInplace(sizeof(*output)); + if(out_data != NULL) { + memcpy(output, out_data, sizeof(*output)); + } else { + return BAD_VALUE; + } result = reply.readInt32(); return result; } @@ -139,16 +143,23 @@ public: return result; } - virtual status_t connect(int api, bool producerControlledByApp, QueueBufferOutput* output) { + virtual status_t connect(const sp& token, + int api, bool producerControlledByApp, QueueBufferOutput* output) { Parcel data, reply; data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); + data.writeStrongBinder(token); data.writeInt32(api); data.writeInt32(producerControlledByApp); status_t result = remote()->transact(CONNECT, data, &reply); if (result != NO_ERROR) { return result; } - memcpy(output, reply.readInplace(sizeof(*output)), sizeof(*output)); + const void *out_data =reply.readInplace(sizeof(*output)); + if(out_data != NULL) { + memcpy(output, out_data, sizeof(*output)); + } else { + return BAD_VALUE; + } result = reply.readInt32(); return result; } @@ -241,12 +252,13 @@ status_t BnGraphicBufferProducer::onTransact( } break; case CONNECT: { CHECK_INTERFACE(IGraphicBufferProducer, data, reply); + sp token = data.readStrongBinder(); int api = data.readInt32(); bool producerControlledByApp = data.readInt32(); QueueBufferOutput* const output = reinterpret_cast( reply->writeInplace(sizeof(QueueBufferOutput))); - status_t res = connect(api, producerControlledByApp, output); + status_t res = connect(token, api, producerControlledByApp, output); reply->writeInt32(res); return NO_ERROR; } break; @@ -269,6 +281,7 @@ IGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) size_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const { return sizeof(timestamp) + + sizeof(isAutoTimestamp) + sizeof(crop) + sizeof(scalingMode) + sizeof(transform) @@ -287,6 +300,7 @@ status_t IGraphicBufferProducer::QueueBufferInput::flatten( return NO_MEMORY; } FlattenableUtils::write(buffer, size, timestamp); + FlattenableUtils::write(buffer, size, isAutoTimestamp); FlattenableUtils::write(buffer, size, crop); FlattenableUtils::write(buffer, size, scalingMode); FlattenableUtils::write(buffer, size, transform); @@ -299,6 +313,7 @@ status_t IGraphicBufferProducer::QueueBufferInput::unflatten( { size_t minNeeded = sizeof(timestamp) + + sizeof(isAutoTimestamp) + sizeof(crop) + sizeof(scalingMode) + sizeof(transform) @@ -309,6 +324,7 @@ status_t IGraphicBufferProducer::QueueBufferInput::unflatten( } FlattenableUtils::read(buffer, size, timestamp); + FlattenableUtils::read(buffer, size, isAutoTimestamp); FlattenableUtils::read(buffer, size, crop); FlattenableUtils::read(buffer, size, scalingMode); FlattenableUtils::read(buffer, size, transform);