WifiDisplaySource.h revision ad0d97c7cf620e96a0b088dd9461645a3f8900b7
1d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber/*
2d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * Copyright 2012, The Android Open Source Project
3d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber *
4d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * you may not use this file except in compliance with the License.
6d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * You may obtain a copy of the License at
7d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber *
8d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber *     http://www.apache.org/licenses/LICENSE-2.0
9d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber *
10d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * Unless required by applicable law or agreed to in writing, software
11d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * See the License for the specific language governing permissions and
14d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * limitations under the License.
15d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber */
16d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
17d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#ifndef WIFI_DISPLAY_SOURCE_H_
18d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
19d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#define WIFI_DISPLAY_SOURCE_H_
20d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
21d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#include "ANetworkSession.h"
22d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
23d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#include <media/stagefright/foundation/AHandler.h>
24d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
25bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber#include <netinet/in.h>
26bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber
27d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Hubernamespace android {
28d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
29b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber#define REQUIRE_HDCP    0
30b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber
31b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huberstruct IHDCP;
320b73d4730202fcad53aefc4314a06e7b95f442f0Andreas Huberstruct IRemoteDisplayClient;
33d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberstruct ParsedMessage;
34d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
35d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber// Represents the RTSP server acting as a wifi display source.
36d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber// Manages incoming connections, sets up Playback sessions as necessary.
37d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberstruct WifiDisplaySource : public AHandler {
38d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    static const unsigned kWifiDisplayDefaultPort = 7236;
39d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
400b73d4730202fcad53aefc4314a06e7b95f442f0Andreas Huber    WifiDisplaySource(
410b73d4730202fcad53aefc4314a06e7b95f442f0Andreas Huber            const sp<ANetworkSession> &netSession,
420b73d4730202fcad53aefc4314a06e7b95f442f0Andreas Huber            const sp<IRemoteDisplayClient> &client);
43d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
44bcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9Andreas Huber    status_t start(const char *iface);
45d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    status_t stop();
46d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
47d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberprotected:
48d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    virtual ~WifiDisplaySource();
49d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
50d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
51d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberprivate:
52d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    struct PlaybackSession;
53d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
54b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber#if REQUIRE_HDCP
55b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    struct HDCPObserver;
56b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber#endif
57b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber
58ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber    enum State {
59ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber        INITIALIZED,
60ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber        AWAITING_CLIENT_CONNECTION,
61ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber        AWAITING_CLIENT_SETUP,
62ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber        AWAITING_CLIENT_PLAY,
63ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber        ABOUT_TO_PLAY,
64ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber        PLAYING,
65ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber        AWAITING_CLIENT_TEARDOWN,
66ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber        STOPPING,
67ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber        STOPPED,
68ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber    };
69ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber
70d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    enum {
71d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        kWhatStart,
72d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        kWhatRTSPNotify,
73d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        kWhatStop,
74d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        kWhatReapDeadClients,
75d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        kWhatPlaybackSessionNotify,
76b6777017a68ed473d61cc9d6e77c34fd5cd301ccAndreas Huber        kWhatKeepAlive,
77b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber        kWhatHDCPNotify,
78ef7d3793fa9bbfb25253626ede9a020ee9280a17Andreas Huber        kWhatFinishStop2,
79ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber        kWhatTeardownTriggerTimedOut,
80d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    };
81d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
82d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    struct ResponseID {
83d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        int32_t mSessionID;
84d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        int32_t mCSeq;
85d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
86d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        bool operator<(const ResponseID &other) const {
87d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            return mSessionID < other.mSessionID
88d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber                || (mSessionID == other.mSessionID
89d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber                        && mCSeq < other.mCSeq);
90d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        }
91d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    };
92d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
93d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    typedef status_t (WifiDisplaySource::*HandleRTSPResponseFunc)(
94d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID, const sp<ParsedMessage> &msg);
95d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
96d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    static const int64_t kReaperIntervalUs = 1000000ll;
97d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
98ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber    // We request that the dongle send us a "TEARDOWN" in order to
99ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber    // perform an orderly shutdown. We're willing to wait up to 2 secs
100ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber    // for this message to arrive, after that we'll force a disconnect
101ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber    // instead.
102ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber    static const int64_t kTeardownTriggerTimeouSecs = 2;
103ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber
104d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    static const int64_t kPlaybackSessionTimeoutSecs = 30;
105d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
106d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    static const int64_t kPlaybackSessionTimeoutUs =
107d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        kPlaybackSessionTimeoutSecs * 1000000ll;
108d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
109ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber    State mState;
110d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    sp<ANetworkSession> mNetSession;
1110b73d4730202fcad53aefc4314a06e7b95f442f0Andreas Huber    sp<IRemoteDisplayClient> mClient;
112bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber    struct in_addr mInterfaceAddr;
113d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    int32_t mSessionID;
114d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
115ea4bbfdcad9478ea19257fb19a32de68a2dfd958Andreas Huber    uint32_t mStopReplyID;
116ea4bbfdcad9478ea19257fb19a32de68a2dfd958Andreas Huber
117c92bed3a73c06e90217f8f199ca0b517aa7595d2Andreas Huber    int32_t mClientSessionID;
118c92bed3a73c06e90217f8f199ca0b517aa7595d2Andreas Huber
119d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    struct ClientInfo {
120d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        AString mRemoteIP;
121d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        AString mLocalIP;
122d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        int32_t mLocalPort;
123b6777017a68ed473d61cc9d6e77c34fd5cd301ccAndreas Huber        int32_t mPlaybackSessionID;
124c92bed3a73c06e90217f8f199ca0b517aa7595d2Andreas Huber        sp<PlaybackSession> mPlaybackSession;
125d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    };
126c92bed3a73c06e90217f8f199ca0b517aa7595d2Andreas Huber    ClientInfo mClientInfo;
127d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
128d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    bool mReaperPending;
129d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
130d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    int32_t mNextCSeq;
131d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
132d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    KeyedVector<ResponseID, HandleRTSPResponseFunc> mResponseHandlers;
133d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
134b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber#if REQUIRE_HDCP
135b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    bool mIsHDCP2_0;
136b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    int32_t mHDCPPort;
137b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    sp<IHDCP> mHDCP;
138b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    sp<HDCPObserver> mHDCPObserver;
139b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber
140b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    bool mHDCPInitializationComplete;
141b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    bool mSetupTriggerDeferred;
142b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber
143b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    status_t makeHDCP();
144b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber#endif
145b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber
146d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    status_t sendM1(int32_t sessionID);
147d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    status_t sendM3(int32_t sessionID);
148d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    status_t sendM4(int32_t sessionID);
149ea4bbfdcad9478ea19257fb19a32de68a2dfd958Andreas Huber    status_t sendM5(int32_t sessionID, bool requestShutdown);
150b6777017a68ed473d61cc9d6e77c34fd5cd301ccAndreas Huber    status_t sendM16(int32_t sessionID);
151d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
152d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    status_t onReceiveM1Response(
153d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID, const sp<ParsedMessage> &msg);
154d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
155d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    status_t onReceiveM3Response(
156d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID, const sp<ParsedMessage> &msg);
157d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
158d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    status_t onReceiveM4Response(
159d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID, const sp<ParsedMessage> &msg);
160d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
161d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    status_t onReceiveM5Response(
162d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID, const sp<ParsedMessage> &msg);
163d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
164b6777017a68ed473d61cc9d6e77c34fd5cd301ccAndreas Huber    status_t onReceiveM16Response(
165b6777017a68ed473d61cc9d6e77c34fd5cd301ccAndreas Huber            int32_t sessionID, const sp<ParsedMessage> &msg);
166b6777017a68ed473d61cc9d6e77c34fd5cd301ccAndreas Huber
167d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    void registerResponseHandler(
168d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID, int32_t cseq, HandleRTSPResponseFunc func);
169d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
170b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    status_t onReceiveClientData(const sp<AMessage> &msg);
171d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
172b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    status_t onOptionsRequest(
173d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID,
174d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t cseq,
175d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            const sp<ParsedMessage> &data);
176d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
177b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    status_t onSetupRequest(
178d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID,
179d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t cseq,
180d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            const sp<ParsedMessage> &data);
181d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
182b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    status_t onPlayRequest(
183d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID,
184d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t cseq,
185d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            const sp<ParsedMessage> &data);
186d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
187b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    status_t onPauseRequest(
188d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID,
189d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t cseq,
190d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            const sp<ParsedMessage> &data);
191d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
192b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    status_t onTeardownRequest(
193d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID,
194d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t cseq,
195d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            const sp<ParsedMessage> &data);
196d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
197b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    status_t onGetParameterRequest(
198d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID,
199d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t cseq,
200d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            const sp<ParsedMessage> &data);
201d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
202b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    status_t onSetParameterRequest(
203d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID,
204d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t cseq,
205d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            const sp<ParsedMessage> &data);
206d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
207d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    void sendErrorResponse(
208d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID,
209d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            const char *errorDetail,
210d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t cseq);
211d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
212d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    static void AppendCommonResponse(
213d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            AString *response, int32_t cseq, int32_t playbackSessionID = -1ll);
214d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
215d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    void scheduleReaper();
216b6777017a68ed473d61cc9d6e77c34fd5cd301ccAndreas Huber    void scheduleKeepAlive(int32_t sessionID);
217d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
218d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    int32_t makeUniquePlaybackSessionID() const;
219d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
220d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    sp<PlaybackSession> findPlaybackSession(
221d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            const sp<ParsedMessage> &data, int32_t *playbackSessionID) const;
222d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
223eb11600a248cfe5b95ddd3e5aaae02bd2ab65276Andreas Huber    void finishStop();
22496fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber    void disconnectClientAsync();
22596fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber    void disconnectClient2();
22696fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber    void finishStopAfterDisconnectingClient();
227eb11600a248cfe5b95ddd3e5aaae02bd2ab65276Andreas Huber    void finishStop2();
228ea4bbfdcad9478ea19257fb19a32de68a2dfd958Andreas Huber
229d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(WifiDisplaySource);
230d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber};
231d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
232d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber}  // namespace android
233d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
234d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif  // WIFI_DISPLAY_SOURCE_H_
235