Loading include/gui/BufferQueue.h +3 −3 Original line number Diff line number Diff line Loading @@ -125,9 +125,9 @@ public: // nanoseconds, and must be monotonically increasing. Its other semantics // (zero point, etc) are client-dependent and should be documented by the // client. virtual status_t queueBuffer(int buf, int64_t timestamp, const Rect& crop, int scalingMode, uint32_t transform, uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform); virtual status_t queueBuffer(int buf, const QueueBufferInput& input, QueueBufferOutput* output); virtual void cancelBuffer(int buf); // setSynchronousMode set whether dequeueBuffer is synchronous or Loading include/gui/ISurfaceTexture.h +44 −3 Original line number Diff line number Diff line Loading @@ -82,9 +82,50 @@ protected: // outWidth, outHeight and outTransform are filled with the default width // and height of the window and current transform applied to buffers, // respectively. virtual status_t queueBuffer(int slot, int64_t timestamp, const Rect& crop, int scalingMode, uint32_t transform, uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) = 0; // QueueBufferInput must be a POD structure struct QueueBufferInput { inline QueueBufferInput(int64_t timestamp, const Rect& crop, int scalingMode, uint32_t transform) : timestamp(timestamp), crop(crop), scalingMode(scalingMode), transform(transform) { } inline void deflate(int64_t* outTimestamp, Rect* outCrop, int* outScalingMode, uint32_t* outTransform) const { *outTimestamp = timestamp; *outCrop = crop; *outScalingMode = scalingMode; *outTransform = transform; } private: int64_t timestamp; Rect crop; int scalingMode; uint32_t transform; }; // QueueBufferOutput must be a POD structure struct QueueBufferOutput { inline QueueBufferOutput() { } inline void deflate(uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransformHint) const { *outWidth = width; *outHeight = height; *outTransformHint = transformHint; } inline void inflate(uint32_t inWidth, uint32_t inHeight, uint32_t inTransformHint) { width = inWidth; height = inHeight; transformHint = inTransformHint; } private: uint32_t width; uint32_t height; uint32_t transformHint; }; virtual status_t queueBuffer(int slot, const QueueBufferInput& input, QueueBufferOutput* output) = 0; // cancelBuffer indicates that the client does not wish to fill in the // buffer associated with slot and transfers ownership of the slot back to Loading libs/gui/BufferQueue.cpp +12 −9 Original line number Diff line number Diff line Loading @@ -526,9 +526,8 @@ status_t BufferQueue::setSynchronousMode(bool enabled) { return err; } status_t BufferQueue::queueBuffer(int buf, int64_t timestamp, const Rect& crop, int scalingMode, uint32_t transform, uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) { status_t BufferQueue::queueBuffer(int buf, const QueueBufferInput& input, QueueBufferOutput* output) { ATRACE_CALL(); ATRACE_BUFFER_INDEX(buf); Loading Loading @@ -581,6 +580,15 @@ status_t BufferQueue::queueBuffer(int buf, int64_t timestamp, } } int scalingMode; input.deflate( &mSlots[buf].mTimestamp, &mSlots[buf].mCrop, &scalingMode, &mSlots[buf].mTransform); switch (scalingMode) { case NATIVE_WINDOW_SCALING_MODE_FREEZE: case NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW: Loading @@ -592,19 +600,14 @@ status_t BufferQueue::queueBuffer(int buf, int64_t timestamp, } mSlots[buf].mBufferState = BufferSlot::QUEUED; mSlots[buf].mCrop = crop; mSlots[buf].mTransform = transform; mSlots[buf].mScalingMode = scalingMode; mSlots[buf].mTimestamp = timestamp; mFrameCounter++; mSlots[buf].mFrameNumber = mFrameCounter; mBufferHasBeenQueued = true; mDequeueCondition.broadcast(); *outWidth = mDefaultWidth; *outHeight = mDefaultHeight; *outTransform = mTransformHint; output->inflate(mDefaultWidth, mDefaultHeight, mDefaultHeight); ATRACE_INT(mConsumerName.string(), mQueue.size()); } // scope for the lock Loading libs/gui/ISurfaceTexture.cpp +11 −21 Original line number Diff line number Diff line Loading @@ -98,23 +98,17 @@ public: return result; } virtual status_t queueBuffer(int buf, int64_t timestamp, const Rect& crop, int scalingMode, uint32_t transform, uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) { virtual status_t queueBuffer(int buf, const QueueBufferInput& input, QueueBufferOutput* output) { Parcel data, reply; data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor()); data.writeInt32(buf); data.writeInt64(timestamp); memcpy(data.writeInplace(sizeof(Rect)), &crop, sizeof(Rect)); data.writeInt32(scalingMode); data.writeInt32(transform); memcpy(data.writeInplace(sizeof(input)), &input, sizeof(input)); status_t result = remote()->transact(QUEUE_BUFFER, data, &reply); if (result != NO_ERROR) { return result; } *outWidth = reply.readInt32(); *outHeight = reply.readInt32(); *outTransform = reply.readInt32(); memcpy(output, reply.readInplace(sizeof(*output)), sizeof(*output)); result = reply.readInt32(); return result; } Loading Loading @@ -222,17 +216,13 @@ status_t BnSurfaceTexture::onTransact( case QUEUE_BUFFER: { CHECK_INTERFACE(ISurfaceTexture, data, reply); int buf = data.readInt32(); int64_t timestamp = data.readInt64(); Rect crop( *reinterpret_cast<Rect const *>(data.readInplace(sizeof(Rect))) ); int scalingMode = data.readInt32(); uint32_t transform = data.readInt32(); uint32_t outWidth, outHeight, outTransform; status_t result = queueBuffer(buf, timestamp, crop, scalingMode, transform, &outWidth, &outHeight, &outTransform); reply->writeInt32(outWidth); reply->writeInt32(outHeight); reply->writeInt32(outTransform); QueueBufferInput const* const input = reinterpret_cast<QueueBufferInput const *>( data.readInplace(sizeof(QueueBufferInput))); QueueBufferOutput* const output = reinterpret_cast<QueueBufferOutput *>( reply->writeInplace(sizeof(QueueBufferOutput))); status_t result = queueBuffer(buf, *input, output); reply->writeInt32(result); return NO_ERROR; } break; Loading libs/gui/SurfaceTextureClient.cpp +6 −3 Original line number Diff line number Diff line Loading @@ -230,12 +230,15 @@ int SurfaceTextureClient::queueBuffer(android_native_buffer_t* buffer) { if (i < 0) { return i; } status_t err = mSurfaceTexture->queueBuffer(i, timestamp, mCrop, mScalingMode, mTransform, &mDefaultWidth, &mDefaultHeight, &mTransformHint); ISurfaceTexture::QueueBufferOutput output; ISurfaceTexture::QueueBufferInput input(timestamp, mCrop, mScalingMode, mTransform); status_t err = mSurfaceTexture->queueBuffer(i, input, &output); if (err != OK) { ALOGE("queueBuffer: error queuing buffer to SurfaceTexture, %d", err); } output.deflate(&mDefaultWidth, &mDefaultHeight, &mTransformHint); return err; } Loading Loading
include/gui/BufferQueue.h +3 −3 Original line number Diff line number Diff line Loading @@ -125,9 +125,9 @@ public: // nanoseconds, and must be monotonically increasing. Its other semantics // (zero point, etc) are client-dependent and should be documented by the // client. virtual status_t queueBuffer(int buf, int64_t timestamp, const Rect& crop, int scalingMode, uint32_t transform, uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform); virtual status_t queueBuffer(int buf, const QueueBufferInput& input, QueueBufferOutput* output); virtual void cancelBuffer(int buf); // setSynchronousMode set whether dequeueBuffer is synchronous or Loading
include/gui/ISurfaceTexture.h +44 −3 Original line number Diff line number Diff line Loading @@ -82,9 +82,50 @@ protected: // outWidth, outHeight and outTransform are filled with the default width // and height of the window and current transform applied to buffers, // respectively. virtual status_t queueBuffer(int slot, int64_t timestamp, const Rect& crop, int scalingMode, uint32_t transform, uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) = 0; // QueueBufferInput must be a POD structure struct QueueBufferInput { inline QueueBufferInput(int64_t timestamp, const Rect& crop, int scalingMode, uint32_t transform) : timestamp(timestamp), crop(crop), scalingMode(scalingMode), transform(transform) { } inline void deflate(int64_t* outTimestamp, Rect* outCrop, int* outScalingMode, uint32_t* outTransform) const { *outTimestamp = timestamp; *outCrop = crop; *outScalingMode = scalingMode; *outTransform = transform; } private: int64_t timestamp; Rect crop; int scalingMode; uint32_t transform; }; // QueueBufferOutput must be a POD structure struct QueueBufferOutput { inline QueueBufferOutput() { } inline void deflate(uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransformHint) const { *outWidth = width; *outHeight = height; *outTransformHint = transformHint; } inline void inflate(uint32_t inWidth, uint32_t inHeight, uint32_t inTransformHint) { width = inWidth; height = inHeight; transformHint = inTransformHint; } private: uint32_t width; uint32_t height; uint32_t transformHint; }; virtual status_t queueBuffer(int slot, const QueueBufferInput& input, QueueBufferOutput* output) = 0; // cancelBuffer indicates that the client does not wish to fill in the // buffer associated with slot and transfers ownership of the slot back to Loading
libs/gui/BufferQueue.cpp +12 −9 Original line number Diff line number Diff line Loading @@ -526,9 +526,8 @@ status_t BufferQueue::setSynchronousMode(bool enabled) { return err; } status_t BufferQueue::queueBuffer(int buf, int64_t timestamp, const Rect& crop, int scalingMode, uint32_t transform, uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) { status_t BufferQueue::queueBuffer(int buf, const QueueBufferInput& input, QueueBufferOutput* output) { ATRACE_CALL(); ATRACE_BUFFER_INDEX(buf); Loading Loading @@ -581,6 +580,15 @@ status_t BufferQueue::queueBuffer(int buf, int64_t timestamp, } } int scalingMode; input.deflate( &mSlots[buf].mTimestamp, &mSlots[buf].mCrop, &scalingMode, &mSlots[buf].mTransform); switch (scalingMode) { case NATIVE_WINDOW_SCALING_MODE_FREEZE: case NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW: Loading @@ -592,19 +600,14 @@ status_t BufferQueue::queueBuffer(int buf, int64_t timestamp, } mSlots[buf].mBufferState = BufferSlot::QUEUED; mSlots[buf].mCrop = crop; mSlots[buf].mTransform = transform; mSlots[buf].mScalingMode = scalingMode; mSlots[buf].mTimestamp = timestamp; mFrameCounter++; mSlots[buf].mFrameNumber = mFrameCounter; mBufferHasBeenQueued = true; mDequeueCondition.broadcast(); *outWidth = mDefaultWidth; *outHeight = mDefaultHeight; *outTransform = mTransformHint; output->inflate(mDefaultWidth, mDefaultHeight, mDefaultHeight); ATRACE_INT(mConsumerName.string(), mQueue.size()); } // scope for the lock Loading
libs/gui/ISurfaceTexture.cpp +11 −21 Original line number Diff line number Diff line Loading @@ -98,23 +98,17 @@ public: return result; } virtual status_t queueBuffer(int buf, int64_t timestamp, const Rect& crop, int scalingMode, uint32_t transform, uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) { virtual status_t queueBuffer(int buf, const QueueBufferInput& input, QueueBufferOutput* output) { Parcel data, reply; data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor()); data.writeInt32(buf); data.writeInt64(timestamp); memcpy(data.writeInplace(sizeof(Rect)), &crop, sizeof(Rect)); data.writeInt32(scalingMode); data.writeInt32(transform); memcpy(data.writeInplace(sizeof(input)), &input, sizeof(input)); status_t result = remote()->transact(QUEUE_BUFFER, data, &reply); if (result != NO_ERROR) { return result; } *outWidth = reply.readInt32(); *outHeight = reply.readInt32(); *outTransform = reply.readInt32(); memcpy(output, reply.readInplace(sizeof(*output)), sizeof(*output)); result = reply.readInt32(); return result; } Loading Loading @@ -222,17 +216,13 @@ status_t BnSurfaceTexture::onTransact( case QUEUE_BUFFER: { CHECK_INTERFACE(ISurfaceTexture, data, reply); int buf = data.readInt32(); int64_t timestamp = data.readInt64(); Rect crop( *reinterpret_cast<Rect const *>(data.readInplace(sizeof(Rect))) ); int scalingMode = data.readInt32(); uint32_t transform = data.readInt32(); uint32_t outWidth, outHeight, outTransform; status_t result = queueBuffer(buf, timestamp, crop, scalingMode, transform, &outWidth, &outHeight, &outTransform); reply->writeInt32(outWidth); reply->writeInt32(outHeight); reply->writeInt32(outTransform); QueueBufferInput const* const input = reinterpret_cast<QueueBufferInput const *>( data.readInplace(sizeof(QueueBufferInput))); QueueBufferOutput* const output = reinterpret_cast<QueueBufferOutput *>( reply->writeInplace(sizeof(QueueBufferOutput))); status_t result = queueBuffer(buf, *input, output); reply->writeInt32(result); return NO_ERROR; } break; Loading
libs/gui/SurfaceTextureClient.cpp +6 −3 Original line number Diff line number Diff line Loading @@ -230,12 +230,15 @@ int SurfaceTextureClient::queueBuffer(android_native_buffer_t* buffer) { if (i < 0) { return i; } status_t err = mSurfaceTexture->queueBuffer(i, timestamp, mCrop, mScalingMode, mTransform, &mDefaultWidth, &mDefaultHeight, &mTransformHint); ISurfaceTexture::QueueBufferOutput output; ISurfaceTexture::QueueBufferInput input(timestamp, mCrop, mScalingMode, mTransform); status_t err = mSurfaceTexture->queueBuffer(i, input, &output); if (err != OK) { ALOGE("queueBuffer: error queuing buffer to SurfaceTexture, %d", err); } output.deflate(&mDefaultWidth, &mDefaultHeight, &mTransformHint); return err; } Loading