1 /* 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef WEBRTC_VIDEO_PAYLOAD_ROUTER_H_ 12 #define WEBRTC_VIDEO_PAYLOAD_ROUTER_H_ 13 14 #include <list> 15 #include <vector> 16 17 #include "webrtc/base/constructormagic.h" 18 #include "webrtc/base/scoped_ptr.h" 19 #include "webrtc/base/thread_annotations.h" 20 #include "webrtc/common_types.h" 21 #include "webrtc/system_wrappers/include/atomic32.h" 22 23 namespace webrtc { 24 25 class CriticalSectionWrapper; 26 class RTPFragmentationHeader; 27 class RtpRtcp; 28 struct RTPVideoHeader; 29 30 // PayloadRouter routes outgoing data to the correct sending RTP module, based 31 // on the simulcast layer in RTPVideoHeader. 32 class PayloadRouter { 33 public: 34 PayloadRouter(); 35 ~PayloadRouter(); 36 37 static size_t DefaultMaxPayloadLength(); 38 39 // Rtp modules are assumed to be sorted in simulcast index order. 40 void SetSendingRtpModules(const std::list<RtpRtcp*>& rtp_modules); 41 42 // PayloadRouter will only route packets if being active, all packets will be 43 // dropped otherwise. 44 void set_active(bool active); 45 bool active(); 46 47 // Input parameters according to the signature of RtpRtcp::SendOutgoingData. 48 // Returns true if the packet was routed / sent, false otherwise. 49 bool RoutePayload(FrameType frame_type, 50 int8_t payload_type, 51 uint32_t time_stamp, 52 int64_t capture_time_ms, 53 const uint8_t* payload_data, 54 size_t payload_size, 55 const RTPFragmentationHeader* fragmentation, 56 const RTPVideoHeader* rtp_video_hdr); 57 58 // Configures current target bitrate per module. 'stream_bitrates' is assumed 59 // to be in the same order as 'SetSendingRtpModules'. 60 void SetTargetSendBitrates(const std::vector<uint32_t>& stream_bitrates); 61 62 // Returns the maximum allowed data payload length, given the configured MTU 63 // and RTP headers. 64 size_t MaxPayloadLength() const; 65 AddRef()66 void AddRef() { ++ref_count_; } Release()67 void Release() { if (--ref_count_ == 0) { delete this; } } 68 69 private: 70 // TODO(mflodman): When the new video API has launched, remove crit_ and 71 // assume rtp_modules_ will never change during a call. 72 rtc::scoped_ptr<CriticalSectionWrapper> crit_; 73 74 // Active sending RTP modules, in layer order. 75 std::vector<RtpRtcp*> rtp_modules_ GUARDED_BY(crit_.get()); 76 bool active_ GUARDED_BY(crit_.get()); 77 78 Atomic32 ref_count_; 79 80 RTC_DISALLOW_COPY_AND_ASSIGN(PayloadRouter); 81 }; 82 83 } // namespace webrtc 84 85 #endif // WEBRTC_VIDEO_PAYLOAD_ROUTER_H_ 86