/* * Copyright 2019 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.
*/
RtpParameters VideoRtpReceiver::GetParameters() const {
RTC_DCHECK_RUN_ON(worker_thread_); if (!media_channel_) return RtpParameters(); auto current_ssrc = ssrc(); return current_ssrc.has_value()
? media_channel_->GetRtpReceiverParameters(current_ssrc.value())
: media_channel_->GetDefaultRtpReceiveParameters();
}
void VideoRtpReceiver::SetFrameDecryptor(
rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor) {
RTC_DCHECK_RUN_ON(worker_thread_);
frame_decryptor_ = std::move(frame_decryptor); // Special Case: Set the frame decryptor to any value on any existing channel. if (media_channel_ && signaled_ssrc_) {
media_channel_->SetFrameDecryptor(*signaled_ssrc_, frame_decryptor_);
}
}
void VideoRtpReceiver::RestartMediaChannel(std::optional<uint32_t> ssrc) {
RTC_DCHECK_RUN_ON(&signaling_thread_checker_);
MediaSourceInterface::SourceState state = source_->state(); // TODO(tommi): Can we restart the media channel without blocking?
worker_thread_->BlockingCall([&] {
RTC_DCHECK_RUN_ON(worker_thread_);
RestartMediaChannel_w(std::move(ssrc), state);
});
source_->SetState(MediaSourceInterface::kLive);
}
void VideoRtpReceiver::SetStreams( const std::vector<rtc::scoped_refptr<MediaStreamInterface>>& streams) {
RTC_DCHECK_RUN_ON(&signaling_thread_checker_); // Remove remote track from any streams that are going away. for (constauto& existing_stream : streams_) { bool removed = true; for (constauto& stream : streams) { if (existing_stream->id() == stream->id()) {
RTC_DCHECK_EQ(existing_stream.get(), stream.get());
removed = false; break;
}
} if (removed) {
existing_stream->RemoveTrack(video_track());
}
} // Add remote track to any streams that are new. for (constauto& stream : streams) { bool added = true; for (constauto& existing_stream : streams_) { if (stream->id() == existing_stream->id()) {
RTC_DCHECK_EQ(stream.get(), existing_stream.get());
added = false; break;
}
} if (added) {
stream->AddTrack(video_track());
}
}
streams_ = streams;
}
void VideoRtpReceiver::SetObserver(RtpReceiverObserverInterface* observer) {
RTC_DCHECK_RUN_ON(&signaling_thread_checker_);
observer_ = observer; // Deliver any notifications the observer may have missed by being set late. if (received_first_packet_ && observer_) {
observer_->OnFirstPacketReceived(media_type());
}
}
bool encoded_sink_enabled = saved_encoded_sink_enabled_; if (encoded_sink_enabled && media_channel_) { // Turn off the old sink, if any.
SetEncodedSinkEnabled(false);
}
if (media_channel_) { if (saved_generate_keyframe_) { // TODO(bugs.webrtc.org/8694): Stop using 0 to mean unsignalled SSRC
media_channel_->RequestRecvKeyFrame(signaled_ssrc_.value_or(0));
saved_generate_keyframe_ = false;
} if (encoded_sink_enabled) {
SetEncodedSinkEnabled(true);
} if (frame_transformer_) {
media_channel_->SetDepacketizerToDecoderFrameTransformer(
signaled_ssrc_.value_or(0), frame_transformer_);
}
}
void VideoRtpReceiver::OnGenerateKeyFrame() {
RTC_DCHECK_RUN_ON(worker_thread_); if (!media_channel_) {
RTC_LOG(LS_ERROR)
<< "VideoRtpReceiver::OnGenerateKeyFrame: No video channel exists."; return;
} // TODO(bugs.webrtc.org/8694): Stop using 0 to mean unsignalled SSRC
media_channel_->RequestRecvKeyFrame(signaled_ssrc_.value_or(0)); // We need to remember to request generation of a new key frame if the media // channel changes, because there's no feedback whether the keyframe // generation has completed on the channel.
saved_generate_keyframe_ = true;
}
void VideoRtpReceiver::OnEncodedSinkEnabled(bool enable) {
RTC_DCHECK_RUN_ON(worker_thread_);
SetEncodedSinkEnabled(enable); // Always save the latest state of the callback in case the media_channel_ // changes.
saved_encoded_sink_enabled_ = enable;
}
void VideoRtpReceiver::SetEncodedSinkEnabled(bool enable) {
RTC_DCHECK_RUN_ON(worker_thread_); if (!media_channel_) return;
// TODO(bugs.webrtc.org/8694): Stop using 0 to mean unsignalled SSRC constauto ssrc = signaled_ssrc_.value_or(0);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.