On receive stream shutdown, deregister decoders on decoder thread.

Now Configure(), Decode() and Release() calls to the decoders should
all happen on the decoder thread. Added thread checkers to verify.

Bug: None
Change-Id: I2a1cf2cf7f3c3c7c50e382d82a3638e916ed9c34
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/272368
Reviewed-by: Evan Shrubsole <eshr@webrtc.org>
Commit-Queue: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#37840}
diff --git a/modules/video_coding/decoder_database.cc b/modules/video_coding/decoder_database.cc
index 01120dc..882de27 100644
--- a/modules/video_coding/decoder_database.cc
+++ b/modules/video_coding/decoder_database.cc
@@ -15,7 +15,12 @@
 
 namespace webrtc {
 
+VCMDecoderDataBase::VCMDecoderDataBase() {
+  decoder_sequence_checker_.Detach();
+}
+
 bool VCMDecoderDataBase::DeregisterExternalDecoder(uint8_t payload_type) {
+  RTC_DCHECK_RUN_ON(&decoder_sequence_checker_);
   auto it = decoders_.find(payload_type);
   if (it == decoders_.end()) {
     // Not found.
@@ -37,6 +42,7 @@
 void VCMDecoderDataBase::RegisterExternalDecoder(
     uint8_t payload_type,
     VideoDecoder* external_decoder) {
+  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;
@@ -44,6 +50,7 @@
 
 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();
 }
@@ -72,6 +79,7 @@
 VCMGenericDecoder* VCMDecoderDataBase::GetDecoder(
     const VCMEncodedFrame& frame,
     VCMDecodedFrameCallback* decoded_frame_callback) {
+  RTC_DCHECK_RUN_ON(&decoder_sequence_checker_);
   RTC_DCHECK(decoded_frame_callback->UserReceiveCallback());
   uint8_t payload_type = frame.PayloadType();
   if (payload_type == current_payload_type_ || payload_type == 0) {