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