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