void VideoRtpReceiver::SetStreams( const std::vector<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.