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