PlaybackSession.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 PLAYBACK_SESSION_H_
18
19#define PLAYBACK_SESSION_H_
20
21#include "WifiDisplaySource.h"
22
23namespace android {
24
25struct ABuffer;
26struct BufferQueue;
27struct IHDCP;
28struct ISurfaceTexture;
29struct MediaPuller;
30struct MediaSource;
31struct TSPacketizer;
32
33#define LOG_TRANSPORT_STREAM            0
34#define ENABLE_RETRANSMISSION           0
35
36// Encapsulates the state of an RTP/RTCP session in the context of wifi
37// display.
38struct WifiDisplaySource::PlaybackSession : public AHandler {
39    PlaybackSession(
40            const sp<ANetworkSession> &netSession,
41            const sp<AMessage> &notify,
42            const struct in_addr &interfaceAddr,
43            const sp<IHDCP> &hdcp);
44
45    enum TransportMode {
46        TRANSPORT_UDP,
47        TRANSPORT_TCP_INTERLEAVED,
48        TRANSPORT_TCP,
49    };
50    status_t init(
51            const char *clientIP, int32_t clientRtp, int32_t clientRtcp,
52            TransportMode transportMode);
53
54    void destroyAsync();
55
56    int32_t getRTPPort() const;
57
58    int64_t getLastLifesignUs() const;
59    void updateLiveness();
60
61    status_t play();
62    status_t finishPlay();
63    status_t pause();
64
65    sp<ISurfaceTexture> getSurfaceTexture();
66    int32_t width() const;
67    int32_t height() const;
68
69    void requestIDRFrame();
70
71    enum {
72        kWhatSessionDead,
73        kWhatBinaryData,
74        kWhatSessionEstablished,
75        kWhatSessionDestroyed,
76    };
77
78protected:
79    virtual void onMessageReceived(const sp<AMessage> &msg);
80    virtual ~PlaybackSession();
81
82private:
83    struct Track;
84
85    enum {
86        kWhatSendSR,
87        kWhatRTPNotify,
88        kWhatRTCPNotify,
89#if ENABLE_RETRANSMISSION
90        kWhatRTPRetransmissionNotify,
91        kWhatRTCPRetransmissionNotify,
92#endif
93        kWhatMediaPullerNotify,
94        kWhatConverterNotify,
95        kWhatTrackNotify,
96        kWhatUpdateSurface,
97        kWhatFinishPlay,
98    };
99
100    static const int64_t kSendSRIntervalUs = 10000000ll;
101    static const uint32_t kSourceID = 0xdeadbeef;
102    static const size_t kMaxHistoryLength = 128;
103
104#if ENABLE_RETRANSMISSION
105    static const size_t kRetransmissionPortOffset = 120;
106#endif
107
108    sp<ANetworkSession> mNetSession;
109    sp<AMessage> mNotify;
110    in_addr mInterfaceAddr;
111    sp<IHDCP> mHDCP;
112    bool mWeAreDead;
113
114    int64_t mLastLifesignUs;
115
116    sp<TSPacketizer> mPacketizer;
117    sp<BufferQueue> mBufferQueue;
118
119    KeyedVector<size_t, sp<Track> > mTracks;
120    ssize_t mVideoTrackIndex;
121
122    sp<ABuffer> mTSQueue;
123    int64_t mPrevTimeUs;
124
125    TransportMode mTransportMode;
126
127    AString mClientIP;
128
129    bool mAllTracksHavePacketizerIndex;
130
131    // in TCP mode
132    int32_t mRTPChannel;
133    int32_t mRTCPChannel;
134
135    // in UDP mode
136    int32_t mRTPPort;
137    int32_t mRTPSessionID;
138    int32_t mRTCPSessionID;
139
140#if ENABLE_RETRANSMISSION
141    int32_t mRTPRetransmissionSessionID;
142    int32_t mRTCPRetransmissionSessionID;
143#endif
144
145    int32_t mClientRTPPort;
146    int32_t mClientRTCPPort;
147    bool mRTPConnected;
148    bool mRTCPConnected;
149
150    uint32_t mRTPSeqNo;
151#if ENABLE_RETRANSMISSION
152    uint32_t mRTPRetransmissionSeqNo;
153#endif
154
155    uint64_t mLastNTPTime;
156    uint32_t mLastRTPTime;
157    uint32_t mNumRTPSent;
158    uint32_t mNumRTPOctetsSent;
159    uint32_t mNumSRsSent;
160
161    bool mSendSRPending;
162
163    int64_t mFirstPacketTimeUs;
164
165    List<sp<ABuffer> > mHistory;
166    size_t mHistoryLength;
167
168    uint64_t mTotalBytesSent;
169
170#if LOG_TRANSPORT_STREAM
171    FILE *mLogFile;
172#endif
173
174    void onSendSR();
175    void addSR(const sp<ABuffer> &buffer);
176    void addSDES(const sp<ABuffer> &buffer);
177    static uint64_t GetNowNTP();
178
179    status_t setupPacketizer();
180
181    status_t addSource(
182            bool isVideo,
183            const sp<MediaSource> &source,
184            size_t *numInputBuffers);
185
186    status_t addVideoSource();
187    status_t addAudioSource();
188
189    ssize_t appendTSData(
190            const void *data, size_t size, bool timeDiscontinuity, bool flush);
191
192    void scheduleSendSR();
193
194    status_t parseRTCP(const sp<ABuffer> &buffer);
195
196#if ENABLE_RETRANSMISSION
197    status_t parseTSFB(const uint8_t *data, size_t size);
198#endif
199
200    status_t sendPacket(int32_t sessionID, const void *data, size_t size);
201    status_t onFinishPlay();
202    status_t onFinishPlay2();
203
204    bool allTracksHavePacketizerIndex();
205
206    status_t packetizeAccessUnit(
207            size_t trackIndex, sp<ABuffer> accessUnit);
208
209    status_t packetizeQueuedAccessUnits();
210
211    void notifySessionDead();
212
213    DISALLOW_EVIL_CONSTRUCTORS(PlaybackSession);
214};
215
216}  // namespace android
217
218#endif  // PLAYBACK_SESSION_H_
219
220