WifiDisplaySource.h revision 96fc6cc65ca93009a759a3a874b82a35771b9714
1/* 2 * Copyright 2012, The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef WIFI_DISPLAY_SOURCE_H_ 18 19#define WIFI_DISPLAY_SOURCE_H_ 20 21#include "ANetworkSession.h" 22 23#include <media/stagefright/foundation/AHandler.h> 24 25#include <netinet/in.h> 26 27namespace android { 28 29#define REQUIRE_HDCP 0 30 31struct IHDCP; 32struct IRemoteDisplayClient; 33struct ParsedMessage; 34 35// Represents the RTSP server acting as a wifi display source. 36// Manages incoming connections, sets up Playback sessions as necessary. 37struct WifiDisplaySource : public AHandler { 38 static const unsigned kWifiDisplayDefaultPort = 7236; 39 40 WifiDisplaySource( 41 const sp<ANetworkSession> &netSession, 42 const sp<IRemoteDisplayClient> &client); 43 44 status_t start(const char *iface); 45 status_t stop(); 46 47protected: 48 virtual ~WifiDisplaySource(); 49 virtual void onMessageReceived(const sp<AMessage> &msg); 50 51private: 52 struct PlaybackSession; 53 54#if REQUIRE_HDCP 55 struct HDCPObserver; 56#endif 57 58 enum { 59 kWhatStart, 60 kWhatRTSPNotify, 61 kWhatStop, 62 kWhatReapDeadClients, 63 kWhatPlaybackSessionNotify, 64 kWhatKeepAlive, 65 kWhatHDCPNotify, 66 kWhatFinishStop2, 67 }; 68 69 struct ResponseID { 70 int32_t mSessionID; 71 int32_t mCSeq; 72 73 bool operator<(const ResponseID &other) const { 74 return mSessionID < other.mSessionID 75 || (mSessionID == other.mSessionID 76 && mCSeq < other.mCSeq); 77 } 78 }; 79 80 typedef status_t (WifiDisplaySource::*HandleRTSPResponseFunc)( 81 int32_t sessionID, const sp<ParsedMessage> &msg); 82 83 static const int64_t kReaperIntervalUs = 1000000ll; 84 85 static const int64_t kPlaybackSessionTimeoutSecs = 30; 86 87 static const int64_t kPlaybackSessionTimeoutUs = 88 kPlaybackSessionTimeoutSecs * 1000000ll; 89 90 sp<ANetworkSession> mNetSession; 91 sp<IRemoteDisplayClient> mClient; 92 struct in_addr mInterfaceAddr; 93 int32_t mSessionID; 94 95 uint32_t mStopReplyID; 96 97 int32_t mClientSessionID; 98 99 struct ClientInfo { 100 AString mRemoteIP; 101 AString mLocalIP; 102 int32_t mLocalPort; 103 int32_t mPlaybackSessionID; 104 sp<PlaybackSession> mPlaybackSession; 105 }; 106 ClientInfo mClientInfo; 107 108 bool mReaperPending; 109 110 int32_t mNextCSeq; 111 112 KeyedVector<ResponseID, HandleRTSPResponseFunc> mResponseHandlers; 113 114#if REQUIRE_HDCP 115 bool mIsHDCP2_0; 116 int32_t mHDCPPort; 117 sp<IHDCP> mHDCP; 118 sp<HDCPObserver> mHDCPObserver; 119 120 bool mHDCPInitializationComplete; 121 bool mSetupTriggerDeferred; 122 123 status_t makeHDCP(); 124#endif 125 126 status_t sendM1(int32_t sessionID); 127 status_t sendM3(int32_t sessionID); 128 status_t sendM4(int32_t sessionID); 129 status_t sendM5(int32_t sessionID, bool requestShutdown); 130 status_t sendM16(int32_t sessionID); 131 132 status_t onReceiveM1Response( 133 int32_t sessionID, const sp<ParsedMessage> &msg); 134 135 status_t onReceiveM3Response( 136 int32_t sessionID, const sp<ParsedMessage> &msg); 137 138 status_t onReceiveM4Response( 139 int32_t sessionID, const sp<ParsedMessage> &msg); 140 141 status_t onReceiveM5Response( 142 int32_t sessionID, const sp<ParsedMessage> &msg); 143 144 status_t onReceiveM16Response( 145 int32_t sessionID, const sp<ParsedMessage> &msg); 146 147 void registerResponseHandler( 148 int32_t sessionID, int32_t cseq, HandleRTSPResponseFunc func); 149 150 status_t onReceiveClientData(const sp<AMessage> &msg); 151 152 status_t onOptionsRequest( 153 int32_t sessionID, 154 int32_t cseq, 155 const sp<ParsedMessage> &data); 156 157 status_t onSetupRequest( 158 int32_t sessionID, 159 int32_t cseq, 160 const sp<ParsedMessage> &data); 161 162 status_t onPlayRequest( 163 int32_t sessionID, 164 int32_t cseq, 165 const sp<ParsedMessage> &data); 166 167 status_t onPauseRequest( 168 int32_t sessionID, 169 int32_t cseq, 170 const sp<ParsedMessage> &data); 171 172 status_t onTeardownRequest( 173 int32_t sessionID, 174 int32_t cseq, 175 const sp<ParsedMessage> &data); 176 177 status_t onGetParameterRequest( 178 int32_t sessionID, 179 int32_t cseq, 180 const sp<ParsedMessage> &data); 181 182 status_t onSetParameterRequest( 183 int32_t sessionID, 184 int32_t cseq, 185 const sp<ParsedMessage> &data); 186 187 void sendErrorResponse( 188 int32_t sessionID, 189 const char *errorDetail, 190 int32_t cseq); 191 192 static void AppendCommonResponse( 193 AString *response, int32_t cseq, int32_t playbackSessionID = -1ll); 194 195 void scheduleReaper(); 196 void scheduleKeepAlive(int32_t sessionID); 197 198 int32_t makeUniquePlaybackSessionID() const; 199 200 sp<PlaybackSession> findPlaybackSession( 201 const sp<ParsedMessage> &data, int32_t *playbackSessionID) const; 202 203 void finishStop(); 204 void disconnectClientAsync(); 205 void disconnectClient2(); 206 void finishStopAfterDisconnectingClient(); 207 void finishStop2(); 208 209 DISALLOW_EVIL_CONSTRUCTORS(WifiDisplaySource); 210}; 211 212} // namespace android 213 214#endif // WIFI_DISPLAY_SOURCE_H_ 215