1 /*
2  * Copyright 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_MONITORED_PRODUCER_H
18 #define ANDROID_MONITORED_PRODUCER_H
19 
20 #include <gui/IGraphicBufferProducer.h>
21 
22 namespace android {
23 
24 class IProducerListener;
25 class NativeHandle;
26 class SurfaceFlinger;
27 class Layer;
28 
29 // MonitoredProducer wraps an IGraphicBufferProducer so that SurfaceFlinger will
30 // be notified upon its destruction
31 class MonitoredProducer : public BnGraphicBufferProducer {
32 public:
33     MonitoredProducer(const sp<IGraphicBufferProducer>& producer,
34             const sp<SurfaceFlinger>& flinger,
35             const wp<Layer>& layer);
36     virtual ~MonitoredProducer();
37 
38     // From IGraphicBufferProducer
39     virtual status_t requestBuffer(int slot, sp<GraphicBuffer>* buf);
40     virtual status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers);
41     virtual status_t setAsyncMode(bool async);
42     virtual status_t dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w, uint32_t h,
43                                    PixelFormat format, uint64_t usage, uint64_t* outBufferAge,
44                                    FrameEventHistoryDelta* outTimestamps);
45     virtual status_t detachBuffer(int slot);
46     virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer,
47             sp<Fence>* outFence);
48     virtual status_t attachBuffer(int* outSlot,
49             const sp<GraphicBuffer>& buffer);
50     virtual status_t queueBuffer(int slot, const QueueBufferInput& input,
51             QueueBufferOutput* output);
52     virtual status_t cancelBuffer(int slot, const sp<Fence>& fence);
53     virtual int query(int what, int* value);
54     virtual status_t connect(const sp<IProducerListener>& token, int api,
55             bool producerControlledByApp, QueueBufferOutput* output);
56     virtual status_t disconnect(int api, DisconnectMode mode);
57     virtual status_t setSidebandStream(const sp<NativeHandle>& stream);
58     virtual void allocateBuffers(uint32_t width, uint32_t height,
59             PixelFormat format, uint64_t usage);
60     virtual status_t allowAllocation(bool allow);
61     virtual status_t setGenerationNumber(uint32_t generationNumber);
62     virtual String8 getConsumerName() const override;
63     virtual status_t setDequeueTimeout(nsecs_t timeout) override;
64     virtual status_t setLegacyBufferDrop(bool drop) override;
65     virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer,
66             sp<Fence>* outFence, float outTransformMatrix[16]) override;
67     virtual IBinder* onAsBinder();
68     virtual status_t setSharedBufferMode(bool sharedBufferMode) override;
69     virtual status_t setAutoRefresh(bool autoRefresh) override;
70     virtual void getFrameTimestamps(FrameEventHistoryDelta *outDelta) override;
71     virtual status_t getUniqueId(uint64_t* outId) const override;
72     virtual status_t getConsumerUsage(uint64_t* outUsage) const override;
73 
74     // The Layer which created this producer, and on which queued Buffer's will be displayed.
75     sp<Layer> getLayer() const;
76 
77 private:
78     sp<IGraphicBufferProducer> mProducer;
79     sp<SurfaceFlinger> mFlinger;
80     // The Layer which created this producer, and on which queued Buffer's will be displayed.
81     wp<Layer> mLayer;
82 };
83 
84 }; // namespace android
85 
86 #endif // ANDROID_MONITORED_PRODUCER_H
87