• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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> &notify);
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