160 lines
5.5 KiB
C++
160 lines
5.5 KiB
C++
/*
|
|
* 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
|