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