Clean up decoders when stopping video receive stream.

This updates VideoReceiveStream2::Stop() to symmetrically tear down
state that's built up in VideoReceiveStream2::Start().

Bug: webrtc:11993, webrtc:14486
Change-Id: I41f4feea5584e5baaeed2143432136f8b9761321
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/272537
Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#38244}
This commit is contained in:
Tommi
2022-09-29 12:24:02 +02:00
committed by WebRTC LUCI CQ
parent 2c1b4dac57
commit 96c1a9b9e2
14 changed files with 318 additions and 18 deletions

View File

@ -47,14 +47,15 @@ void VCMDecoderDataBase::RegisterExternalDecoder(
RTC_DCHECK_RUN_ON(&decoder_sequence_checker_);
// If payload value already exists, erase old and insert new.
DeregisterExternalDecoder(payload_type);
decoders_[payload_type] = external_decoder;
if (external_decoder) {
decoders_[payload_type] = external_decoder;
}
}
bool VCMDecoderDataBase::IsExternalDecoderRegistered(
uint8_t payload_type) const {
RTC_DCHECK_RUN_ON(&decoder_sequence_checker_);
return payload_type == current_payload_type_ ||
decoders_.find(payload_type) != decoders_.end();
return decoders_.find(payload_type) != decoders_.end();
}
void VCMDecoderDataBase::RegisterReceiveCodec(
@ -78,6 +79,11 @@ bool VCMDecoderDataBase::DeregisterReceiveCodec(uint8_t payload_type) {
return true;
}
void VCMDecoderDataBase::DeregisterReceiveCodecs() {
current_payload_type_ = absl::nullopt;
decoder_settings_.clear();
}
VCMGenericDecoder* VCMDecoderDataBase::GetDecoder(
const VCMEncodedFrame& frame,
VCMDecodedFrameCallback* decoded_frame_callback) {
@ -112,8 +118,8 @@ VCMGenericDecoder* VCMDecoderDataBase::GetDecoder(
void VCMDecoderDataBase::CreateAndInitDecoder(const VCMEncodedFrame& frame) {
uint8_t payload_type = frame.PayloadType();
RTC_LOG(LS_INFO) << "Initializing decoder with payload type '"
<< int{payload_type} << "'.";
RTC_DLOG(LS_INFO) << "Initializing decoder with payload type '"
<< int{payload_type} << "'.";
auto decoder_item = decoder_settings_.find(payload_type);
if (decoder_item == decoder_settings_.end()) {
RTC_LOG(LS_ERROR) << "Can't find a decoder associated with payload type: "