1/*
2 * Copyright (C) 2013 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#include <gui/IConsumerListener.h>
18
19#include <gui/BufferItem.h>
20
21namespace android {
22
23namespace { // Anonymous
24
25enum class Tag : uint32_t {
26    ON_DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
27    ON_FRAME_AVAILABLE,
28    ON_FRAME_REPLACED,
29    ON_BUFFERS_RELEASED,
30    ON_SIDEBAND_STREAM_CHANGED,
31    LAST = ON_SIDEBAND_STREAM_CHANGED,
32};
33
34} // Anonymous namespace
35
36class BpConsumerListener : public SafeBpInterface<IConsumerListener> {
37public:
38    explicit BpConsumerListener(const sp<IBinder>& impl)
39          : SafeBpInterface<IConsumerListener>(impl, "BpConsumerListener") {}
40
41    ~BpConsumerListener() override;
42
43    void onDisconnect() override {
44        callRemoteAsync<decltype(&IConsumerListener::onDisconnect)>(Tag::ON_DISCONNECT);
45    }
46
47    void onFrameAvailable(const BufferItem& item) override {
48        callRemoteAsync<decltype(&IConsumerListener::onFrameAvailable)>(Tag::ON_FRAME_AVAILABLE,
49                                                                        item);
50    }
51
52    void onFrameReplaced(const BufferItem& item) override {
53        callRemoteAsync<decltype(&IConsumerListener::onFrameReplaced)>(Tag::ON_FRAME_REPLACED,
54                                                                       item);
55    }
56
57    void onBuffersReleased() override {
58        callRemoteAsync<decltype(&IConsumerListener::onBuffersReleased)>(Tag::ON_BUFFERS_RELEASED);
59    }
60
61    void onSidebandStreamChanged() override {
62        callRemoteAsync<decltype(&IConsumerListener::onSidebandStreamChanged)>(
63                Tag::ON_SIDEBAND_STREAM_CHANGED);
64    }
65
66    void addAndGetFrameTimestamps(const NewFrameEventsEntry* /*newTimestamps*/,
67                                  FrameEventHistoryDelta* /*outDelta*/) override {
68        LOG_ALWAYS_FATAL("IConsumerListener::addAndGetFrameTimestamps cannot be proxied");
69    }
70};
71
72// Out-of-line virtual method definitions to trigger vtable emission in this translation unit (see
73// clang warning -Wweak-vtables)
74BpConsumerListener::~BpConsumerListener() = default;
75ConsumerListener::~ConsumerListener() = default;
76
77IMPLEMENT_META_INTERFACE(ConsumerListener, "android.gui.IConsumerListener");
78
79status_t BnConsumerListener::onTransact(uint32_t code, const Parcel& data, Parcel* reply,
80                                        uint32_t flags) {
81    if (code < IBinder::FIRST_CALL_TRANSACTION || code > static_cast<uint32_t>(Tag::LAST)) {
82        return BBinder::onTransact(code, data, reply, flags);
83    }
84    auto tag = static_cast<Tag>(code);
85    switch (tag) {
86        case Tag::ON_DISCONNECT:
87            return callLocalAsync(data, reply, &IConsumerListener::onDisconnect);
88        case Tag::ON_FRAME_AVAILABLE:
89            return callLocalAsync(data, reply, &IConsumerListener::onFrameAvailable);
90        case Tag::ON_FRAME_REPLACED:
91            return callLocalAsync(data, reply, &IConsumerListener::onFrameReplaced);
92        case Tag::ON_BUFFERS_RELEASED:
93            return callLocalAsync(data, reply, &IConsumerListener::onBuffersReleased);
94        case Tag::ON_SIDEBAND_STREAM_CHANGED:
95            return callLocalAsync(data, reply, &IConsumerListener::onSidebandStreamChanged);
96    }
97}
98
99} // namespace android
100