1d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav/* 2d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav * Copyright (C) 2014 The Android Open Source Project 3d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav * 4d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav * Licensed under the Apache License, Version 2.0 (the "License"); 5d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav * you may not use this file except in compliance with the License. 6d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav * You may obtain a copy of the License at 7d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav * 8d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav * http://www.apache.org/licenses/LICENSE-2.0 9d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav * 10d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav * Unless required by applicable law or agreed to in writing, software 11d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav * distributed under the License is distributed on an "AS IS" BASIS, 12d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav * See the License for the specific language governing permissions and 14d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav * limitations under the License. 15d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav */ 16d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 17d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav#include <ui/FrameStats.h> 18d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 19d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavnamespace android { 20d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 21d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavbool FrameStats::isFixedSize() const { 22d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return false; 23d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 24d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 25d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavsize_t FrameStats::getFlattenedSize() const { 26d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav const size_t timestampSize = sizeof(nsecs_t); 27d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 28d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav size_t size = timestampSize; 29d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav size += 3 * desiredPresentTimesNano.size() * timestampSize; 30d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 31d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return size; 32d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 33d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 34d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavstatus_t FrameStats::flatten(void* buffer, size_t size) const { 35d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav if (size < getFlattenedSize()) { 36d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return NO_MEMORY; 37d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 38d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 39d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav nsecs_t* timestamps = reinterpret_cast<nsecs_t*>(buffer); 40d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav const size_t timestampSize = sizeof(nsecs_t); 41d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav size_t frameCount = desiredPresentTimesNano.size(); 42d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 43d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav memcpy(timestamps, &refreshPeriodNano, timestampSize); 44d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav timestamps += 1; 45d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 46d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav memcpy(timestamps, desiredPresentTimesNano.array(), frameCount * timestampSize); 47d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav timestamps += frameCount; 48d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 49d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav memcpy(timestamps, actualPresentTimesNano.array(), frameCount * timestampSize); 50d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav timestamps += frameCount; 51d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 52d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav memcpy(timestamps, frameReadyTimesNano.array(), frameCount * timestampSize); 53d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 54d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return NO_ERROR; 55d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 56d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 57d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavstatus_t FrameStats::unflatten(void const* buffer, size_t size) { 58d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav const size_t timestampSize = sizeof(nsecs_t); 59d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 60d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav if (size < timestampSize) { 61d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return NO_MEMORY; 62d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 63d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 64d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav nsecs_t const* timestamps = reinterpret_cast<nsecs_t const*>(buffer); 65d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav size_t frameCount = (size - timestampSize) / (3 * timestampSize); 66d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 67d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav memcpy(&refreshPeriodNano, timestamps, timestampSize); 68d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav timestamps += 1; 69d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 70d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav desiredPresentTimesNano.resize(frameCount); 71d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav memcpy(desiredPresentTimesNano.editArray(), timestamps, frameCount * timestampSize); 72d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav timestamps += frameCount; 73d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 74d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav actualPresentTimesNano.resize(frameCount); 75d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav memcpy(actualPresentTimesNano.editArray(), timestamps, frameCount * timestampSize); 76d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav timestamps += frameCount; 77d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 78d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav frameReadyTimesNano.resize(frameCount); 79d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav memcpy(frameReadyTimesNano.editArray(), timestamps, frameCount * timestampSize); 80d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 81d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return NO_ERROR; 82d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 83d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 84d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} // namespace android 85