Define Stream base classes
BUG=webrtc:4690
Defined classes Stream, SendStream and ReceiveStream. Inherited existing stream classes from either SendStream or ReceiveStream.
This is a step towards having a Transport associated with streams instead of a Call. It will allow a lot of code in the Call to be media type agnostic.
R=henrika@webrtc.org, pbos@webrtc.org, stefan@webrtc.org
Review URL: https://codereview.webrtc.org/1226123005 .
Cr-Commit-Position: refs/heads/master@{#9591}
diff --git a/talk/media/webrtc/fakewebrtccall.cc b/talk/media/webrtc/fakewebrtccall.cc
index cfb6bd1..03f7763 100644
--- a/talk/media/webrtc/fakewebrtccall.cc
+++ b/talk/media/webrtc/fakewebrtccall.cc
@@ -195,7 +195,7 @@
FakeCall::FakeCall(const webrtc::Call::Config& config)
: config_(config),
- network_state_(kNetworkUp),
+ network_state_(webrtc::kNetworkUp),
num_created_send_streams_(0),
num_created_receive_streams_(0) {
}
@@ -231,7 +231,7 @@
return nullptr;
}
-webrtc::Call::NetworkState FakeCall::GetNetworkState() const {
+webrtc::NetworkState FakeCall::GetNetworkState() const {
return network_state_;
}
@@ -357,7 +357,7 @@
config_.bitrate_config = bitrate_config;
}
-void FakeCall::SignalNetworkState(webrtc::Call::NetworkState state) {
+void FakeCall::SignalNetworkState(webrtc::NetworkState state) {
network_state_ = state;
}
} // namespace cricket
diff --git a/talk/media/webrtc/fakewebrtccall.h b/talk/media/webrtc/fakewebrtccall.h
index c500416..dd7772d 100644
--- a/talk/media/webrtc/fakewebrtccall.h
+++ b/talk/media/webrtc/fakewebrtccall.h
@@ -42,6 +42,7 @@
explicit FakeAudioReceiveStream(
const webrtc::AudioReceiveStream::Config& config);
+ // webrtc::AudioReceiveStream implementation.
webrtc::AudioReceiveStream::Stats GetStats() const override;
const webrtc::AudioReceiveStream::Config& GetConfig() const;
@@ -50,6 +51,17 @@
void IncrementReceivedPackets();
private:
+ // webrtc::ReceiveStream implementation.
+ void Start() override {}
+ void Stop() override {}
+ void SignalNetworkState(webrtc::NetworkState state) override {}
+ bool DeliverRtcp(const uint8_t* packet, size_t length) override {
+ return true;
+ }
+ bool DeliverRtp(const uint8_t* packet, size_t length) override {
+ return true;
+ }
+
webrtc::AudioReceiveStream::Config config_;
int received_packets_;
};
@@ -74,15 +86,20 @@
private:
void IncomingCapturedFrame(const webrtc::VideoFrame& frame) override;
- webrtc::VideoSendStream::Stats GetStats() override;
- bool ReconfigureVideoEncoder(
- const webrtc::VideoEncoderConfig& config) override;
-
- webrtc::VideoCaptureInput* Input() override;
-
+ // webrtc::SendStream implementation.
void Start() override;
void Stop() override;
+ void SignalNetworkState(webrtc::NetworkState state) override {}
+ bool DeliverRtcp(const uint8_t* packet, size_t length) override {
+ return true;
+ }
+
+ // webrtc::VideoSendStream implementation.
+ webrtc::VideoSendStream::Stats GetStats() override;
+ bool ReconfigureVideoEncoder(
+ const webrtc::VideoEncoderConfig& config) override;
+ webrtc::VideoCaptureInput* Input() override;
bool sending_;
webrtc::VideoSendStream::Config config_;
@@ -111,10 +128,19 @@
void SetStats(const webrtc::VideoReceiveStream::Stats& stats);
private:
- webrtc::VideoReceiveStream::Stats GetStats() const override;
-
+ // webrtc::ReceiveStream implementation.
void Start() override;
void Stop() override;
+ void SignalNetworkState(webrtc::NetworkState state) override {}
+ bool DeliverRtcp(const uint8_t* packet, size_t length) override {
+ return true;
+ }
+ bool DeliverRtp(const uint8_t* packet, size_t length) override {
+ return true;
+ }
+
+ // webrtc::VideoReceiveStream implementation.
+ webrtc::VideoReceiveStream::Stats GetStats() const override;
webrtc::VideoReceiveStream::Config config_;
bool receiving_;
@@ -124,7 +150,7 @@
class FakeCall : public webrtc::Call, public webrtc::PacketReceiver {
public:
explicit FakeCall(const webrtc::Call::Config& config);
- ~FakeCall();
+ ~FakeCall() override;
webrtc::Call::Config GetConfig() const;
const std::vector<FakeVideoSendStream*>& GetVideoSendStreams();
@@ -133,7 +159,7 @@
const std::vector<FakeAudioReceiveStream*>& GetAudioReceiveStreams();
const FakeAudioReceiveStream* GetAudioReceiveStream(uint32_t ssrc);
- webrtc::Call::NetworkState GetNetworkState() const;
+ webrtc::NetworkState GetNetworkState() const;
int GetNumCreatedSendStreams() const;
int GetNumCreatedReceiveStreams() const;
void SetStats(const webrtc::Call::Stats& stats);
@@ -166,10 +192,10 @@
void SetBitrateConfig(
const webrtc::Call::Config::BitrateConfig& bitrate_config) override;
- void SignalNetworkState(webrtc::Call::NetworkState state) override;
+ void SignalNetworkState(webrtc::NetworkState state) override;
webrtc::Call::Config config_;
- webrtc::Call::NetworkState network_state_;
+ webrtc::NetworkState network_state_;
webrtc::Call::Stats stats_;
std::vector<FakeVideoSendStream*> video_send_streams_;
std::vector<FakeVideoReceiveStream*> video_receive_streams_;
diff --git a/talk/media/webrtc/webrtcvideoengine2.cc b/talk/media/webrtc/webrtcvideoengine2.cc
index 657475b..9199795 100644
--- a/talk/media/webrtc/webrtcvideoengine2.cc
+++ b/talk/media/webrtc/webrtcvideoengine2.cc
@@ -1421,8 +1421,7 @@
void WebRtcVideoChannel2::OnReadyToSend(bool ready) {
LOG(LS_VERBOSE) << "OnReadyToSend: " << (ready ? "Ready." : "Not ready.");
- call_->SignalNetworkState(ready ? webrtc::Call::kNetworkUp
- : webrtc::Call::kNetworkDown);
+ call_->SignalNetworkState(ready ? webrtc::kNetworkUp : webrtc::kNetworkDown);
}
bool WebRtcVideoChannel2::MuteStream(uint32 ssrc, bool mute) {
diff --git a/talk/media/webrtc/webrtcvideoengine2_unittest.cc b/talk/media/webrtc/webrtcvideoengine2_unittest.cc
index f3d3a54..745a0c4 100644
--- a/talk/media/webrtc/webrtcvideoengine2_unittest.cc
+++ b/talk/media/webrtc/webrtcvideoengine2_unittest.cc
@@ -2170,13 +2170,13 @@
}
TEST_F(WebRtcVideoChannel2Test, OnReadyToSendSignalsNetworkState) {
- EXPECT_EQ(webrtc::Call::kNetworkUp, fake_call_->GetNetworkState());
+ EXPECT_EQ(webrtc::kNetworkUp, fake_call_->GetNetworkState());
channel_->OnReadyToSend(false);
- EXPECT_EQ(webrtc::Call::kNetworkDown, fake_call_->GetNetworkState());
+ EXPECT_EQ(webrtc::kNetworkDown, fake_call_->GetNetworkState());
channel_->OnReadyToSend(true);
- EXPECT_EQ(webrtc::Call::kNetworkUp, fake_call_->GetNetworkState());
+ EXPECT_EQ(webrtc::kNetworkUp, fake_call_->GetNetworkState());
}
TEST_F(WebRtcVideoChannel2Test, GetStatsReportsSentCodecName) {
diff --git a/webrtc/audio_receive_stream.h b/webrtc/audio_receive_stream.h
index 5e20078..44e232c 100644
--- a/webrtc/audio_receive_stream.h
+++ b/webrtc/audio_receive_stream.h
@@ -16,13 +16,14 @@
#include <vector>
#include "webrtc/config.h"
+#include "webrtc/stream.h"
#include "webrtc/typedefs.h"
namespace webrtc {
class AudioDecoder;
-class AudioReceiveStream {
+class AudioReceiveStream : public ReceiveStream {
public:
struct Stats {};
@@ -61,9 +62,6 @@
};
virtual Stats GetStats() const = 0;
-
- protected:
- virtual ~AudioReceiveStream() {}
};
} // namespace webrtc
diff --git a/webrtc/audio_send_stream.h b/webrtc/audio_send_stream.h
index 4ad15d6..9ac78da 100644
--- a/webrtc/audio_send_stream.h
+++ b/webrtc/audio_send_stream.h
@@ -17,11 +17,12 @@
#include "webrtc/base/scoped_ptr.h"
#include "webrtc/config.h"
#include "webrtc/modules/audio_coding/codecs/audio_encoder.h"
+#include "webrtc/stream.h"
#include "webrtc/typedefs.h"
namespace webrtc {
-class AudioSendStream {
+class AudioSendStream : public SendStream {
public:
struct Stats {};
@@ -45,9 +46,6 @@
};
virtual Stats GetStats() const = 0;
-
- protected:
- virtual ~AudioSendStream() {}
};
} // namespace webrtc
diff --git a/webrtc/call.h b/webrtc/call.h
index d1a45c8..b94029d 100644
--- a/webrtc/call.h
+++ b/webrtc/call.h
@@ -68,10 +68,6 @@
// etc.
class Call {
public:
- enum NetworkState {
- kNetworkUp,
- kNetworkDown,
- };
struct Config {
Config() = delete;
explicit Config(newapi::Transport* send_transport)
@@ -153,6 +149,7 @@
virtual ~Call() {}
};
+
} // namespace webrtc
#endif // WEBRTC_CALL_H_
diff --git a/webrtc/stream.h b/webrtc/stream.h
new file mode 100644
index 0000000..fd30571
--- /dev/null
+++ b/webrtc/stream.h
@@ -0,0 +1,54 @@
+/*
+ * 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_STREAM_H_
+#define WEBRTC_STREAM_H_
+
+#include "webrtc/common_types.h"
+
+namespace webrtc {
+
+enum NetworkState {
+ kNetworkUp,
+ kNetworkDown,
+};
+
+// Common base class for streams.
+class Stream {
+ public:
+ // Starts stream activity.
+ // When a stream is active, it can receive, process and deliver packets.
+ virtual void Start() = 0;
+ // Stops stream activity.
+ // When a stream is stopped, it can't receive, process or deliver packets.
+ virtual void Stop() = 0;
+ // Called to notify that network state has changed, so that the stream can
+ // respond, e.g. by pausing or resuming activity.
+ virtual void SignalNetworkState(NetworkState state) = 0;
+ // Called when a RTCP packet is received.
+ virtual bool DeliverRtcp(const uint8_t* packet, size_t length) = 0;
+
+ protected:
+ virtual ~Stream() {}
+};
+
+// Common base class for receive streams.
+class ReceiveStream : public Stream {
+ public:
+ // Called when a RTP packet is received.
+ virtual bool DeliverRtp(const uint8_t* packet, size_t length) = 0;
+};
+
+// Common base class for send streams.
+// A tag class that denotes send stream type.
+class SendStream : public Stream {};
+
+} // namespace webrtc
+
+#endif // WEBRTC_STREAM_H_
diff --git a/webrtc/video/audio_receive_stream.cc b/webrtc/video/audio_receive_stream.cc
index ef0eb78..88fd431 100644
--- a/webrtc/video/audio_receive_stream.cc
+++ b/webrtc/video/audio_receive_stream.cc
@@ -71,6 +71,15 @@
return webrtc::AudioReceiveStream::Stats();
}
+void AudioReceiveStream::Start() {
+}
+
+void AudioReceiveStream::Stop() {
+}
+
+void AudioReceiveStream::SignalNetworkState(NetworkState state) {
+}
+
bool AudioReceiveStream::DeliverRtcp(const uint8_t* packet, size_t length) {
return false;
}
diff --git a/webrtc/video/audio_receive_stream.h b/webrtc/video/audio_receive_stream.h
index 9935117..08d929a 100644
--- a/webrtc/video/audio_receive_stream.h
+++ b/webrtc/video/audio_receive_stream.h
@@ -26,10 +26,15 @@
const webrtc::AudioReceiveStream::Config& config);
~AudioReceiveStream() override {}
- webrtc::AudioReceiveStream::Stats GetStats() const override;
+ // webrtc::ReceiveStream implementation.
+ void Start() override;
+ void Stop() override;
+ void SignalNetworkState(NetworkState state) override;
+ bool DeliverRtcp(const uint8_t* packet, size_t length) override;
+ bool DeliverRtp(const uint8_t* packet, size_t length) override;
- bool DeliverRtcp(const uint8_t* packet, size_t length);
- bool DeliverRtp(const uint8_t* packet, size_t length);
+ // webrtc::AudioReceiveStream implementation.
+ webrtc::AudioReceiveStream::Stats GetStats() const override;
const webrtc::AudioReceiveStream::Config& config() const {
return config_;
diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc
index 82fbe3a..ab4dfaf 100644
--- a/webrtc/video/end_to_end_tests.cc
+++ b/webrtc/video/end_to_end_tests.cc
@@ -2509,7 +2509,7 @@
FakeEncoder(Clock::GetRealTimeClock()),
encoded_frames_(EventWrapper::Create()),
packet_event_(EventWrapper::Create()),
- sender_state_(Call::kNetworkUp),
+ sender_state_(kNetworkUp),
sender_rtp_(0),
sender_rtcp_(0),
receiver_rtcp_(0),
@@ -2559,17 +2559,17 @@
WaitForPacketsOrSilence(false, false);
// Sender-side network down.
- sender_call_->SignalNetworkState(Call::kNetworkDown);
+ sender_call_->SignalNetworkState(kNetworkDown);
{
rtc::CritScope lock(&test_crit_);
// After network goes down we shouldn't be encoding more frames.
- sender_state_ = Call::kNetworkDown;
+ sender_state_ = kNetworkDown;
}
// Wait for receiver-packets and no sender packets.
WaitForPacketsOrSilence(true, false);
// Receiver-side network down.
- receiver_call_->SignalNetworkState(Call::kNetworkDown);
+ receiver_call_->SignalNetworkState(kNetworkDown);
WaitForPacketsOrSilence(true, true);
// Network back up again for both.
@@ -2577,10 +2577,10 @@
rtc::CritScope lock(&test_crit_);
// It's OK to encode frames again, as we're about to bring up the
// network.
- sender_state_ = Call::kNetworkUp;
+ sender_state_ = kNetworkUp;
}
- sender_call_->SignalNetworkState(Call::kNetworkUp);
- receiver_call_->SignalNetworkState(Call::kNetworkUp);
+ sender_call_->SignalNetworkState(kNetworkUp);
+ receiver_call_->SignalNetworkState(kNetworkUp);
WaitForPacketsOrSilence(false, false);
}
@@ -2589,7 +2589,7 @@
const std::vector<VideoFrameType>* frame_types) override {
{
rtc::CritScope lock(&test_crit_);
- if (sender_state_ == Call::kNetworkDown) {
+ if (sender_state_ == kNetworkDown) {
++down_frames_;
EXPECT_LE(down_frames_, 1)
<< "Encoding more than one frame while network is down.";
@@ -2655,7 +2655,7 @@
const rtc::scoped_ptr<EventWrapper> packet_event_;
Call* sender_call_;
Call* receiver_call_;
- Call::NetworkState sender_state_ GUARDED_BY(test_crit_);
+ NetworkState sender_state_ GUARDED_BY(test_crit_);
int sender_rtp_ GUARDED_BY(test_crit_);
int sender_rtcp_ GUARDED_BY(test_crit_);
int receiver_rtcp_ GUARDED_BY(test_crit_);
@@ -2720,7 +2720,7 @@
UnusedTransport transport;
CreateSenderCall(Call::Config(&transport));
- sender_call_->SignalNetworkState(Call::kNetworkDown);
+ sender_call_->SignalNetworkState(kNetworkDown);
CreateSendConfig(1);
UnusedEncoder unused_encoder;
@@ -2742,7 +2742,7 @@
CreateReceiverCall(Call::Config(&transport));
sender_transport.SetReceiver(receiver_call_->Receiver());
- receiver_call_->SignalNetworkState(Call::kNetworkDown);
+ receiver_call_->SignalNetworkState(kNetworkDown);
CreateSendConfig(1);
CreateMatchingReceiveConfigs();
diff --git a/webrtc/video/video_receive_stream.cc b/webrtc/video/video_receive_stream.cc
index d7874fa..6d6619a 100644
--- a/webrtc/video/video_receive_stream.cc
+++ b/webrtc/video/video_receive_stream.cc
@@ -323,10 +323,10 @@
return 0;
}
-void VideoReceiveStream::SignalNetworkState(Call::NetworkState state) {
- if (state == Call::kNetworkUp)
+void VideoReceiveStream::SignalNetworkState(NetworkState state) {
+ if (state == kNetworkUp)
SetRtcpMode(config_.rtp.rtcp_mode);
- if (state == Call::kNetworkDown)
+ if (state == kNetworkDown)
vie_channel_->SetRTCPMode(kRtcpOff);
}
diff --git a/webrtc/video/video_receive_stream.h b/webrtc/video/video_receive_stream.h
index af341a9..717622d 100644
--- a/webrtc/video/video_receive_stream.h
+++ b/webrtc/video/video_receive_stream.h
@@ -44,11 +44,17 @@
const VideoReceiveStream::Config& config,
newapi::Transport* transport,
webrtc::VoiceEngine* voice_engine);
- virtual ~VideoReceiveStream();
+ ~VideoReceiveStream() override;
+ // webrtc::ReceiveStream implementation.
void Start() override;
void Stop() override;
- Stats GetStats() const override;
+ void SignalNetworkState(NetworkState state) override;
+ bool DeliverRtcp(const uint8_t* packet, size_t length) override;
+ bool DeliverRtp(const uint8_t* packet, size_t length) override;
+
+ // webrtc::VideoReceiveStream implementation.
+ webrtc::VideoReceiveStream::Stats GetStats() const override;
// Overrides I420FrameCallback.
void FrameCallback(VideoFrame* video_frame) override;
@@ -59,11 +65,6 @@
const Config& config() const { return config_; }
- void SignalNetworkState(Call::NetworkState state);
-
- bool DeliverRtcp(const uint8_t* packet, size_t length);
- bool DeliverRtp(const uint8_t* packet, size_t length);
-
void SetSyncChannel(VoiceEngine* voice_engine, int audio_channel_id);
private:
diff --git a/webrtc/video/video_send_stream.cc b/webrtc/video/video_send_stream.cc
index 0b59c8b..c0d7349 100644
--- a/webrtc/video/video_send_stream.cc
+++ b/webrtc/video/video_send_stream.cc
@@ -436,14 +436,14 @@
return rtp_states;
}
-void VideoSendStream::SignalNetworkState(Call::NetworkState state) {
+void VideoSendStream::SignalNetworkState(NetworkState state) {
// When network goes up, enable RTCP status before setting transmission state.
// When it goes down, disable RTCP afterwards. This ensures that any packets
// sent due to the network state changed will not be dropped.
- if (state == Call::kNetworkUp)
+ if (state == kNetworkUp)
vie_channel_->SetRTCPMode(kRtcpCompound);
- vie_encoder_->SetNetworkTransmissionState(state == Call::kNetworkUp);
- if (state == Call::kNetworkDown)
+ vie_encoder_->SetNetworkTransmissionState(state == kNetworkUp);
+ if (state == kNetworkDown)
vie_channel_->SetRTCPMode(kRtcpOff);
}
diff --git a/webrtc/video/video_send_stream.h b/webrtc/video/video_send_stream.h
index 84537dd..b660dd0 100644
--- a/webrtc/video/video_send_stream.h
+++ b/webrtc/video/video_send_stream.h
@@ -47,24 +47,22 @@
const VideoEncoderConfig& encoder_config,
const std::map<uint32_t, RtpState>& suspended_ssrcs);
- virtual ~VideoSendStream();
+ ~VideoSendStream() override;
- VideoCaptureInput* Input() override;
-
+ // webrtc::SendStream implementation.
void Start() override;
void Stop() override;
+ void SignalNetworkState(NetworkState state) override;
+ bool DeliverRtcp(const uint8_t* packet, size_t length) override;
+ // webrtc::VideoSendStream implementation.
+ VideoCaptureInput* Input() override;
bool ReconfigureVideoEncoder(const VideoEncoderConfig& config) override;
-
Stats GetStats() override;
- bool DeliverRtcp(const uint8_t* packet, size_t length);
-
typedef std::map<uint32_t, RtpState> RtpStateMap;
RtpStateMap GetRtpStates() const;
- void SignalNetworkState(Call::NetworkState state);
-
int64_t GetRtt() const;
private:
diff --git a/webrtc/video_receive_stream.h b/webrtc/video_receive_stream.h
index 1103381..9525336 100644
--- a/webrtc/video_receive_stream.h
+++ b/webrtc/video_receive_stream.h
@@ -18,6 +18,7 @@
#include "webrtc/common_types.h"
#include "webrtc/config.h"
#include "webrtc/frame_callback.h"
+#include "webrtc/stream.h"
#include "webrtc/transport.h"
#include "webrtc/video_renderer.h"
@@ -31,7 +32,7 @@
class VideoDecoder;
-class VideoReceiveStream {
+class VideoReceiveStream : public ReceiveStream {
public:
// TODO(mflodman) Move all these settings to VideoDecoder and move the
// declaration to common_types.h.
@@ -165,14 +166,8 @@
int target_delay_ms = 0;
};
- virtual void Start() = 0;
- virtual void Stop() = 0;
-
// TODO(pbos): Add info on currently-received codec to Stats.
virtual Stats GetStats() const = 0;
-
- protected:
- virtual ~VideoReceiveStream() {}
};
} // namespace webrtc
diff --git a/webrtc/video_send_stream.h b/webrtc/video_send_stream.h
index 69df41c..540f5be 100644
--- a/webrtc/video_send_stream.h
+++ b/webrtc/video_send_stream.h
@@ -17,6 +17,7 @@
#include "webrtc/common_types.h"
#include "webrtc/config.h"
#include "webrtc/frame_callback.h"
+#include "webrtc/stream.h"
#include "webrtc/video_renderer.h"
namespace webrtc {
@@ -35,7 +36,7 @@
virtual ~VideoCaptureInput() {}
};
-class VideoSendStream {
+class VideoSendStream : public SendStream {
public:
struct StreamStats {
FrameCounts frame_counts;
@@ -140,18 +141,12 @@
// VideoSendStream is valid.
virtual VideoCaptureInput* Input() = 0;
- virtual void Start() = 0;
- virtual void Stop() = 0;
-
// Set which streams to send. Must have at least as many SSRCs as configured
// in the config. Encoder settings are passed on to the encoder instance along
// with the VideoStream settings.
virtual bool ReconfigureVideoEncoder(const VideoEncoderConfig& config) = 0;
virtual Stats GetStats() = 0;
-
- protected:
- virtual ~VideoSendStream() {}
};
} // namespace webrtc
diff --git a/webrtc/webrtc.gyp b/webrtc/webrtc.gyp
index b1574d2..1f0412e 100644
--- a/webrtc/webrtc.gyp
+++ b/webrtc/webrtc.gyp
@@ -61,15 +61,16 @@
],
},
{
- # TODO(pbos): This is intended to contain audio parts as well as soon as
- # VoiceEngine moves to the same new API format.
'target_name': 'webrtc',
'type': 'static_library',
'sources': [
+ 'audio_receive_stream.h',
+ 'audio_send_stream.h',
'call.h',
'config.h',
'experiments.h',
'frame_callback.h',
+ 'stream.h',
'transport.h',
'video_receive_stream.h',
'video_renderer.h',