WifiDisplaySource.h revision 0224bf170a3904576bba81593eaab113c5d3a4e7
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 USE_1080P 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 struct HDCPObserver; 54 55 enum State { 56 INITIALIZED, 57 AWAITING_CLIENT_CONNECTION, 58 AWAITING_CLIENT_SETUP, 59 AWAITING_CLIENT_PLAY, 60 ABOUT_TO_PLAY, 61 PLAYING, 62 AWAITING_CLIENT_TEARDOWN, 63 STOPPING, 64 STOPPED, 65 }; 66 67 enum { 68 kWhatStart, 69 kWhatRTSPNotify, 70 kWhatStop, 71 kWhatReapDeadClients, 72 kWhatPlaybackSessionNotify, 73 kWhatKeepAlive, 74 kWhatHDCPNotify, 75 kWhatFinishStop2, 76 kWhatTeardownTriggerTimedOut, 77 }; 78 79 struct ResponseID { 80 int32_t mSessionID; 81 int32_t mCSeq; 82 83 bool operator<(const ResponseID &other) const { 84 return mSessionID < other.mSessionID 85 || (mSessionID == other.mSessionID 86 && mCSeq < other.mCSeq); 87 } 88 }; 89 90 typedef status_t (WifiDisplaySource::*HandleRTSPResponseFunc)( 91 int32_t sessionID, const sp<ParsedMessage> &msg); 92 93 static const int64_t kReaperIntervalUs = 1000000ll; 94 95 // We request that the dongle send us a "TEARDOWN" in order to 96 // perform an orderly shutdown. We're willing to wait up to 2 secs 97 // for this message to arrive, after that we'll force a disconnect 98 // instead. 99 static const int64_t kTeardownTriggerTimeouSecs = 2; 100 101 static const int64_t kPlaybackSessionTimeoutSecs = 30; 102 103 static const int64_t kPlaybackSessionTimeoutUs = 104 kPlaybackSessionTimeoutSecs * 1000000ll; 105 106 State mState; 107 sp<ANetworkSession> mNetSession; 108 sp<IRemoteDisplayClient> mClient; 109 struct in_addr mInterfaceAddr; 110 int32_t mSessionID; 111 112 uint32_t mStopReplyID; 113 114 int32_t mChosenRTPPort; // extracted from "wfd_client_rtp_ports" 115 116 bool mUsingPCMAudio; 117 int32_t mClientSessionID; 118 119 struct ClientInfo { 120 AString mRemoteIP; 121 AString mLocalIP; 122 int32_t mLocalPort; 123 int32_t mPlaybackSessionID; 124 sp<PlaybackSession> mPlaybackSession; 125 }; 126 ClientInfo mClientInfo; 127 128 bool mReaperPending; 129 130 int32_t mNextCSeq; 131 132 KeyedVector<ResponseID, HandleRTSPResponseFunc> mResponseHandlers; 133 134 // HDCP specific section >>>> 135 bool mUsingHDCP; 136 bool mIsHDCP2_0; 137 int32_t mHDCPPort; 138 sp<IHDCP> mHDCP; 139 sp<HDCPObserver> mHDCPObserver; 140 141 bool mHDCPInitializationComplete; 142 bool mSetupTriggerDeferred; 143 144 status_t makeHDCP(); 145 // <<<< HDCP specific section 146 147 status_t sendM1(int32_t sessionID); 148 status_t sendM3(int32_t sessionID); 149 status_t sendM4(int32_t sessionID); 150 status_t sendM5(int32_t sessionID, bool requestShutdown); 151 status_t sendM16(int32_t sessionID); 152 153 status_t onReceiveM1Response( 154 int32_t sessionID, const sp<ParsedMessage> &msg); 155 156 status_t onReceiveM3Response( 157 int32_t sessionID, const sp<ParsedMessage> &msg); 158 159 status_t onReceiveM4Response( 160 int32_t sessionID, const sp<ParsedMessage> &msg); 161 162 status_t onReceiveM5Response( 163 int32_t sessionID, const sp<ParsedMessage> &msg); 164 165 status_t onReceiveM16Response( 166 int32_t sessionID, const sp<ParsedMessage> &msg); 167 168 void registerResponseHandler( 169 int32_t sessionID, int32_t cseq, HandleRTSPResponseFunc func); 170 171 status_t onReceiveClientData(const sp<AMessage> &msg); 172 173 status_t onOptionsRequest( 174 int32_t sessionID, 175 int32_t cseq, 176 const sp<ParsedMessage> &data); 177 178 status_t onSetupRequest( 179 int32_t sessionID, 180 int32_t cseq, 181 const sp<ParsedMessage> &data); 182 183 status_t onPlayRequest( 184 int32_t sessionID, 185 int32_t cseq, 186 const sp<ParsedMessage> &data); 187 188 status_t onPauseRequest( 189 int32_t sessionID, 190 int32_t cseq, 191 const sp<ParsedMessage> &data); 192 193 status_t onTeardownRequest( 194 int32_t sessionID, 195 int32_t cseq, 196 const sp<ParsedMessage> &data); 197 198 status_t onGetParameterRequest( 199 int32_t sessionID, 200 int32_t cseq, 201 const sp<ParsedMessage> &data); 202 203 status_t onSetParameterRequest( 204 int32_t sessionID, 205 int32_t cseq, 206 const sp<ParsedMessage> &data); 207 208 void sendErrorResponse( 209 int32_t sessionID, 210 const char *errorDetail, 211 int32_t cseq); 212 213 static void AppendCommonResponse( 214 AString *response, int32_t cseq, int32_t playbackSessionID = -1ll); 215 216 void scheduleReaper(); 217 void scheduleKeepAlive(int32_t sessionID); 218 219 int32_t makeUniquePlaybackSessionID() const; 220 221 sp<PlaybackSession> findPlaybackSession( 222 const sp<ParsedMessage> &data, int32_t *playbackSessionID) const; 223 224 void finishStop(); 225 void disconnectClientAsync(); 226 void disconnectClient2(); 227 void finishStopAfterDisconnectingClient(); 228 void finishStop2(); 229 230 DISALLOW_EVIL_CONSTRUCTORS(WifiDisplaySource); 231}; 232 233} // namespace android 234 235#endif // WIFI_DISPLAY_SOURCE_H_ 236