[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(
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
// 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

View File

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

View File

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

View File

@ -881,6 +881,20 @@ void RtpVideoStreamReceiver::SetFrameDecryptor(
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) {
if (nack_module_)
nack_module_->UpdateRtt(max_rtt_ms);

View File

@ -164,6 +164,11 @@ class RtpVideoStreamReceiver : public LossNotificationSender,
void SetFrameDecryptor(
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.
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));
}
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,
bool buffering_allowed) {
RTC_DCHECK(buffering_allowed);

View File

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