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