WifiDisplaySource.h revision 0328ec08dc1e90caa2a9e0c4e107d8ddaa74af20
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 Huberstruct IHDCP;
300b73d4730202fcad53aefc4314a06e7b95f442f0Andreas Huberstruct IRemoteDisplayClient;
31d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberstruct ParsedMessage;
32d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
33d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber// Represents the RTSP server acting as a wifi display source.
34d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber// Manages incoming connections, sets up Playback sessions as necessary.
35d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberstruct WifiDisplaySource : public AHandler {
36d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    static const unsigned kWifiDisplayDefaultPort = 7236;
37d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
380b73d4730202fcad53aefc4314a06e7b95f442f0Andreas Huber    WifiDisplaySource(
390b73d4730202fcad53aefc4314a06e7b95f442f0Andreas Huber            const sp<ANetworkSession> &netSession,
400b73d4730202fcad53aefc4314a06e7b95f442f0Andreas Huber            const sp<IRemoteDisplayClient> &client);
41d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
42bcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9Andreas Huber    status_t start(const char *iface);
43d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    status_t stop();
44d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
45d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberprotected:
46d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    virtual ~WifiDisplaySource();
47d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
48d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
49d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberprivate:
50d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    struct PlaybackSession;
51b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    struct HDCPObserver;
52b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber
53ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber    enum State {
54ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber        INITIALIZED,
55ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber        AWAITING_CLIENT_CONNECTION,
56ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber        AWAITING_CLIENT_SETUP,
57ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber        AWAITING_CLIENT_PLAY,
58ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber        ABOUT_TO_PLAY,
59ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber        PLAYING,
60ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber        AWAITING_CLIENT_TEARDOWN,
61ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber        STOPPING,
62ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber        STOPPED,
63ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber    };
64ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber
65d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    enum {
66d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        kWhatStart,
67d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        kWhatRTSPNotify,
68d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        kWhatStop,
69d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        kWhatReapDeadClients,
70d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        kWhatPlaybackSessionNotify,
71b6777017a68ed473d61cc9d6e77c34fd5cd301ccAndreas Huber        kWhatKeepAlive,
72b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber        kWhatHDCPNotify,
73ef7d3793fa9bbfb25253626ede9a020ee9280a17Andreas Huber        kWhatFinishStop2,
74ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber        kWhatTeardownTriggerTimedOut,
75d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    };
76d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
77d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    struct ResponseID {
78d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        int32_t mSessionID;
79d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        int32_t mCSeq;
80d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
81d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        bool operator<(const ResponseID &other) const {
82d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            return mSessionID < other.mSessionID
83d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber                || (mSessionID == other.mSessionID
84d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber                        && mCSeq < other.mCSeq);
85d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        }
86d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    };
87d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
88d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    typedef status_t (WifiDisplaySource::*HandleRTSPResponseFunc)(
89d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID, const sp<ParsedMessage> &msg);
90d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
91d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    static const int64_t kReaperIntervalUs = 1000000ll;
92d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
93ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber    // We request that the dongle send us a "TEARDOWN" in order to
94ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber    // perform an orderly shutdown. We're willing to wait up to 2 secs
95ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber    // for this message to arrive, after that we'll force a disconnect
96ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber    // instead.
97ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber    static const int64_t kTeardownTriggerTimeouSecs = 2;
98ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber
99d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    static const int64_t kPlaybackSessionTimeoutSecs = 30;
100d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
101d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    static const int64_t kPlaybackSessionTimeoutUs =
102d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        kPlaybackSessionTimeoutSecs * 1000000ll;
103d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
104ad0d97c7cf620e96a0b088dd9461645a3f8900b7Andreas Huber    State mState;
105d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    sp<ANetworkSession> mNetSession;
1060b73d4730202fcad53aefc4314a06e7b95f442f0Andreas Huber    sp<IRemoteDisplayClient> mClient;
107bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber    struct in_addr mInterfaceAddr;
108d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    int32_t mSessionID;
109d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
110ea4bbfdcad9478ea19257fb19a32de68a2dfd958Andreas Huber    uint32_t mStopReplyID;
111ea4bbfdcad9478ea19257fb19a32de68a2dfd958Andreas Huber
112d243c04534d1b74bd66625c5c96a9b918d8838bfAndreas Huber    int32_t mChosenRTPPort;  // extracted from "wfd_client_rtp_ports"
113d243c04534d1b74bd66625c5c96a9b918d8838bfAndreas Huber
114e7bd24af08ef0722fb124a550662bcec48c56f86Andreas Huber    bool mUsingPCMAudio;
115c92bed3a73c06e90217f8f199ca0b517aa7595d2Andreas Huber    int32_t mClientSessionID;
116c92bed3a73c06e90217f8f199ca0b517aa7595d2Andreas Huber
117d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    struct ClientInfo {
118d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        AString mRemoteIP;
119d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        AString mLocalIP;
120d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        int32_t mLocalPort;
121b6777017a68ed473d61cc9d6e77c34fd5cd301ccAndreas Huber        int32_t mPlaybackSessionID;
122c92bed3a73c06e90217f8f199ca0b517aa7595d2Andreas Huber        sp<PlaybackSession> mPlaybackSession;
123d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    };
124c92bed3a73c06e90217f8f199ca0b517aa7595d2Andreas Huber    ClientInfo mClientInfo;
125d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
126d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    bool mReaperPending;
127d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
128d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    int32_t mNextCSeq;
129d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
130d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    KeyedVector<ResponseID, HandleRTSPResponseFunc> mResponseHandlers;
131d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
1320328ec08dc1e90caa2a9e0c4e107d8ddaa74af20Andreas Huber    // HDCP specific section >>>>
1330328ec08dc1e90caa2a9e0c4e107d8ddaa74af20Andreas Huber    bool mUsingHDCP;
134b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    bool mIsHDCP2_0;
135b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    int32_t mHDCPPort;
136b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    sp<IHDCP> mHDCP;
137b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    sp<HDCPObserver> mHDCPObserver;
138b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber
139b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    bool mHDCPInitializationComplete;
140b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    bool mSetupTriggerDeferred;
141b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber
142b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    status_t makeHDCP();
1430328ec08dc1e90caa2a9e0c4e107d8ddaa74af20Andreas Huber    // <<<< HDCP specific section
144b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber
145d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    status_t sendM1(int32_t sessionID);
146d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    status_t sendM3(int32_t sessionID);
147d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    status_t sendM4(int32_t sessionID);
148ea4bbfdcad9478ea19257fb19a32de68a2dfd958Andreas Huber    status_t sendM5(int32_t sessionID, bool requestShutdown);
149b6777017a68ed473d61cc9d6e77c34fd5cd301ccAndreas Huber    status_t sendM16(int32_t sessionID);
150d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
151d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    status_t onReceiveM1Response(
152d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID, const sp<ParsedMessage> &msg);
153d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
154d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    status_t onReceiveM3Response(
155d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID, const sp<ParsedMessage> &msg);
156d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
157d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    status_t onReceiveM4Response(
158d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID, const sp<ParsedMessage> &msg);
159d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
160d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    status_t onReceiveM5Response(
161d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID, const sp<ParsedMessage> &msg);
162d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
163b6777017a68ed473d61cc9d6e77c34fd5cd301ccAndreas Huber    status_t onReceiveM16Response(
164b6777017a68ed473d61cc9d6e77c34fd5cd301ccAndreas Huber            int32_t sessionID, const sp<ParsedMessage> &msg);
165b6777017a68ed473d61cc9d6e77c34fd5cd301ccAndreas Huber
166d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    void registerResponseHandler(
167d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID, int32_t cseq, HandleRTSPResponseFunc func);
168d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
169b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    status_t onReceiveClientData(const sp<AMessage> &msg);
170d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
171b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    status_t onOptionsRequest(
172d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID,
173d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t cseq,
174d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            const sp<ParsedMessage> &data);
175d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
176b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    status_t onSetupRequest(
177d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID,
178d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t cseq,
179d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            const sp<ParsedMessage> &data);
180d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
181b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    status_t onPlayRequest(
182d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID,
183d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t cseq,
184d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            const sp<ParsedMessage> &data);
185d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
186b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    status_t onPauseRequest(
187d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID,
188d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t cseq,
189d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            const sp<ParsedMessage> &data);
190d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
191b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    status_t onTeardownRequest(
192d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID,
193d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t cseq,
194d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            const sp<ParsedMessage> &data);
195d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
196b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    status_t onGetParameterRequest(
197d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID,
198d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t cseq,
199d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            const sp<ParsedMessage> &data);
200d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
201b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    status_t onSetParameterRequest(
202d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID,
203d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t cseq,
204d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            const sp<ParsedMessage> &data);
205d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
206d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    void sendErrorResponse(
207d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t sessionID,
208d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            const char *errorDetail,
209d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            int32_t cseq);
210d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
211d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    static void AppendCommonResponse(
212d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            AString *response, int32_t cseq, int32_t playbackSessionID = -1ll);
213d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
214d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    void scheduleReaper();
215b6777017a68ed473d61cc9d6e77c34fd5cd301ccAndreas Huber    void scheduleKeepAlive(int32_t sessionID);
216d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
217d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    int32_t makeUniquePlaybackSessionID() const;
218d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
219d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    sp<PlaybackSession> findPlaybackSession(
220d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            const sp<ParsedMessage> &data, int32_t *playbackSessionID) const;
221d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
222eb11600a248cfe5b95ddd3e5aaae02bd2ab65276Andreas Huber    void finishStop();
22396fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber    void disconnectClientAsync();
22496fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber    void disconnectClient2();
22596fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber    void finishStopAfterDisconnectingClient();
226eb11600a248cfe5b95ddd3e5aaae02bd2ab65276Andreas Huber    void finishStop2();
227ea4bbfdcad9478ea19257fb19a32de68a2dfd958Andreas Huber
228d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(WifiDisplaySource);
229d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber};
230d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
231d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber}  // namespace android
232d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
233d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif  // WIFI_DISPLAY_SOURCE_H_
234