webrtc_m130/webrtc/modules/pacing/packet_router.h
stefan bba9dec4d5 Use separate rtp module lists for send and receive in PacketRouter.
This makes it possible to handle send and receive streams with the same SSRC, which is currently the case in some peer connection tests.

Also moves sending transport feedback to the pacer thread.

BUG=webrtc:5263

Review URL: https://codereview.webrtc.org/1628683002

Cr-Commit-Position: refs/heads/master@{#11443}
2016-02-01 12:40:04 +00:00

69 lines
2.2 KiB
C++

/*
* Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef WEBRTC_MODULES_PACING_PACKET_ROUTER_H_
#define WEBRTC_MODULES_PACING_PACKET_ROUTER_H_
#include <list>
#include "webrtc/base/constructormagic.h"
#include "webrtc/base/criticalsection.h"
#include "webrtc/base/scoped_ptr.h"
#include "webrtc/base/thread_annotations.h"
#include "webrtc/base/thread_checker.h"
#include "webrtc/common_types.h"
#include "webrtc/modules/pacing/paced_sender.h"
#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
namespace webrtc {
class RtpRtcp;
namespace rtcp {
class TransportFeedback;
} // namespace rtcp
// PacketRouter routes outgoing data to the correct sending RTP module, based
// on the simulcast layer in RTPVideoHeader.
class PacketRouter : public PacedSender::Callback,
public TransportSequenceNumberAllocator {
public:
PacketRouter();
virtual ~PacketRouter();
void AddRtpModule(RtpRtcp* rtp_module, bool sender);
void RemoveRtpModule(RtpRtcp* rtp_module, bool sender);
// Implements PacedSender::Callback.
bool TimeToSendPacket(uint32_t ssrc,
uint16_t sequence_number,
int64_t capture_timestamp,
bool retransmission) override;
size_t TimeToSendPadding(size_t bytes) override;
void SetTransportWideSequenceNumber(uint16_t sequence_number);
uint16_t AllocateSequenceNumber() override;
// Send transport feedback packet to send-side.
virtual bool SendFeedback(rtcp::TransportFeedback* packet);
private:
rtc::ThreadChecker pacer_thread_checker_;
rtc::CriticalSection modules_crit_;
std::list<RtpRtcp*> send_rtp_modules_ GUARDED_BY(modules_crit_);
std::list<RtpRtcp*> recv_rtp_modules_ GUARDED_BY(modules_crit_);
volatile int transport_seq_;
RTC_DISALLOW_COPY_AND_ASSIGN(PacketRouter);
};
} // namespace webrtc
#endif // WEBRTC_MODULES_PACING_PACKET_ROUTER_H_