CpuConsumer.h revision db89edc94bd2a78226b407f9f7261e202e7fa325
1a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood/* 2a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * Copyright (C) 2012 The Android Open Source Project 3a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * 4a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 5a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * you may not use this file except in compliance with the License. 6a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * You may obtain a copy of the License at 7a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * 8a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 9a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * 10a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * Unless required by applicable law or agreed to in writing, software 11a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 12a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * See the License for the specific language governing permissions and 14a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * limitations under the License. 15a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood */ 16a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood 17a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#ifndef ANDROID_GUI_CPUCONSUMER_H 18a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#define ANDROID_GUI_CPUCONSUMER_H 19377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT 20eb5d7f2f1cc049ea7f95a4f089ce2113d7683ddaLajos Molnar#include <gui/ConsumerBase.h> 21a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood 220c7c7c76a96a82ec728a2d5c091941c4057ffb25Mike Lockwood#include <ui/GraphicBuffer.h> 23a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood 24a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#include <utils/String8.h> 25a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#include <utils/Vector.h> 26a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#include <utils/threads.h> 27a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood 28a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood 29a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodnamespace android { 30a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood 31a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodclass BufferQueue; 32a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood 33a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood/** 34a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * CpuConsumer is a BufferQueue consumer endpoint that allows direct CPU 35a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * access to the underlying gralloc buffers provided by BufferQueue. Multiple 36a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * buffers may be acquired by it at once, to be used concurrently by the 372bb8c0e7c4e4093f4161ff5e98cef51c87193859Mike Lockwood * CpuConsumer owner. Sets gralloc usage flags to be software-read-only. 38a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood * This queue is synchronous by default. 39a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood */ 40a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood 41a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwoodclass CpuConsumer : public ConsumerBase 42dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood{ 43dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood public: 44dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood typedef ConsumerBase::FrameAvailableListener FrameAvailableListener; 45dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood 46a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood struct LockedBuffer { 47a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood uint8_t *data; 4821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood uint32_t width; 4921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood uint32_t height; 5021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood PixelFormat format; 5121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood uint32_t stride; 5221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood Rect crop; 5321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood uint32_t transform; 5421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood uint32_t scalingMode; 5521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood int64_t timestamp; 5621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood uint64_t frameNumber; 5721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood // Values below are only valid when using 5821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood // HAL_PIXEL_FORMAT_YCbCr_420_888, in which case LockedBuffer::data 5940ce1f262cc4edbc8b7c470830325466263acaecMike Lockwood // contains the Y channel, and stride is the Y channel stride. For other 6021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood // formats, these will all be 0. 6121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood uint8_t *dataCb; 6221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood uint8_t *dataCr; 6321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood uint32_t chromaStride; 6421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood uint32_t chromaStep; 6521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood }; 6621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood 6721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood // Create a new CPU consumer. The maxLockedBuffers parameter specifies 6821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood // how many buffers can be locked for user access at the same time. 6921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood CpuConsumer(const sp<IGraphicBufferConsumer>& bq, 7021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood uint32_t maxLockedBuffers, bool controlledByApp = false); 7121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood 72dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood virtual ~CpuConsumer(); 7321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood 7421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood // set the name of the CpuConsumer that will be used to identify it in 75dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood // log messages. 7621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood void setName(const String8& name); 7721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood 78dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood // setDefaultBufferSize is used to set the size of buffers returned by 7921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood // requestBuffers when a width and height of zero is requested. 8021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood // A call to setDefaultBufferSize() may trigger requestBuffers() to 81dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood // be called from the client. Default size is 1x1. 8221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood status_t setDefaultBufferSize(uint32_t width, uint32_t height); 8321ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood 84dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood // setDefaultBufferFormat allows CpuConsumer's BufferQueue to create buffers 8521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood // of a defaultFormat if no format is specified by producer. Formats are 8621ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood // enumerated in graphics.h; the initial default is 87dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood // HAL_PIXEL_FORMAT_RGBA_8888. 8821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood status_t setDefaultBufferFormat(uint32_t defaultFormat); 8921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood 90dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood // Gets the next graphics buffer from the producer and locks it for CPU use, 9121ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood // filling out the passed-in locked buffer structure with the native pointer 9221ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood // and metadata. Returns BAD_VALUE if no new buffer is available, and 93dde372033b4da75ebde7ea2afdec1c1b86ab5a42Mike Lockwood // INVALID_OPERATION if the maximum number of buffers is already locked. 9421ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood // 9521ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood // Only a fixed number of buffers can be locked at a time, determined by the 9629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block // construction-time maxLockedBuffers parameter. If INVALID_OPERATION is 9721ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood // returned by lockNextBuffer, then old buffers must be returned to the queue 9821ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood // by calling unlockBuffer before more buffers can be acquired. 9921ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood status_t lockNextBuffer(LockedBuffer *nativeBuffer); 10021ef7d0e70c5ad599bc2602cb484f8cd647055caMike Lockwood 101a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood // Returns a locked buffer to the queue, allowing it to be reused. Since 102a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood // only a fixed number of buffers may be locked at a time, old buffers must 103a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood // be released by calling unlockBuffer to ensure new buffers can be acquired by 104a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood // lockNextBuffer. 105a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood status_t unlockBuffer(const LockedBuffer &nativeBuffer); 106a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood 107a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood private: 108a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood // Maximum number of buffers that can be locked at a time 109ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood uint32_t mMaxLockedBuffers; 110a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood 111a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood status_t releaseAcquiredBufferLocked(int lockedIdx); 112a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood 113ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood virtual void freeBufferLocked(int slotIndex); 114a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood 115a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood // Tracking for buffers acquired by the user 116a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood struct AcquiredBuffer { 117ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood // Need to track the original mSlot index and the buffer itself because 118a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood // the mSlot entry may be freed/reused before the acquired buffer is 119a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood // released. 120a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood int mSlot; 121a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood sp<GraphicBuffer> mGraphicBuffer; 122a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood void *mBufferPointer; 123a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood 124a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood AcquiredBuffer() : 125a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood mSlot(BufferQueue::INVALID_BUFFER_SLOT), 126ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood mBufferPointer(NULL) { 127ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood } 128ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood }; 129ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood Vector<AcquiredBuffer> mAcquiredBuffers; 1305da864845e024833c4c7f641acd7c88187a6bc1eMike Lockwood 131ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood // Count of currently locked buffers 132ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood uint32_t mCurrentLockedBuffers; 133ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood 134a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood}; 135a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood 136a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood} // namespace android 137a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood 138a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood#endif // ANDROID_GUI_CPUCONSUMER_H 139a6c490b8b2d96ebaab632286029463f932ae3b6bMike Lockwood