1 /* 2 * Copyright 2013, 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 RTP_SENDER_H_ 18 19 #define RTP_SENDER_H_ 20 21 #include "RTPBase.h" 22 23 #include <media/stagefright/foundation/AHandler.h> 24 25 namespace android { 26 27 struct ABuffer; 28 struct ANetworkSession; 29 30 // An object of this class facilitates sending of media data over an RTP 31 // channel. The channel is established over a UDP or TCP connection depending 32 // on which "TransportMode" was chosen. In addition different RTP packetization 33 // schemes are supported such as "Transport Stream Packets over RTP", 34 // or "AVC/H.264 encapsulation as specified in RFC 3984 (non-interleaved mode)" 35 struct RTPSender : public RTPBase, public AHandler { 36 enum { 37 kWhatInitDone, 38 kWhatError, 39 kWhatNetworkStall, 40 kWhatInformSender, 41 }; 42 RTPSender( 43 const sp<ANetworkSession> &netSession, 44 const sp<AMessage> ¬ify); 45 46 status_t initAsync( 47 const char *remoteHost, 48 int32_t remoteRTPPort, 49 TransportMode rtpMode, 50 int32_t remoteRTCPPort, 51 TransportMode rtcpMode, 52 int32_t *outLocalRTPPort); 53 54 status_t queueBuffer( 55 const sp<ABuffer> &buffer, 56 uint8_t packetType, 57 PacketizationMode mode); 58 59 protected: 60 virtual ~RTPSender(); 61 virtual void onMessageReceived(const sp<AMessage> &msg); 62 63 private: 64 enum { 65 kWhatRTPNotify, 66 kWhatRTCPNotify, 67 }; 68 69 enum { 70 kMaxNumTSPacketsPerRTPPacket = (kMaxUDPPacketSize - 12) / 188, 71 kMaxHistorySize = 1024, 72 kSourceID = 0xdeadbeef, 73 }; 74 75 sp<ANetworkSession> mNetSession; 76 sp<AMessage> mNotify; 77 TransportMode mRTPMode; 78 TransportMode mRTCPMode; 79 int32_t mRTPSessionID; 80 int32_t mRTCPSessionID; 81 bool mRTPConnected; 82 bool mRTCPConnected; 83 84 uint64_t mLastNTPTime; 85 uint32_t mLastRTPTime; 86 uint32_t mNumRTPSent; 87 uint32_t mNumRTPOctetsSent; 88 uint32_t mNumSRsSent; 89 90 uint32_t mRTPSeqNo; 91 92 List<sp<ABuffer> > mHistory; 93 size_t mHistorySize; 94 95 static uint64_t GetNowNTP(); 96 97 status_t queueRawPacket(const sp<ABuffer> &tsPackets, uint8_t packetType); 98 status_t queueTSPackets(const sp<ABuffer> &tsPackets, uint8_t packetType); 99 status_t queueAVCBuffer(const sp<ABuffer> &accessUnit, uint8_t packetType); 100 101 status_t sendRTPPacket( 102 const sp<ABuffer> &packet, bool storeInHistory, 103 bool timeValid = false, int64_t timeUs = -1ll); 104 105 void onNetNotify(bool isRTP, const sp<AMessage> &msg); 106 107 status_t onRTCPData(const sp<ABuffer> &data); 108 status_t parseReceiverReport(const uint8_t *data, size_t size); 109 status_t parseTSFB(const uint8_t *data, size_t size); 110 status_t parseAPP(const uint8_t *data, size_t size); 111 112 void notifyInitDone(status_t err); 113 void notifyError(status_t err); 114 void notifyNetworkStall(size_t numBytesQueued); 115 116 DISALLOW_EVIL_CONSTRUCTORS(RTPSender); 117 }; 118 119 } // namespace android 120 121 #endif // RTP_SENDER_H_ 122