Rename class RtpStreamReceiver --> RtpVideoStreamReceiver.
This class is video-specific, and we want to free the name "RtpStreamReceiver" so it can be reused for a media-independent RTP receive class. Also renames related files. BUG=webrtc:7135 Review-Url: https://codereview.webrtc.org/2926253002 Cr-Commit-Position: refs/heads/master@{#18510}
This commit is contained in:
parent
e2baffb055
commit
b1f2ff900e
@ -112,7 +112,7 @@ bool FlexfecReceiver::AddReceivedPacket(const RtpPacketReceived& packet) {
|
||||
// This implementation only returns _recovered_ media packets through the
|
||||
// callback, whereas the implementation in UlpfecReceiver returns _all inserted_
|
||||
// media packets through the callback. The latter behaviour makes sense
|
||||
// for ULPFEC, since the ULPFEC receiver is owned by the RtpStreamReceiver.
|
||||
// for ULPFEC, since the ULPFEC receiver is owned by the RtpVideoStreamReceiver.
|
||||
// Here, however, the received media pipeline is more decoupled from the
|
||||
// FlexFEC decoder, and we therefore do not interfere with the reception
|
||||
// of non-recovered media packets.
|
||||
|
||||
@ -24,10 +24,10 @@ rtc_static_library("video") {
|
||||
"receive_statistics_proxy.h",
|
||||
"report_block_stats.cc",
|
||||
"report_block_stats.h",
|
||||
"rtp_stream_receiver.cc",
|
||||
"rtp_stream_receiver.h",
|
||||
"rtp_streams_synchronizer.cc",
|
||||
"rtp_streams_synchronizer.h",
|
||||
"rtp_video_stream_receiver.cc",
|
||||
"rtp_video_stream_receiver.h",
|
||||
"send_delay_stats.cc",
|
||||
"send_delay_stats.h",
|
||||
"send_statistics_proxy.cc",
|
||||
@ -240,7 +240,7 @@ if (rtc_include_tests) {
|
||||
"quality_threshold_unittest.cc",
|
||||
"receive_statistics_proxy_unittest.cc",
|
||||
"report_block_stats_unittest.cc",
|
||||
"rtp_stream_receiver_unittest.cc",
|
||||
"rtp_video_stream_receiver_unittest.cc",
|
||||
"send_delay_stats_unittest.cc",
|
||||
"send_statistics_proxy_unittest.cc",
|
||||
"stats_counter_unittest.cc",
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#include "webrtc/video/rtp_stream_receiver.h"
|
||||
#include "webrtc/video/rtp_video_stream_receiver.h"
|
||||
|
||||
#include <vector>
|
||||
#include <utility>
|
||||
@ -78,7 +78,7 @@ std::unique_ptr<RtpRtcp> CreateRtpRtcpModule(
|
||||
|
||||
static const int kPacketLogIntervalMs = 10000;
|
||||
|
||||
RtpStreamReceiver::RtpStreamReceiver(
|
||||
RtpVideoStreamReceiver::RtpVideoStreamReceiver(
|
||||
Transport* transport,
|
||||
RtcpRttStats* rtt_stats,
|
||||
PacketRouter* packet_router,
|
||||
@ -189,7 +189,7 @@ RtpStreamReceiver::RtpStreamReceiver(
|
||||
reference_finder_.reset(new video_coding::RtpFrameReferenceFinder(this));
|
||||
}
|
||||
|
||||
RtpStreamReceiver::~RtpStreamReceiver() {
|
||||
RtpVideoStreamReceiver::~RtpVideoStreamReceiver() {
|
||||
if (nack_module_) {
|
||||
process_thread_->DeRegisterModule(nack_module_.get());
|
||||
}
|
||||
@ -200,14 +200,14 @@ RtpStreamReceiver::~RtpStreamReceiver() {
|
||||
UpdateHistograms();
|
||||
}
|
||||
|
||||
bool RtpStreamReceiver::AddReceiveCodec(
|
||||
bool RtpVideoStreamReceiver::AddReceiveCodec(
|
||||
const VideoCodec& video_codec,
|
||||
const std::map<std::string, std::string>& codec_params) {
|
||||
pt_codec_params_.insert(make_pair(video_codec.plType, codec_params));
|
||||
return AddReceiveCodec(video_codec);
|
||||
}
|
||||
|
||||
bool RtpStreamReceiver::AddReceiveCodec(const VideoCodec& video_codec) {
|
||||
bool RtpVideoStreamReceiver::AddReceiveCodec(const VideoCodec& video_codec) {
|
||||
int8_t old_pltype = -1;
|
||||
if (rtp_payload_registry_.ReceivePayloadType(video_codec, &old_pltype) !=
|
||||
-1) {
|
||||
@ -216,19 +216,19 @@ bool RtpStreamReceiver::AddReceiveCodec(const VideoCodec& video_codec) {
|
||||
return rtp_payload_registry_.RegisterReceivePayload(video_codec) == 0;
|
||||
}
|
||||
|
||||
uint32_t RtpStreamReceiver::GetRemoteSsrc() const {
|
||||
uint32_t RtpVideoStreamReceiver::GetRemoteSsrc() const {
|
||||
return rtp_receiver_->SSRC();
|
||||
}
|
||||
|
||||
int RtpStreamReceiver::GetCsrcs(uint32_t* csrcs) const {
|
||||
int RtpVideoStreamReceiver::GetCsrcs(uint32_t* csrcs) const {
|
||||
return rtp_receiver_->CSRCs(csrcs);
|
||||
}
|
||||
|
||||
RtpReceiver* RtpStreamReceiver::GetRtpReceiver() const {
|
||||
RtpReceiver* RtpVideoStreamReceiver::GetRtpReceiver() const {
|
||||
return rtp_receiver_.get();
|
||||
}
|
||||
|
||||
int32_t RtpStreamReceiver::OnReceivedPayloadData(
|
||||
int32_t RtpVideoStreamReceiver::OnReceivedPayloadData(
|
||||
const uint8_t* payload_data,
|
||||
size_t payload_size,
|
||||
const WebRtcRTPHeader* rtp_header) {
|
||||
@ -279,8 +279,8 @@ int32_t RtpStreamReceiver::OnReceivedPayloadData(
|
||||
// TODO(nisse): Try to delete this method. Obstacles: It is used by
|
||||
// ParseAndHandleEncapsulatingHeader, for handling Rtx packets, and
|
||||
// for callbacks from |ulpfec_receiver_|.
|
||||
void RtpStreamReceiver::OnRecoveredPacket(const uint8_t* rtp_packet,
|
||||
size_t rtp_packet_length) {
|
||||
void RtpVideoStreamReceiver::OnRecoveredPacket(const uint8_t* rtp_packet,
|
||||
size_t rtp_packet_length) {
|
||||
RTPHeader header;
|
||||
if (!rtp_header_parser_->Parse(rtp_packet, rtp_packet_length, &header)) {
|
||||
return;
|
||||
@ -292,7 +292,7 @@ void RtpStreamReceiver::OnRecoveredPacket(const uint8_t* rtp_packet,
|
||||
|
||||
// TODO(pbos): Remove as soon as audio can handle a changing payload type
|
||||
// without this callback.
|
||||
int32_t RtpStreamReceiver::OnInitializeDecoder(
|
||||
int32_t RtpVideoStreamReceiver::OnInitializeDecoder(
|
||||
const int8_t payload_type,
|
||||
const char payload_name[RTP_PAYLOAD_NAME_SIZE],
|
||||
const int frequency,
|
||||
@ -302,13 +302,13 @@ int32_t RtpStreamReceiver::OnInitializeDecoder(
|
||||
return 0;
|
||||
}
|
||||
|
||||
void RtpStreamReceiver::OnIncomingSSRCChanged(const uint32_t ssrc) {
|
||||
void RtpVideoStreamReceiver::OnIncomingSSRCChanged(const uint32_t ssrc) {
|
||||
rtp_rtcp_->SetRemoteSSRC(ssrc);
|
||||
}
|
||||
|
||||
// This method handles both regular RTP packets and packets recovered
|
||||
// via FlexFEC.
|
||||
void RtpStreamReceiver::OnRtpPacket(const RtpPacketReceived& packet) {
|
||||
void RtpVideoStreamReceiver::OnRtpPacket(const RtpPacketReceived& packet) {
|
||||
{
|
||||
rtc::CritScope lock(&receive_cs_);
|
||||
if (!receiving_) {
|
||||
@ -364,35 +364,34 @@ void RtpStreamReceiver::OnRtpPacket(const RtpPacketReceived& packet) {
|
||||
}
|
||||
}
|
||||
|
||||
int32_t RtpStreamReceiver::RequestKeyFrame() {
|
||||
int32_t RtpVideoStreamReceiver::RequestKeyFrame() {
|
||||
return rtp_rtcp_->RequestKeyFrame();
|
||||
}
|
||||
|
||||
bool RtpStreamReceiver::IsUlpfecEnabled() const {
|
||||
bool RtpVideoStreamReceiver::IsUlpfecEnabled() const {
|
||||
return config_.rtp.ulpfec.ulpfec_payload_type != -1;
|
||||
}
|
||||
|
||||
bool RtpStreamReceiver::IsRedEnabled() const {
|
||||
bool RtpVideoStreamReceiver::IsRedEnabled() const {
|
||||
return config_.rtp.ulpfec.red_payload_type != -1;
|
||||
}
|
||||
|
||||
bool RtpStreamReceiver::IsRetransmissionsEnabled() const {
|
||||
bool RtpVideoStreamReceiver::IsRetransmissionsEnabled() const {
|
||||
return config_.rtp.nack.rtp_history_ms > 0;
|
||||
}
|
||||
|
||||
void RtpStreamReceiver::RequestPacketRetransmit(
|
||||
void RtpVideoStreamReceiver::RequestPacketRetransmit(
|
||||
const std::vector<uint16_t>& sequence_numbers) {
|
||||
rtp_rtcp_->SendNack(sequence_numbers);
|
||||
}
|
||||
|
||||
int32_t RtpStreamReceiver::ResendPackets(const uint16_t* sequence_numbers,
|
||||
uint16_t length) {
|
||||
int32_t RtpVideoStreamReceiver::ResendPackets(const uint16_t* sequence_numbers,
|
||||
uint16_t length) {
|
||||
return rtp_rtcp_->SendNACK(sequence_numbers, length);
|
||||
}
|
||||
|
||||
void RtpStreamReceiver::OnReceivedFrame(
|
||||
void RtpVideoStreamReceiver::OnReceivedFrame(
|
||||
std::unique_ptr<video_coding::RtpFrameObject> frame) {
|
||||
|
||||
if (!has_received_frame_) {
|
||||
has_received_frame_ = true;
|
||||
if (frame->FrameType() != kVideoFrameKey)
|
||||
@ -404,7 +403,7 @@ void RtpStreamReceiver::OnReceivedFrame(
|
||||
reference_finder_->ManageFrame(std::move(frame));
|
||||
}
|
||||
|
||||
void RtpStreamReceiver::OnCompleteFrame(
|
||||
void RtpVideoStreamReceiver::OnCompleteFrame(
|
||||
std::unique_ptr<video_coding::FrameObject> frame) {
|
||||
{
|
||||
rtc::CritScope lock(&last_seq_num_cs_);
|
||||
@ -415,23 +414,25 @@ void RtpStreamReceiver::OnCompleteFrame(
|
||||
complete_frame_callback_->OnCompleteFrame(std::move(frame));
|
||||
}
|
||||
|
||||
void RtpStreamReceiver::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) {
|
||||
void RtpVideoStreamReceiver::OnRttUpdate(int64_t avg_rtt_ms,
|
||||
int64_t max_rtt_ms) {
|
||||
if (nack_module_)
|
||||
nack_module_->UpdateRtt(max_rtt_ms);
|
||||
}
|
||||
|
||||
rtc::Optional<int64_t> RtpStreamReceiver::LastReceivedPacketMs() const {
|
||||
rtc::Optional<int64_t> RtpVideoStreamReceiver::LastReceivedPacketMs() const {
|
||||
return packet_buffer_->LastReceivedPacketMs();
|
||||
}
|
||||
|
||||
rtc::Optional<int64_t> RtpStreamReceiver::LastReceivedKeyframePacketMs() const {
|
||||
rtc::Optional<int64_t> RtpVideoStreamReceiver::LastReceivedKeyframePacketMs()
|
||||
const {
|
||||
return packet_buffer_->LastReceivedKeyframePacketMs();
|
||||
}
|
||||
|
||||
void RtpStreamReceiver::ReceivePacket(const uint8_t* packet,
|
||||
size_t packet_length,
|
||||
const RTPHeader& header,
|
||||
bool in_order) {
|
||||
void RtpVideoStreamReceiver::ReceivePacket(const uint8_t* packet,
|
||||
size_t packet_length,
|
||||
const RTPHeader& header,
|
||||
bool in_order) {
|
||||
if (rtp_payload_registry_.IsEncapsulated(header)) {
|
||||
ParseAndHandleEncapsulatingHeader(packet, packet_length, header);
|
||||
return;
|
||||
@ -448,7 +449,7 @@ void RtpStreamReceiver::ReceivePacket(const uint8_t* packet,
|
||||
payload_specific, in_order);
|
||||
}
|
||||
|
||||
void RtpStreamReceiver::ParseAndHandleEncapsulatingHeader(
|
||||
void RtpVideoStreamReceiver::ParseAndHandleEncapsulatingHeader(
|
||||
const uint8_t* packet, size_t packet_length, const RTPHeader& header) {
|
||||
if (rtp_payload_registry_.IsRed(header)) {
|
||||
int8_t ulpfec_pt = rtp_payload_registry_.ulpfec_payload_type();
|
||||
@ -493,7 +494,8 @@ void RtpStreamReceiver::ParseAndHandleEncapsulatingHeader(
|
||||
}
|
||||
}
|
||||
|
||||
void RtpStreamReceiver::NotifyReceiverOfFecPacket(const RTPHeader& header) {
|
||||
void RtpVideoStreamReceiver::NotifyReceiverOfFecPacket(
|
||||
const RTPHeader& header) {
|
||||
int8_t last_media_payload_type =
|
||||
rtp_payload_registry_.last_received_media_payload_type();
|
||||
if (last_media_payload_type < 0) {
|
||||
@ -525,8 +527,8 @@ void RtpStreamReceiver::NotifyReceiverOfFecPacket(const RTPHeader& header) {
|
||||
OnReceivedPayloadData(nullptr, 0, &rtp_header);
|
||||
}
|
||||
|
||||
bool RtpStreamReceiver::DeliverRtcp(const uint8_t* rtcp_packet,
|
||||
size_t rtcp_packet_length) {
|
||||
bool RtpVideoStreamReceiver::DeliverRtcp(const uint8_t* rtcp_packet,
|
||||
size_t rtcp_packet_length) {
|
||||
{
|
||||
rtc::CritScope lock(&receive_cs_);
|
||||
if (!receiving_) {
|
||||
@ -555,7 +557,7 @@ bool RtpStreamReceiver::DeliverRtcp(const uint8_t* rtcp_packet,
|
||||
return true;
|
||||
}
|
||||
|
||||
void RtpStreamReceiver::FrameContinuous(uint16_t picture_id) {
|
||||
void RtpVideoStreamReceiver::FrameContinuous(uint16_t picture_id) {
|
||||
if (!nack_module_)
|
||||
return;
|
||||
|
||||
@ -570,7 +572,7 @@ void RtpStreamReceiver::FrameContinuous(uint16_t picture_id) {
|
||||
nack_module_->ClearUpTo(seq_num);
|
||||
}
|
||||
|
||||
void RtpStreamReceiver::FrameDecoded(uint16_t picture_id) {
|
||||
void RtpVideoStreamReceiver::FrameDecoded(uint16_t picture_id) {
|
||||
int seq_num = -1;
|
||||
{
|
||||
rtc::CritScope lock(&last_seq_num_cs_);
|
||||
@ -587,22 +589,22 @@ void RtpStreamReceiver::FrameDecoded(uint16_t picture_id) {
|
||||
}
|
||||
}
|
||||
|
||||
void RtpStreamReceiver::SignalNetworkState(NetworkState state) {
|
||||
void RtpVideoStreamReceiver::SignalNetworkState(NetworkState state) {
|
||||
rtp_rtcp_->SetRTCPStatus(state == kNetworkUp ? config_.rtp.rtcp_mode
|
||||
: RtcpMode::kOff);
|
||||
}
|
||||
|
||||
void RtpStreamReceiver::StartReceive() {
|
||||
void RtpVideoStreamReceiver::StartReceive() {
|
||||
rtc::CritScope lock(&receive_cs_);
|
||||
receiving_ = true;
|
||||
}
|
||||
|
||||
void RtpStreamReceiver::StopReceive() {
|
||||
void RtpVideoStreamReceiver::StopReceive() {
|
||||
rtc::CritScope lock(&receive_cs_);
|
||||
receiving_ = false;
|
||||
}
|
||||
|
||||
bool RtpStreamReceiver::IsPacketInOrder(const RTPHeader& header) const {
|
||||
bool RtpVideoStreamReceiver::IsPacketInOrder(const RTPHeader& header) const {
|
||||
StreamStatistician* statistician =
|
||||
rtp_receive_statistics_->GetStatistician(header.ssrc);
|
||||
if (!statistician)
|
||||
@ -610,8 +612,8 @@ bool RtpStreamReceiver::IsPacketInOrder(const RTPHeader& header) const {
|
||||
return statistician->IsPacketInOrder(header.sequenceNumber);
|
||||
}
|
||||
|
||||
bool RtpStreamReceiver::IsPacketRetransmitted(const RTPHeader& header,
|
||||
bool in_order) const {
|
||||
bool RtpVideoStreamReceiver::IsPacketRetransmitted(const RTPHeader& header,
|
||||
bool in_order) const {
|
||||
// Retransmissions are handled separately if RTX is enabled.
|
||||
if (rtp_payload_registry_.RtxEnabled())
|
||||
return false;
|
||||
@ -626,7 +628,7 @@ bool RtpStreamReceiver::IsPacketRetransmitted(const RTPHeader& header,
|
||||
statistician->IsRetransmitOfOldPacket(header, min_rtt);
|
||||
}
|
||||
|
||||
void RtpStreamReceiver::UpdateHistograms() {
|
||||
void RtpVideoStreamReceiver::UpdateHistograms() {
|
||||
FecPacketCounter counter = ulpfec_receiver_->GetPacketCounter();
|
||||
if (counter.first_packet_time_ms == -1)
|
||||
return;
|
||||
@ -648,7 +650,7 @@ void RtpStreamReceiver::UpdateHistograms() {
|
||||
}
|
||||
}
|
||||
|
||||
void RtpStreamReceiver::EnableReceiveRtpHeaderExtension(
|
||||
void RtpVideoStreamReceiver::EnableReceiveRtpHeaderExtension(
|
||||
const std::string& extension, int id) {
|
||||
// One-byte-extension local identifiers are in the range 1-14 inclusive.
|
||||
RTC_DCHECK_GE(id, 1);
|
||||
@ -658,7 +660,7 @@ void RtpStreamReceiver::EnableReceiveRtpHeaderExtension(
|
||||
StringToRtpExtensionType(extension), id));
|
||||
}
|
||||
|
||||
void RtpStreamReceiver::InsertSpsPpsIntoTracker(uint8_t payload_type) {
|
||||
void RtpVideoStreamReceiver::InsertSpsPpsIntoTracker(uint8_t payload_type) {
|
||||
auto codec_params_it = pt_codec_params_.find(payload_type);
|
||||
if (codec_params_it == pt_codec_params_.end())
|
||||
return;
|
||||
@ -8,8 +8,8 @@
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#ifndef WEBRTC_VIDEO_RTP_STREAM_RECEIVER_H_
|
||||
#define WEBRTC_VIDEO_RTP_STREAM_RECEIVER_H_
|
||||
#ifndef WEBRTC_VIDEO_RTP_VIDEO_STREAM_RECEIVER_H_
|
||||
#define WEBRTC_VIDEO_RTP_VIDEO_STREAM_RECEIVER_H_
|
||||
|
||||
#include <list>
|
||||
#include <map>
|
||||
@ -55,16 +55,16 @@ namespace vcm {
|
||||
class VideoReceiver;
|
||||
} // namespace vcm
|
||||
|
||||
class RtpStreamReceiver : public RtpData,
|
||||
public RecoveredPacketReceiver,
|
||||
public RtpFeedback,
|
||||
public VCMFrameTypeCallback,
|
||||
public VCMPacketRequestCallback,
|
||||
public video_coding::OnReceivedFrameCallback,
|
||||
public video_coding::OnCompleteFrameCallback,
|
||||
public CallStatsObserver {
|
||||
class RtpVideoStreamReceiver : public RtpData,
|
||||
public RecoveredPacketReceiver,
|
||||
public RtpFeedback,
|
||||
public VCMFrameTypeCallback,
|
||||
public VCMPacketRequestCallback,
|
||||
public video_coding::OnReceivedFrameCallback,
|
||||
public video_coding::OnCompleteFrameCallback,
|
||||
public CallStatsObserver {
|
||||
public:
|
||||
RtpStreamReceiver(
|
||||
RtpVideoStreamReceiver(
|
||||
Transport* transport,
|
||||
RtcpRttStats* rtt_stats,
|
||||
PacketRouter* packet_router,
|
||||
@ -75,7 +75,7 @@ class RtpStreamReceiver : public RtpData,
|
||||
KeyFrameRequestSender* keyframe_request_sender,
|
||||
video_coding::OnCompleteFrameCallback* complete_frame_callback,
|
||||
VCMTiming* timing);
|
||||
~RtpStreamReceiver();
|
||||
~RtpVideoStreamReceiver();
|
||||
|
||||
bool AddReceiveCodec(const VideoCodec& video_codec,
|
||||
const std::map<std::string, std::string>& codec_params);
|
||||
@ -203,4 +203,4 @@ class RtpStreamReceiver : public RtpData,
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_VIDEO_RTP_STREAM_RECEIVER_H_
|
||||
#endif // WEBRTC_VIDEO_RTP_VIDEO_STREAM_RECEIVER_H_
|
||||
@ -25,7 +25,7 @@
|
||||
#include "webrtc/system_wrappers/include/clock.h"
|
||||
#include "webrtc/system_wrappers/include/field_trial_default.h"
|
||||
#include "webrtc/test/field_trial.h"
|
||||
#include "webrtc/video/rtp_stream_receiver.h"
|
||||
#include "webrtc/video/rtp_video_stream_receiver.h"
|
||||
|
||||
using testing::_;
|
||||
|
||||
@ -95,15 +95,15 @@ class MockOnCompleteFrameCallback
|
||||
|
||||
} // namespace
|
||||
|
||||
class RtpStreamReceiverTest : public testing::Test {
|
||||
class RtpVideoStreamReceiverTest : public testing::Test {
|
||||
public:
|
||||
RtpStreamReceiverTest()
|
||||
RtpVideoStreamReceiverTest()
|
||||
: config_(CreateConfig()),
|
||||
timing_(Clock::GetRealTimeClock()),
|
||||
process_thread_(ProcessThread::Create("TestThread")) {}
|
||||
|
||||
void SetUp() {
|
||||
rtp_stream_receiver_.reset(new RtpStreamReceiver(
|
||||
rtp_video_stream_receiver_.reset(new RtpVideoStreamReceiver(
|
||||
&mock_transport_, nullptr, &packet_router_, &config_,
|
||||
nullptr, process_thread_.get(), &mock_nack_sender_,
|
||||
&mock_key_frame_request_sender_, &mock_on_complete_frame_callback_,
|
||||
@ -175,10 +175,10 @@ class RtpStreamReceiverTest : public testing::Test {
|
||||
PacketRouter packet_router_;
|
||||
VCMTiming timing_;
|
||||
std::unique_ptr<ProcessThread> process_thread_;
|
||||
std::unique_ptr<RtpStreamReceiver> rtp_stream_receiver_;
|
||||
std::unique_ptr<RtpVideoStreamReceiver> rtp_video_stream_receiver_;
|
||||
};
|
||||
|
||||
TEST_F(RtpStreamReceiverTest, GenericKeyFrame) {
|
||||
TEST_F(RtpVideoStreamReceiverTest, GenericKeyFrame) {
|
||||
WebRtcRTPHeader rtp_header;
|
||||
const std::vector<uint8_t> data({1, 2, 3, 4});
|
||||
memset(&rtp_header, 0, sizeof(rtp_header));
|
||||
@ -190,11 +190,11 @@ TEST_F(RtpStreamReceiverTest, GenericKeyFrame) {
|
||||
mock_on_complete_frame_callback_.AppendExpectedBitstream(data.data(),
|
||||
data.size());
|
||||
EXPECT_CALL(mock_on_complete_frame_callback_, DoOnCompleteFrame(_));
|
||||
rtp_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(),
|
||||
&rtp_header);
|
||||
rtp_video_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(),
|
||||
&rtp_header);
|
||||
}
|
||||
|
||||
TEST_F(RtpStreamReceiverTest, GenericKeyFrameBitstreamError) {
|
||||
TEST_F(RtpVideoStreamReceiverTest, GenericKeyFrameBitstreamError) {
|
||||
WebRtcRTPHeader rtp_header;
|
||||
const std::vector<uint8_t> data({1, 2, 3, 4});
|
||||
memset(&rtp_header, 0, sizeof(rtp_header));
|
||||
@ -208,11 +208,11 @@ TEST_F(RtpStreamReceiverTest, GenericKeyFrameBitstreamError) {
|
||||
expected_bitsteam, sizeof(expected_bitsteam));
|
||||
EXPECT_CALL(mock_on_complete_frame_callback_,
|
||||
DoOnCompleteFrameFailBitstream(_));
|
||||
rtp_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(),
|
||||
&rtp_header);
|
||||
rtp_video_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(),
|
||||
&rtp_header);
|
||||
}
|
||||
|
||||
TEST_F(RtpStreamReceiverTest, InBandSpsPps) {
|
||||
TEST_F(RtpVideoStreamReceiverTest, InBandSpsPps) {
|
||||
std::vector<uint8_t> sps_data;
|
||||
WebRtcRTPHeader sps_packet = GetDefaultPacket();
|
||||
AddSps(&sps_packet, 0, &sps_data);
|
||||
@ -221,8 +221,8 @@ TEST_F(RtpStreamReceiverTest, InBandSpsPps) {
|
||||
kH264StartCode, sizeof(kH264StartCode));
|
||||
mock_on_complete_frame_callback_.AppendExpectedBitstream(sps_data.data(),
|
||||
sps_data.size());
|
||||
rtp_stream_receiver_->OnReceivedPayloadData(sps_data.data(), sps_data.size(),
|
||||
&sps_packet);
|
||||
rtp_video_stream_receiver_->OnReceivedPayloadData(
|
||||
sps_data.data(), sps_data.size(), &sps_packet);
|
||||
|
||||
std::vector<uint8_t> pps_data;
|
||||
WebRtcRTPHeader pps_packet = GetDefaultPacket();
|
||||
@ -232,8 +232,8 @@ TEST_F(RtpStreamReceiverTest, InBandSpsPps) {
|
||||
kH264StartCode, sizeof(kH264StartCode));
|
||||
mock_on_complete_frame_callback_.AppendExpectedBitstream(pps_data.data(),
|
||||
pps_data.size());
|
||||
rtp_stream_receiver_->OnReceivedPayloadData(pps_data.data(), pps_data.size(),
|
||||
&pps_packet);
|
||||
rtp_video_stream_receiver_->OnReceivedPayloadData(
|
||||
pps_data.data(), pps_data.size(), &pps_packet);
|
||||
|
||||
std::vector<uint8_t> idr_data;
|
||||
WebRtcRTPHeader idr_packet = GetDefaultPacket();
|
||||
@ -250,11 +250,11 @@ TEST_F(RtpStreamReceiverTest, InBandSpsPps) {
|
||||
mock_on_complete_frame_callback_.AppendExpectedBitstream(idr_data.data(),
|
||||
idr_data.size());
|
||||
EXPECT_CALL(mock_on_complete_frame_callback_, DoOnCompleteFrame(_));
|
||||
rtp_stream_receiver_->OnReceivedPayloadData(idr_data.data(), idr_data.size(),
|
||||
&idr_packet);
|
||||
rtp_video_stream_receiver_->OnReceivedPayloadData(
|
||||
idr_data.data(), idr_data.size(), &idr_packet);
|
||||
}
|
||||
|
||||
TEST_F(RtpStreamReceiverTest, OutOfBandFmtpSpsPps) {
|
||||
TEST_F(RtpVideoStreamReceiverTest, OutOfBandFmtpSpsPps) {
|
||||
constexpr int kPayloadType = 99;
|
||||
VideoCodec codec;
|
||||
codec.plType = kPayloadType;
|
||||
@ -263,7 +263,7 @@ TEST_F(RtpStreamReceiverTest, OutOfBandFmtpSpsPps) {
|
||||
// .
|
||||
codec_params.insert(
|
||||
{cricket::kH264FmtpSpropParameterSets, "Z0IACpZTBYmI,aMljiA=="});
|
||||
rtp_stream_receiver_->AddReceiveCodec(codec, codec_params);
|
||||
rtp_video_stream_receiver_->AddReceiveCodec(codec, codec_params);
|
||||
const uint8_t binary_sps[] = {0x67, 0x42, 0x00, 0x0a, 0x96,
|
||||
0x53, 0x05, 0x89, 0x88};
|
||||
mock_on_complete_frame_callback_.AppendExpectedBitstream(
|
||||
@ -292,11 +292,11 @@ TEST_F(RtpStreamReceiverTest, OutOfBandFmtpSpsPps) {
|
||||
mock_on_complete_frame_callback_.AppendExpectedBitstream(data.data(),
|
||||
data.size());
|
||||
EXPECT_CALL(mock_on_complete_frame_callback_, DoOnCompleteFrame(_));
|
||||
rtp_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(),
|
||||
&idr_packet);
|
||||
rtp_video_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(),
|
||||
&idr_packet);
|
||||
}
|
||||
|
||||
TEST_F(RtpStreamReceiverTest, PaddingInMediaStream) {
|
||||
TEST_F(RtpVideoStreamReceiverTest, PaddingInMediaStream) {
|
||||
WebRtcRTPHeader header = GetDefaultPacket();
|
||||
std::vector<uint8_t> data;
|
||||
data.insert(data.end(), {1, 2, 3});
|
||||
@ -310,28 +310,28 @@ TEST_F(RtpStreamReceiverTest, PaddingInMediaStream) {
|
||||
data.size());
|
||||
|
||||
EXPECT_CALL(mock_on_complete_frame_callback_, DoOnCompleteFrame(_));
|
||||
rtp_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(),
|
||||
&header);
|
||||
rtp_video_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(),
|
||||
&header);
|
||||
|
||||
header.header.sequenceNumber = 3;
|
||||
rtp_stream_receiver_->OnReceivedPayloadData(nullptr, 0, &header);
|
||||
rtp_video_stream_receiver_->OnReceivedPayloadData(nullptr, 0, &header);
|
||||
|
||||
header.frameType = kVideoFrameDelta;
|
||||
header.header.sequenceNumber = 4;
|
||||
EXPECT_CALL(mock_on_complete_frame_callback_, DoOnCompleteFrame(_));
|
||||
rtp_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(),
|
||||
&header);
|
||||
rtp_video_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(),
|
||||
&header);
|
||||
|
||||
header.header.sequenceNumber = 6;
|
||||
rtp_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(),
|
||||
&header);
|
||||
rtp_video_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(),
|
||||
&header);
|
||||
|
||||
EXPECT_CALL(mock_on_complete_frame_callback_, DoOnCompleteFrame(_));
|
||||
header.header.sequenceNumber = 5;
|
||||
rtp_stream_receiver_->OnReceivedPayloadData(nullptr, 0, &header);
|
||||
rtp_video_stream_receiver_->OnReceivedPayloadData(nullptr, 0, &header);
|
||||
}
|
||||
|
||||
TEST_F(RtpStreamReceiverTest, RequestKeyframeIfFirstFrameIsDelta) {
|
||||
TEST_F(RtpVideoStreamReceiverTest, RequestKeyframeIfFirstFrameIsDelta) {
|
||||
WebRtcRTPHeader rtp_header;
|
||||
const std::vector<uint8_t> data({1, 2, 3, 4});
|
||||
memset(&rtp_header, 0, sizeof(rtp_header));
|
||||
@ -342,8 +342,8 @@ TEST_F(RtpStreamReceiverTest, RequestKeyframeIfFirstFrameIsDelta) {
|
||||
rtp_header.type.Video.codec = kRtpVideoGeneric;
|
||||
|
||||
EXPECT_CALL(mock_key_frame_request_sender_, RequestKeyFrame());
|
||||
rtp_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(),
|
||||
&rtp_header);
|
||||
rtp_video_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(),
|
||||
&rtp_header);
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
||||
@ -184,16 +184,16 @@ VideoReceiveStream::VideoReceiveStream(
|
||||
timing_(new VCMTiming(clock_)),
|
||||
video_receiver_(clock_, nullptr, this, timing_.get(), this, this),
|
||||
stats_proxy_(&config_, clock_),
|
||||
rtp_stream_receiver_(&transport_adapter_,
|
||||
call_stats_->rtcp_rtt_stats(),
|
||||
packet_router,
|
||||
&config_,
|
||||
&stats_proxy_,
|
||||
process_thread_,
|
||||
this, // NackSender
|
||||
this, // KeyFrameRequestSender
|
||||
this, // OnCompleteFrameCallback
|
||||
timing_.get()),
|
||||
rtp_video_stream_receiver_(&transport_adapter_,
|
||||
call_stats_->rtcp_rtt_stats(),
|
||||
packet_router,
|
||||
&config_,
|
||||
&stats_proxy_,
|
||||
process_thread_,
|
||||
this, // NackSender
|
||||
this, // KeyFrameRequestSender
|
||||
this, // OnCompleteFrameCallback
|
||||
timing_.get()),
|
||||
rtp_stream_sync_(this) {
|
||||
LOG(LS_INFO) << "VideoReceiveStream: " << config_.ToString();
|
||||
|
||||
@ -234,16 +234,16 @@ VideoReceiveStream::~VideoReceiveStream() {
|
||||
|
||||
void VideoReceiveStream::SignalNetworkState(NetworkState state) {
|
||||
RTC_DCHECK_RUN_ON(&worker_thread_checker_);
|
||||
rtp_stream_receiver_.SignalNetworkState(state);
|
||||
rtp_video_stream_receiver_.SignalNetworkState(state);
|
||||
}
|
||||
|
||||
|
||||
bool VideoReceiveStream::DeliverRtcp(const uint8_t* packet, size_t length) {
|
||||
return rtp_stream_receiver_.DeliverRtcp(packet, length);
|
||||
return rtp_video_stream_receiver_.DeliverRtcp(packet, length);
|
||||
}
|
||||
|
||||
void VideoReceiveStream::OnRtpPacket(const RtpPacketReceived& packet) {
|
||||
rtp_stream_receiver_.OnRtpPacket(packet);
|
||||
rtp_video_stream_receiver_.OnRtpPacket(packet);
|
||||
}
|
||||
|
||||
void VideoReceiveStream::SetSync(Syncable* audio_syncable) {
|
||||
@ -257,12 +257,13 @@ void VideoReceiveStream::Start() {
|
||||
return;
|
||||
|
||||
bool protected_by_fec = config_.rtp.protected_by_flexfec ||
|
||||
rtp_stream_receiver_.IsUlpfecEnabled();
|
||||
rtp_video_stream_receiver_.IsUlpfecEnabled();
|
||||
|
||||
frame_buffer_->Start();
|
||||
call_stats_->RegisterStatsObserver(&rtp_stream_receiver_);
|
||||
call_stats_->RegisterStatsObserver(&rtp_video_stream_receiver_);
|
||||
|
||||
if (rtp_stream_receiver_.IsRetransmissionsEnabled() && protected_by_fec) {
|
||||
if (rtp_video_stream_receiver_.IsRetransmissionsEnabled() &&
|
||||
protected_by_fec) {
|
||||
frame_buffer_->SetProtectionMode(kProtectionNackFEC);
|
||||
}
|
||||
|
||||
@ -283,34 +284,35 @@ void VideoReceiveStream::Start() {
|
||||
video_receiver_.RegisterExternalDecoder(decoder.decoder,
|
||||
decoder.payload_type);
|
||||
VideoCodec codec = CreateDecoderVideoCodec(decoder);
|
||||
RTC_CHECK(
|
||||
rtp_stream_receiver_.AddReceiveCodec(codec, decoder.codec_params));
|
||||
RTC_CHECK(rtp_video_stream_receiver_.AddReceiveCodec(codec,
|
||||
decoder.codec_params));
|
||||
RTC_CHECK_EQ(VCM_OK, video_receiver_.RegisterReceiveCodec(
|
||||
&codec, num_cpu_cores_, false));
|
||||
}
|
||||
|
||||
video_stream_decoder_.reset(new VideoStreamDecoder(
|
||||
&video_receiver_, &rtp_stream_receiver_, &rtp_stream_receiver_,
|
||||
rtp_stream_receiver_.IsRetransmissionsEnabled(), protected_by_fec,
|
||||
&video_receiver_, &rtp_video_stream_receiver_,
|
||||
&rtp_video_stream_receiver_,
|
||||
rtp_video_stream_receiver_.IsRetransmissionsEnabled(), protected_by_fec,
|
||||
&stats_proxy_, renderer));
|
||||
// Register the channel to receive stats updates.
|
||||
call_stats_->RegisterStatsObserver(video_stream_decoder_.get());
|
||||
// Start the decode thread
|
||||
decode_thread_.Start();
|
||||
decode_thread_.SetPriority(rtc::kHighestPriority);
|
||||
rtp_stream_receiver_.StartReceive();
|
||||
rtp_video_stream_receiver_.StartReceive();
|
||||
}
|
||||
|
||||
void VideoReceiveStream::Stop() {
|
||||
RTC_DCHECK_RUN_ON(&worker_thread_checker_);
|
||||
rtp_stream_receiver_.StopReceive();
|
||||
rtp_video_stream_receiver_.StopReceive();
|
||||
// TriggerDecoderShutdown will release any waiting decoder thread and make it
|
||||
// stop immediately, instead of waiting for a timeout. Needs to be called
|
||||
// before joining the decoder thread thread.
|
||||
video_receiver_.TriggerDecoderShutdown();
|
||||
|
||||
frame_buffer_->Stop();
|
||||
call_stats_->DeregisterStatsObserver(&rtp_stream_receiver_);
|
||||
call_stats_->DeregisterStatsObserver(&rtp_video_stream_receiver_);
|
||||
|
||||
if (decode_thread_.IsRunning()) {
|
||||
decode_thread_.Stop();
|
||||
@ -403,18 +405,18 @@ EncodedImageCallback::Result VideoReceiveStream::OnEncodedImage(
|
||||
|
||||
void VideoReceiveStream::SendNack(
|
||||
const std::vector<uint16_t>& sequence_numbers) {
|
||||
rtp_stream_receiver_.RequestPacketRetransmit(sequence_numbers);
|
||||
rtp_video_stream_receiver_.RequestPacketRetransmit(sequence_numbers);
|
||||
}
|
||||
|
||||
void VideoReceiveStream::RequestKeyFrame() {
|
||||
rtp_stream_receiver_.RequestKeyFrame();
|
||||
rtp_video_stream_receiver_.RequestKeyFrame();
|
||||
}
|
||||
|
||||
void VideoReceiveStream::OnCompleteFrame(
|
||||
std::unique_ptr<video_coding::FrameObject> frame) {
|
||||
int last_continuous_pid = frame_buffer_->InsertFrame(std::move(frame));
|
||||
if (last_continuous_pid != -1)
|
||||
rtp_stream_receiver_.FrameContinuous(last_continuous_pid);
|
||||
rtp_video_stream_receiver_.FrameContinuous(last_continuous_pid);
|
||||
}
|
||||
|
||||
int VideoReceiveStream::id() const {
|
||||
@ -426,14 +428,14 @@ rtc::Optional<Syncable::Info> VideoReceiveStream::GetInfo() const {
|
||||
RTC_DCHECK_RUN_ON(&module_process_thread_checker_);
|
||||
Syncable::Info info;
|
||||
|
||||
RtpReceiver* rtp_receiver = rtp_stream_receiver_.GetRtpReceiver();
|
||||
RtpReceiver* rtp_receiver = rtp_video_stream_receiver_.GetRtpReceiver();
|
||||
RTC_DCHECK(rtp_receiver);
|
||||
if (!rtp_receiver->Timestamp(&info.latest_received_capture_timestamp))
|
||||
return rtc::Optional<Syncable::Info>();
|
||||
if (!rtp_receiver->LastReceivedTimeMs(&info.latest_receive_time_ms))
|
||||
return rtc::Optional<Syncable::Info>();
|
||||
|
||||
RtpRtcp* rtp_rtcp = rtp_stream_receiver_.rtp_rtcp();
|
||||
RtpRtcp* rtp_rtcp = rtp_video_stream_receiver_.rtp_rtcp();
|
||||
RTC_DCHECK(rtp_rtcp);
|
||||
if (rtp_rtcp->RemoteNTP(&info.capture_time_ntp_secs,
|
||||
&info.capture_time_ntp_frac,
|
||||
@ -475,13 +477,13 @@ bool VideoReceiveStream::Decode() {
|
||||
|
||||
if (frame) {
|
||||
if (video_receiver_.Decode(frame.get()) == VCM_OK)
|
||||
rtp_stream_receiver_.FrameDecoded(frame->picture_id);
|
||||
rtp_video_stream_receiver_.FrameDecoded(frame->picture_id);
|
||||
} else {
|
||||
int64_t now_ms = clock_->TimeInMilliseconds();
|
||||
rtc::Optional<int64_t> last_packet_ms =
|
||||
rtp_stream_receiver_.LastReceivedPacketMs();
|
||||
rtp_video_stream_receiver_.LastReceivedPacketMs();
|
||||
rtc::Optional<int64_t> last_keyframe_packet_ms =
|
||||
rtp_stream_receiver_.LastReceivedKeyframePacketMs();
|
||||
rtp_video_stream_receiver_.LastReceivedKeyframePacketMs();
|
||||
|
||||
// To avoid spamming keyframe requests for a stream that is not active we
|
||||
// check if we have received a packet within the last 5 seconds.
|
||||
|
||||
@ -24,8 +24,8 @@
|
||||
#include "webrtc/modules/video_coding/video_coding_impl.h"
|
||||
#include "webrtc/system_wrappers/include/clock.h"
|
||||
#include "webrtc/video/receive_statistics_proxy.h"
|
||||
#include "webrtc/video/rtp_stream_receiver.h"
|
||||
#include "webrtc/video/rtp_streams_synchronizer.h"
|
||||
#include "webrtc/video/rtp_video_stream_receiver.h"
|
||||
#include "webrtc/video/transport_adapter.h"
|
||||
#include "webrtc/video/video_stream_decoder.h"
|
||||
#include "webrtc/video_receive_stream.h"
|
||||
@ -127,7 +127,7 @@ class VideoReceiveStream : public webrtc::VideoReceiveStream,
|
||||
vcm::VideoReceiver video_receiver_;
|
||||
std::unique_ptr<rtc::VideoSinkInterface<VideoFrame>> incoming_video_stream_;
|
||||
ReceiveStatisticsProxy stats_proxy_;
|
||||
RtpStreamReceiver rtp_stream_receiver_;
|
||||
RtpVideoStreamReceiver rtp_video_stream_receiver_;
|
||||
std::unique_ptr<VideoStreamDecoder> video_stream_decoder_;
|
||||
RtpStreamsSynchronizer rtp_stream_sync_;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user