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