[InsertableStreams] Set video frame transformer if RTP stream already started.

Test in https://chromium-review.googlesource.com/c/chromium/src/+/2127927

Bug: chromium:1065836
Change-Id: Idf3f41285e23ac829f69f1bc95b1def3a73af8d6
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/172400
Reviewed-by: Magnus Flodman <mflodman@webrtc.org>
Reviewed-by: Rasmus Brandt <brandtr@webrtc.org>
Reviewed-by: Marina Ciocea <marinaciocea@webrtc.org>
Commit-Queue: Guido Urdaneta <guidou@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30948}
This commit is contained in:
Guido Urdaneta
2020-03-30 23:02:14 +02:00
committed by Commit Bot
parent 4b425aeef9
commit e1aa22f892
7 changed files with 40 additions and 0 deletions

View File

@ -300,6 +300,11 @@ class VideoReceiveStream {
virtual void SetFrameDecryptor( virtual void SetFrameDecryptor(
rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor) = 0; rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor) = 0;
// Allows a frame transformer to be attached to a VideoReceiveStream after
// creation without resetting the decoder state.
virtual void SetDepacketizerToDecoderFrameTransformer(
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) = 0;
// Sets and returns recording state. The old state is moved out // Sets and returns recording state. The old state is moved out
// of the video receive stream and returned to the caller, and |state| // of the video receive stream and returned to the caller, and |state|
// is moved in. If the state's callback is set, it will be called with // is moved in. If the state's callback is set, it will be called with

View File

@ -229,6 +229,10 @@ class FakeVideoReceiveStream final : public webrtc::VideoReceiveStream {
void SetFrameDecryptor(rtc::scoped_refptr<webrtc::FrameDecryptorInterface> void SetFrameDecryptor(rtc::scoped_refptr<webrtc::FrameDecryptorInterface>
frame_decryptor) override {} frame_decryptor) override {}
void SetDepacketizerToDecoderFrameTransformer(
rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer)
override {}
RecordingState SetAndGetRecordingState(RecordingState state, RecordingState SetAndGetRecordingState(RecordingState state,
bool generate_key_frame) override { bool generate_key_frame) override {
return RecordingState(); return RecordingState();

View File

@ -2565,6 +2565,8 @@ void WebRtcVideoChannel::WebRtcVideoSendStream::
frame_transformer) { frame_transformer) {
RTC_DCHECK_RUN_ON(&thread_checker_); RTC_DCHECK_RUN_ON(&thread_checker_);
parameters_.config.frame_transformer = std::move(frame_transformer); parameters_.config.frame_transformer = std::move(frame_transformer);
if (stream_)
RecreateWebRtcStream();
} }
void WebRtcVideoChannel::WebRtcVideoSendStream::RecreateWebRtcStream() { void WebRtcVideoChannel::WebRtcVideoSendStream::RecreateWebRtcStream() {
@ -3041,6 +3043,8 @@ void WebRtcVideoChannel::WebRtcVideoReceiveStream::
rtc::scoped_refptr<webrtc::FrameTransformerInterface> rtc::scoped_refptr<webrtc::FrameTransformerInterface>
frame_transformer) { frame_transformer) {
config_.frame_transformer = frame_transformer; config_.frame_transformer = frame_transformer;
if (stream_)
stream_->SetDepacketizerToDecoderFrameTransformer(frame_transformer);
} }
WebRtcVideoChannel::VideoCodecSettings::VideoCodecSettings() WebRtcVideoChannel::VideoCodecSettings::VideoCodecSettings()

View File

@ -881,6 +881,20 @@ void RtpVideoStreamReceiver::SetFrameDecryptor(
buffered_frame_decryptor_->SetFrameDecryptor(std::move(frame_decryptor)); buffered_frame_decryptor_->SetFrameDecryptor(std::move(frame_decryptor));
} }
void RtpVideoStreamReceiver::SetDepacketizerToDecoderFrameTransformer(
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) {
RTC_DCHECK_RUN_ON(&network_tc_);
if (!frame_transformer_delegate_) {
frame_transformer_delegate_ = new rtc::RefCountedObject<
RtpVideoStreamReceiverFrameTransformerDelegate>(
this, std::move(frame_transformer), rtc::Thread::Current());
frame_transformer_delegate_->Init();
} else {
RTC_LOG(LS_ERROR)
<< "Attempting to replace an existing frame transformer in a receiver";
}
}
void RtpVideoStreamReceiver::UpdateRtt(int64_t max_rtt_ms) { void RtpVideoStreamReceiver::UpdateRtt(int64_t max_rtt_ms) {
if (nack_module_) if (nack_module_)
nack_module_->UpdateRtt(max_rtt_ms); nack_module_->UpdateRtt(max_rtt_ms);

View File

@ -164,6 +164,11 @@ class RtpVideoStreamReceiver : public LossNotificationSender,
void SetFrameDecryptor( void SetFrameDecryptor(
rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor); rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor);
// Sets a frame transformer after a stream has started, if no transformer
// has previously been set. Does not reset the decoder state.
void SetDepacketizerToDecoderFrameTransformer(
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer);
// Called by VideoReceiveStream when stats are updated. // Called by VideoReceiveStream when stats are updated.
void UpdateRtt(int64_t max_rtt_ms); void UpdateRtt(int64_t max_rtt_ms);

View File

@ -535,6 +535,12 @@ void VideoReceiveStream::SetFrameDecryptor(
rtp_video_stream_receiver_.SetFrameDecryptor(std::move(frame_decryptor)); rtp_video_stream_receiver_.SetFrameDecryptor(std::move(frame_decryptor));
} }
void VideoReceiveStream::SetDepacketizerToDecoderFrameTransformer(
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) {
rtp_video_stream_receiver_.SetDepacketizerToDecoderFrameTransformer(
std::move(frame_transformer));
}
void VideoReceiveStream::SendNack(const std::vector<uint16_t>& sequence_numbers, void VideoReceiveStream::SendNack(const std::vector<uint16_t>& sequence_numbers,
bool buffering_allowed) { bool buffering_allowed) {
RTC_DCHECK(buffering_allowed); RTC_DCHECK(buffering_allowed);

View File

@ -99,6 +99,8 @@ class VideoReceiveStream : public webrtc::VideoReceiveStream,
void SetFrameDecryptor( void SetFrameDecryptor(
rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor) override; rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor) override;
void SetDepacketizerToDecoderFrameTransformer(
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) override;
// Implements rtc::VideoSinkInterface<VideoFrame>. // Implements rtc::VideoSinkInterface<VideoFrame>.
void OnFrame(const VideoFrame& video_frame) override; void OnFrame(const VideoFrame& video_frame) override;