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> ¬ify, 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