WifiDisplaySource.h revision c92bed3a73c06e90217f8f199ca0b517aa7595d2
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 290b73d4730202fcad53aefc4314a06e7b95f442f0Andreas Huberstruct IRemoteDisplayClient; 30d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberstruct ParsedMessage; 31d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 32d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber// Represents the RTSP server acting as a wifi display source. 33d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber// Manages incoming connections, sets up Playback sessions as necessary. 34d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberstruct WifiDisplaySource : public AHandler { 35d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber static const unsigned kWifiDisplayDefaultPort = 7236; 36d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 370b73d4730202fcad53aefc4314a06e7b95f442f0Andreas Huber WifiDisplaySource( 380b73d4730202fcad53aefc4314a06e7b95f442f0Andreas Huber const sp<ANetworkSession> &netSession, 390b73d4730202fcad53aefc4314a06e7b95f442f0Andreas Huber const sp<IRemoteDisplayClient> &client); 40d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 41bcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9Andreas Huber status_t start(const char *iface); 42d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber status_t stop(); 43d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 44d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberprotected: 45d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber virtual ~WifiDisplaySource(); 46d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 47d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 48d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberprivate: 49d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber struct PlaybackSession; 50d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 51d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber enum { 52d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber kWhatStart, 53d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber kWhatRTSPNotify, 54d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber kWhatStop, 55d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber kWhatReapDeadClients, 56d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber kWhatPlaybackSessionNotify, 57b6777017a68ed473d61cc9d6e77c34fd5cd301ccAndreas Huber kWhatKeepAlive, 58d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber }; 59d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 60d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber struct ResponseID { 61d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t mSessionID; 62d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t mCSeq; 63d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 64d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber bool operator<(const ResponseID &other) const { 65d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber return mSessionID < other.mSessionID 66d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber || (mSessionID == other.mSessionID 67d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber && mCSeq < other.mCSeq); 68d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 69d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber }; 70d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 71d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber typedef status_t (WifiDisplaySource::*HandleRTSPResponseFunc)( 72d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t sessionID, const sp<ParsedMessage> &msg); 73d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 74d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber static const int64_t kReaperIntervalUs = 1000000ll; 75d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 76d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber static const int64_t kPlaybackSessionTimeoutSecs = 30; 77d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 78d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber static const int64_t kPlaybackSessionTimeoutUs = 79d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber kPlaybackSessionTimeoutSecs * 1000000ll; 80d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 81d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber sp<ANetworkSession> mNetSession; 820b73d4730202fcad53aefc4314a06e7b95f442f0Andreas Huber sp<IRemoteDisplayClient> mClient; 83bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber struct in_addr mInterfaceAddr; 84d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t mSessionID; 85d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 86c92bed3a73c06e90217f8f199ca0b517aa7595d2Andreas Huber int32_t mClientSessionID; 87c92bed3a73c06e90217f8f199ca0b517aa7595d2Andreas Huber 88d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber struct ClientInfo { 89d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber AString mRemoteIP; 90d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber AString mLocalIP; 91d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t mLocalPort; 92b6777017a68ed473d61cc9d6e77c34fd5cd301ccAndreas Huber int32_t mPlaybackSessionID; 93c92bed3a73c06e90217f8f199ca0b517aa7595d2Andreas Huber sp<PlaybackSession> mPlaybackSession; 94d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber }; 95c92bed3a73c06e90217f8f199ca0b517aa7595d2Andreas Huber ClientInfo mClientInfo; 96d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 97d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber bool mReaperPending; 98d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 99d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t mNextCSeq; 100d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 101d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber KeyedVector<ResponseID, HandleRTSPResponseFunc> mResponseHandlers; 102d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 103d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber status_t sendM1(int32_t sessionID); 104d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber status_t sendM3(int32_t sessionID); 105d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber status_t sendM4(int32_t sessionID); 106d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber status_t sendM5(int32_t sessionID); 107b6777017a68ed473d61cc9d6e77c34fd5cd301ccAndreas Huber status_t sendM16(int32_t sessionID); 108d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 109d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber status_t onReceiveM1Response( 110d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t sessionID, const sp<ParsedMessage> &msg); 111d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 112d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber status_t onReceiveM3Response( 113d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t sessionID, const sp<ParsedMessage> &msg); 114d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 115d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber status_t onReceiveM4Response( 116d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t sessionID, const sp<ParsedMessage> &msg); 117d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 118d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber status_t onReceiveM5Response( 119d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t sessionID, const sp<ParsedMessage> &msg); 120d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 121b6777017a68ed473d61cc9d6e77c34fd5cd301ccAndreas Huber status_t onReceiveM16Response( 122b6777017a68ed473d61cc9d6e77c34fd5cd301ccAndreas Huber int32_t sessionID, const sp<ParsedMessage> &msg); 123b6777017a68ed473d61cc9d6e77c34fd5cd301ccAndreas Huber 124d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber void registerResponseHandler( 125d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t sessionID, int32_t cseq, HandleRTSPResponseFunc func); 126d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 127d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber void onReceiveClientData(const sp<AMessage> &msg); 128d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 129d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber void onDescribeRequest( 130d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t sessionID, 131d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t cseq, 132d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber const sp<ParsedMessage> &data); 133d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 134d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber void onOptionsRequest( 135d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t sessionID, 136d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t cseq, 137d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber const sp<ParsedMessage> &data); 138d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 139d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber void onSetupRequest( 140d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t sessionID, 141d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t cseq, 142d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber const sp<ParsedMessage> &data); 143d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 144d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber void onPlayRequest( 145d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t sessionID, 146d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t cseq, 147d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber const sp<ParsedMessage> &data); 148d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 149d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber void onPauseRequest( 150d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t sessionID, 151d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t cseq, 152d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber const sp<ParsedMessage> &data); 153d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 154d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber void onTeardownRequest( 155d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t sessionID, 156d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t cseq, 157d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber const sp<ParsedMessage> &data); 158d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 159d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber void onGetParameterRequest( 160d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t sessionID, 161d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t cseq, 162d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber const sp<ParsedMessage> &data); 163d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 164d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber void onSetParameterRequest( 165d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t sessionID, 166d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t cseq, 167d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber const sp<ParsedMessage> &data); 168d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 169d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber void sendErrorResponse( 170d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t sessionID, 171d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber const char *errorDetail, 172d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t cseq); 173d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 174d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber static void AppendCommonResponse( 175d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber AString *response, int32_t cseq, int32_t playbackSessionID = -1ll); 176d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 177d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber void scheduleReaper(); 178b6777017a68ed473d61cc9d6e77c34fd5cd301ccAndreas Huber void scheduleKeepAlive(int32_t sessionID); 179d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 180d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t makeUniquePlaybackSessionID() const; 181d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 182d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber sp<PlaybackSession> findPlaybackSession( 183d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber const sp<ParsedMessage> &data, int32_t *playbackSessionID) const; 184d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 185c92bed3a73c06e90217f8f199ca0b517aa7595d2Andreas Huber // Disconnects the current client and shuts down its playback session 186c92bed3a73c06e90217f8f199ca0b517aa7595d2Andreas Huber // (if any). The reason for the disconnection is OK for orderly shutdown 187c92bed3a73c06e90217f8f199ca0b517aa7595d2Andreas Huber // or a nonzero error code. 188c92bed3a73c06e90217f8f199ca0b517aa7595d2Andreas Huber // A listener is notified accordingly. 189c92bed3a73c06e90217f8f199ca0b517aa7595d2Andreas Huber void disconnectClient(status_t err); 190c92bed3a73c06e90217f8f199ca0b517aa7595d2Andreas Huber 191d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(WifiDisplaySource); 192d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber}; 193d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 194d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber} // namespace android 195d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 196d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif // WIFI_DISPLAY_SOURCE_H_ 197