Delay creation of decoders until they are needed

Before this CL, WebRTC created a decoder for each negotiated codec
profile. This quickly consumed all available HW decoder resources
on some platforms. This CL adds a field trial,
WebRTC-PreStreamDecoders, that makes it possible to set how many
decoders that should be created up front, from 0 to ALL. If the
field trial is set to 1, we only create a decoder for the
preferred codec. The other decoders are only created when they are
needed (i.e., if we receive the corresponding payload type).

Bug: webrtc:12462
Change-Id: I087571b540f6796d32d34923f9c7f8e89b0959c5
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/208284
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Commit-Queue: Johannes Kron <kron@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#33300}
diff --git a/modules/video_coding/decoder_database.cc b/modules/video_coding/decoder_database.cc
index 594ca86..6aa332e 100644
--- a/modules/video_coding/decoder_database.cc
+++ b/modules/video_coding/decoder_database.cc
@@ -56,7 +56,6 @@
     // Release it if it was registered and in use.
     ptr_decoder_.reset();
   }
-  DeregisterReceiveCodec(payload_type);
   delete it->second;
   dec_external_map_.erase(it);
   return true;
@@ -73,6 +72,12 @@
   dec_external_map_[payload_type] = ext_decoder;
 }
 
+bool VCMDecoderDataBase::IsExternalDecoderRegistered(
+    uint8_t payload_type) const {
+  return payload_type == current_payload_type_ ||
+         FindExternalDecoderItem(payload_type);
+}
+
 bool VCMDecoderDataBase::RegisterReceiveCodec(uint8_t payload_type,
                                               const VideoCodec* receive_codec,
                                               int number_of_cores) {