| /* | 
 |  * 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 |