1e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala/* 2e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project 3e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * 4e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 5e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * you may not use this file except in compliance with the License. 6e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * You may obtain a copy of the License at 7e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * 8e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 9e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * 10e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 11e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 12e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * See the License for the specific language governing permissions and 14e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * limitations under the License. 15e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala */ 16e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 17e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#ifndef ANDROID_GUI_CPUCONSUMER_H 18e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#define ANDROID_GUI_CPUCONSUMER_H 19e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 20f57e7540d4cf799f18fe87d3536c55f1e0064931Eino-Ville Talvala#include <gui/ConsumerBase.h> 21e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 22e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#include <ui/GraphicBuffer.h> 23e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 24e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#include <utils/String8.h> 25e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#include <utils/Vector.h> 26e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#include <utils/threads.h> 27e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 28e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 29e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalanamespace android { 30e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 318f938a53385a3c6d1c6aa24b3f38437bb2cc47aeMathias Agopianclass BufferQueue; 328f938a53385a3c6d1c6aa24b3f38437bb2cc47aeMathias Agopian 33e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala/** 34e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * CpuConsumer is a BufferQueue consumer endpoint that allows direct CPU 35e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * access to the underlying gralloc buffers provided by BufferQueue. Multiple 36e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * buffers may be acquired by it at once, to be used concurrently by the 37e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * CpuConsumer owner. Sets gralloc usage flags to be software-read-only. 38e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * This queue is synchronous by default. 39e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala */ 40e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 41042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvalaclass CpuConsumer : public ConsumerBase 42e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala{ 43e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala public: 44f57e7540d4cf799f18fe87d3536c55f1e0064931Eino-Ville Talvala typedef ConsumerBase::FrameAvailableListener FrameAvailableListener; 45e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 46e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala struct LockedBuffer { 47e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala uint8_t *data; 48e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala uint32_t width; 49e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala uint32_t height; 50e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala PixelFormat format; 51e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala uint32_t stride; 52e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala Rect crop; 53e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala uint32_t transform; 54e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala uint32_t scalingMode; 55e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala int64_t timestamp; 56e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala uint64_t frameNumber; 576a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar // this is the same as format, except for formats that are compatible with 586a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar // a flexible format (e.g. HAL_PIXEL_FORMAT_YCbCr_420_888). In the latter 596a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar // case this contains that flexible format 606a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar PixelFormat flexFormat; 616a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar // Values below are only valid when using HAL_PIXEL_FORMAT_YCbCr_420_888 626a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar // or compatible format, in which case LockedBuffer::data 63c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala // contains the Y channel, and stride is the Y channel stride. For other 64c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala // formats, these will all be 0. 65c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala uint8_t *dataCb; 66c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala uint8_t *dataCr; 67c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala uint32_t chromaStride; 68c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala uint32_t chromaStep; 69e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala }; 70e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 71e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // Create a new CPU consumer. The maxLockedBuffers parameter specifies 72e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // how many buffers can be locked for user access at the same time. 73db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian CpuConsumer(const sp<IGraphicBufferConsumer>& bq, 74595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian uint32_t maxLockedBuffers, bool controlledByApp = false); 75e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 76e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala virtual ~CpuConsumer(); 77e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala 78e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // set the name of the CpuConsumer that will be used to identify it in 79e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // log messages. 80e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala void setName(const String8& name); 81e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 82b4b63704c02319765625de360a140ef8a59ab43bZhijun He // setDefaultBufferSize is used to set the size of buffers returned by 83b4b63704c02319765625de360a140ef8a59ab43bZhijun He // requestBuffers when a width and height of zero is requested. 84b4b63704c02319765625de360a140ef8a59ab43bZhijun He // A call to setDefaultBufferSize() may trigger requestBuffers() to 85b4b63704c02319765625de360a140ef8a59ab43bZhijun He // be called from the client. Default size is 1x1. 86b4b63704c02319765625de360a140ef8a59ab43bZhijun He status_t setDefaultBufferSize(uint32_t width, uint32_t height); 87b4b63704c02319765625de360a140ef8a59ab43bZhijun He 88b4b63704c02319765625de360a140ef8a59ab43bZhijun He // setDefaultBufferFormat allows CpuConsumer's BufferQueue to create buffers 89b4b63704c02319765625de360a140ef8a59ab43bZhijun He // of a defaultFormat if no format is specified by producer. Formats are 90b4b63704c02319765625de360a140ef8a59ab43bZhijun He // enumerated in graphics.h; the initial default is 91b4b63704c02319765625de360a140ef8a59ab43bZhijun He // HAL_PIXEL_FORMAT_RGBA_8888. 92b4b63704c02319765625de360a140ef8a59ab43bZhijun He status_t setDefaultBufferFormat(uint32_t defaultFormat); 93b4b63704c02319765625de360a140ef8a59ab43bZhijun He 94e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // Gets the next graphics buffer from the producer and locks it for CPU use, 95e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // filling out the passed-in locked buffer structure with the native pointer 96e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // and metadata. Returns BAD_VALUE if no new buffer is available, and 97a5b7513711555c8681eb9391cfafe30fb7d6dd3dIgor Murashkin // NOT_ENOUGH_DATA if the maximum number of buffers is already locked. 98e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // 99e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // Only a fixed number of buffers can be locked at a time, determined by the 100e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // construction-time maxLockedBuffers parameter. If INVALID_OPERATION is 101e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // returned by lockNextBuffer, then old buffers must be returned to the queue 102e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // by calling unlockBuffer before more buffers can be acquired. 103e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala status_t lockNextBuffer(LockedBuffer *nativeBuffer); 104e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 105e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // Returns a locked buffer to the queue, allowing it to be reused. Since 106e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // only a fixed number of buffers may be locked at a time, old buffers must 107e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // be released by calling unlockBuffer to ensure new buffers can be acquired by 108e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // lockNextBuffer. 109e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala status_t unlockBuffer(const LockedBuffer &nativeBuffer); 110e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 111e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala private: 112e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // Maximum number of buffers that can be locked at a time 113e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala uint32_t mMaxLockedBuffers; 114e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 115042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala status_t releaseAcquiredBufferLocked(int lockedIdx); 116042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala 117e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala virtual void freeBufferLocked(int slotIndex); 118e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 119042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala // Tracking for buffers acquired by the user 120042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala struct AcquiredBuffer { 121042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala // Need to track the original mSlot index and the buffer itself because 122042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala // the mSlot entry may be freed/reused before the acquired buffer is 123042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala // released. 124042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala int mSlot; 12564d8b1903e4b5f2838818eedcf4fef748b38709cEino-Ville Talvala sp<GraphicBuffer> mGraphicBuffer; 12664d8b1903e4b5f2838818eedcf4fef748b38709cEino-Ville Talvala void *mBufferPointer; 127042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala 128042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala AcquiredBuffer() : 129042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala mSlot(BufferQueue::INVALID_BUFFER_SLOT), 130042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala mBufferPointer(NULL) { 131042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala } 132042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala }; 133042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala Vector<AcquiredBuffer> mAcquiredBuffers; 13464d8b1903e4b5f2838818eedcf4fef748b38709cEino-Ville Talvala 135e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala // Count of currently locked buffers 136e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala uint32_t mCurrentLockedBuffers; 137e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 138e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala}; 139e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 140e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala} // namespace android 141e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 142e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#endif // ANDROID_GUI_CPUCONSUMER_H 143