Home | History | Annotate | Download | only in video
      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 
     66   void AddRef() { ++ref_count_; }
     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