From 113bdcadf37631835e65cd60d5d1f8d0926ba5f6 Mon Sep 17 00:00:00 2001 From: sprang Date: Tue, 11 Oct 2016 03:10:10 -0700 Subject: [PATCH] Make sure VideoReceiveStream can be restarted After calling Start(), doing a Stop() then Start() sequence should bring the stream back to the original state. BUG=webrtc:6501 Review-Url: https://codereview.webrtc.org/2407163002 Cr-Commit-Position: refs/heads/master@{#14597} --- webrtc/video/end_to_end_tests.cc | 16 ++++++++++++++++ webrtc/video/video_receive_stream.cc | 18 +++++++++++------- webrtc/video/video_receive_stream.h | 1 + 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc index ce05dcffdb..53436a3eb3 100644 --- a/webrtc/video/end_to_end_tests.cc +++ b/webrtc/video/end_to_end_tests.cc @@ -161,6 +161,22 @@ TEST_F(EndToEndTest, ReceiverCanBeStoppedTwice) { DestroyStreams(); } +TEST_F(EndToEndTest, ReceiverCanBeStoppedAndRestarted) { + CreateCalls(Call::Config(&event_log_), Call::Config(&event_log_)); + + test::NullTransport transport; + CreateSendConfig(1, 0, &transport); + CreateMatchingReceiveConfigs(&transport); + + CreateVideoStreams(); + + video_receive_streams_[0]->Stop(); + video_receive_streams_[0]->Start(); + video_receive_streams_[0]->Stop(); + + DestroyStreams(); +} + TEST_F(EndToEndTest, RendersSingleDelayedFrame) { static const int kWidth = 320; static const int kHeight = 240; diff --git a/webrtc/video/video_receive_stream.cc b/webrtc/video/video_receive_stream.cc index 7d77751db3..f260b5ed4f 100644 --- a/webrtc/video/video_receive_stream.cc +++ b/webrtc/video/video_receive_stream.cc @@ -188,6 +188,7 @@ VideoReceiveStream::VideoReceiveStream( VieRemb* remb) : transport_adapter_(config.rtcp_send_transport), config_(std::move(config)), + num_cpu_cores_(num_cpu_cores), process_thread_(process_thread), clock_(Clock::GetRealTimeClock()), decode_thread_(DecodeThreadFunction, this, "DecodingThread"), @@ -224,13 +225,6 @@ VideoReceiveStream::VideoReceiveStream( << "Duplicate payload type (" << decoder.payload_type << ") for different decoders."; decoder_payload_types.insert(decoder.payload_type); - video_receiver_.RegisterExternalDecoder(decoder.decoder, - decoder.payload_type); - - VideoCodec codec = CreateDecoderVideoCodec(decoder); - RTC_CHECK(rtp_stream_receiver_.SetReceiveCodec(codec)); - RTC_CHECK_EQ(VCM_OK, video_receiver_.RegisterReceiveCodec( - &codec, num_cpu_cores, false)); } video_receiver_.SetRenderDelay(config.render_delay_ms); @@ -281,6 +275,16 @@ void VideoReceiveStream::Start() { } RTC_DCHECK(renderer != nullptr); + for (const Decoder& decoder : config_.decoders) { + video_receiver_.RegisterExternalDecoder(decoder.decoder, + decoder.payload_type); + + VideoCodec codec = CreateDecoderVideoCodec(decoder); + RTC_CHECK(rtp_stream_receiver_.SetReceiveCodec(codec)); + 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(), diff --git a/webrtc/video/video_receive_stream.h b/webrtc/video/video_receive_stream.h index 416cfe993c..3bb8aea40d 100644 --- a/webrtc/video/video_receive_stream.h +++ b/webrtc/video/video_receive_stream.h @@ -98,6 +98,7 @@ class VideoReceiveStream : public webrtc::VideoReceiveStream, TransportAdapter transport_adapter_; const VideoReceiveStream::Config config_; + const int num_cpu_cores_; ProcessThread* const process_thread_; Clock* const clock_;