| /* |
| * Copyright 2010 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include <inttypes.h> |
| |
| #define LOG_TAG "QueueBufferInputOutput" |
| #define ATRACE_TAG ATRACE_TAG_GRAPHICS |
| //#define LOG_NDEBUG 0 |
| |
| #include <gui/IGraphicBufferProducer.h> |
| |
| namespace android { |
| |
| constexpr size_t IGraphicBufferProducer::QueueBufferInput::minFlattenedSize() { |
| return sizeof(timestamp) + |
| sizeof(isAutoTimestamp) + |
| sizeof(dataSpace) + |
| sizeof(crop) + |
| sizeof(scalingMode) + |
| sizeof(transform) + |
| sizeof(stickyTransform) + |
| sizeof(getFrameTimestamps); |
| } |
| |
| IGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) { |
| parcel.read(*this); |
| } |
| |
| size_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const { |
| return minFlattenedSize() + |
| fence->getFlattenedSize() + |
| surfaceDamage.getFlattenedSize() + |
| hdrMetadata.getFlattenedSize(); |
| } |
| |
| size_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const { |
| return fence->getFdCount(); |
| } |
| |
| status_t IGraphicBufferProducer::QueueBufferInput::flatten( |
| void*& buffer, size_t& size, int*& fds, size_t& count) const |
| { |
| if (size < getFlattenedSize()) { |
| return NO_MEMORY; |
| } |
| |
| FlattenableUtils::write(buffer, size, timestamp); |
| FlattenableUtils::write(buffer, size, isAutoTimestamp); |
| FlattenableUtils::write(buffer, size, dataSpace); |
| FlattenableUtils::write(buffer, size, crop); |
| FlattenableUtils::write(buffer, size, scalingMode); |
| FlattenableUtils::write(buffer, size, transform); |
| FlattenableUtils::write(buffer, size, stickyTransform); |
| FlattenableUtils::write(buffer, size, getFrameTimestamps); |
| |
| status_t result = fence->flatten(buffer, size, fds, count); |
| if (result != NO_ERROR) { |
| return result; |
| } |
| 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( |
| void const*& buffer, size_t& size, int const*& fds, size_t& count) |
| { |
| if (size < minFlattenedSize()) { |
| return NO_MEMORY; |
| } |
| |
| FlattenableUtils::read(buffer, size, timestamp); |
| FlattenableUtils::read(buffer, size, isAutoTimestamp); |
| FlattenableUtils::read(buffer, size, dataSpace); |
| FlattenableUtils::read(buffer, size, crop); |
| FlattenableUtils::read(buffer, size, scalingMode); |
| FlattenableUtils::read(buffer, size, transform); |
| FlattenableUtils::read(buffer, size, stickyTransform); |
| FlattenableUtils::read(buffer, size, getFrameTimestamps); |
| |
| fence = new Fence(); |
| status_t result = fence->unflatten(buffer, size, fds, count); |
| if (result != NO_ERROR) { |
| return result; |
| } |
| result = surfaceDamage.unflatten(buffer, size); |
| if (result != NO_ERROR) { |
| return result; |
| } |
| FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize()); |
| return hdrMetadata.unflatten(buffer, size); |
| } |
| |
| //////////////////////////////////////////////////////////////////////// |
| constexpr size_t IGraphicBufferProducer::QueueBufferOutput::minFlattenedSize() { |
| return sizeof(width) + sizeof(height) + sizeof(transformHint) + sizeof(numPendingBuffers) + |
| sizeof(nextFrameNumber) + sizeof(bufferReplaced) + sizeof(maxBufferCount); |
| } |
| size_t IGraphicBufferProducer::QueueBufferOutput::getFlattenedSize() const { |
| return minFlattenedSize() + frameTimestamps.getFlattenedSize(); |
| } |
| |
| size_t IGraphicBufferProducer::QueueBufferOutput::getFdCount() const { |
| return frameTimestamps.getFdCount(); |
| } |
| |
| status_t IGraphicBufferProducer::QueueBufferOutput::flatten( |
| void*& buffer, size_t& size, int*& fds, size_t& count) const |
| { |
| if (size < getFlattenedSize()) { |
| return NO_MEMORY; |
| } |
| |
| FlattenableUtils::write(buffer, size, width); |
| FlattenableUtils::write(buffer, size, height); |
| FlattenableUtils::write(buffer, size, transformHint); |
| FlattenableUtils::write(buffer, size, numPendingBuffers); |
| FlattenableUtils::write(buffer, size, nextFrameNumber); |
| FlattenableUtils::write(buffer, size, bufferReplaced); |
| FlattenableUtils::write(buffer, size, maxBufferCount); |
| |
| return frameTimestamps.flatten(buffer, size, fds, count); |
| } |
| |
| status_t IGraphicBufferProducer::QueueBufferOutput::unflatten( |
| void const*& buffer, size_t& size, int const*& fds, size_t& count) |
| { |
| if (size < minFlattenedSize()) { |
| return NO_MEMORY; |
| } |
| |
| FlattenableUtils::read(buffer, size, width); |
| FlattenableUtils::read(buffer, size, height); |
| FlattenableUtils::read(buffer, size, transformHint); |
| FlattenableUtils::read(buffer, size, numPendingBuffers); |
| FlattenableUtils::read(buffer, size, nextFrameNumber); |
| FlattenableUtils::read(buffer, size, bufferReplaced); |
| FlattenableUtils::read(buffer, size, maxBufferCount); |
| |
| return frameTimestamps.unflatten(buffer, size, fds, count); |
| } |
| |
| } // namespace android |