Split VCMCodecDataBase into VCMEncoderDataBase and VCMDecoderDataBase.

Intended to ease further refactoring, cleanup and deletion in this code.

Bug: webrtc:8830
Change-Id: Ib862b073e93b67b4f8eedbbf40ad3a8354a566a2
Reviewed-on: https://webrtc-review.googlesource.com/55562
Reviewed-by: Rasmus Brandt <brandtr@webrtc.org>
Commit-Queue: Niels Moller <nisse@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#22120}
diff --git a/modules/video_coding/decoder_database.h b/modules/video_coding/decoder_database.h
new file mode 100644
index 0000000..8c03edb
--- /dev/null
+++ b/modules/video_coding/decoder_database.h
@@ -0,0 +1,96 @@
+/*
+ *  Copyright (c) 2018 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.
+ */
+
+#ifndef MODULES_VIDEO_CODING_DECODER_DATABASE_H_
+#define MODULES_VIDEO_CODING_DECODER_DATABASE_H_
+
+#include <map>
+#include <memory>
+
+#include "modules/video_coding/generic_decoder.h"
+
+namespace webrtc {
+
+struct VCMDecoderMapItem {
+ public:
+  VCMDecoderMapItem(VideoCodec* settings,
+                    int number_of_cores,
+                    bool require_key_frame);
+
+  std::unique_ptr<VideoCodec> settings;
+  int number_of_cores;
+  bool require_key_frame;
+};
+
+struct VCMExtDecoderMapItem {
+ public:
+  VCMExtDecoderMapItem(VideoDecoder* external_decoder_instance,
+                       uint8_t payload_type);
+
+  uint8_t payload_type;
+  VideoDecoder* external_decoder_instance;
+};
+
+class VCMDecoderDataBase {
+ public:
+  VCMDecoderDataBase();
+  ~VCMDecoderDataBase();
+
+  bool DeregisterExternalDecoder(uint8_t payload_type);
+  void RegisterExternalDecoder(VideoDecoder* external_decoder,
+                               uint8_t payload_type);
+
+  bool DecoderRegistered() const;
+
+  bool RegisterReceiveCodec(const VideoCodec* receive_codec,
+                            int number_of_cores,
+                            bool require_key_frame);
+
+  bool DeregisterReceiveCodec(uint8_t payload_type);
+
+  // Returns a decoder specified by |payload_type|. The decoded frame callback
+  // of the encoder is set to |decoded_frame_callback|. If no such decoder
+  // already exists an instance will be created and initialized.
+  // NULL is returned if no encoder with the specified payload type was found
+  // and the function failed to create one.
+  VCMGenericDecoder* GetDecoder(
+      const VCMEncodedFrame& frame,
+      VCMDecodedFrameCallback* decoded_frame_callback);
+
+  // Returns the current decoder (i.e. the same value as was last returned from
+  // GetDecoder();
+  VCMGenericDecoder* GetCurrentDecoder();
+
+  // Returns true if the currently active decoder prefer to decode frames late.
+  // That means that frames must be decoded near the render times stamp.
+  bool PrefersLateDecoding() const;
+
+ private:
+  typedef std::map<uint8_t, VCMDecoderMapItem*> DecoderMap;
+  typedef std::map<uint8_t, VCMExtDecoderMapItem*> ExternalDecoderMap;
+
+  std::unique_ptr<VCMGenericDecoder> CreateAndInitDecoder(
+      const VCMEncodedFrame& frame,
+      VideoCodec* new_codec) const;
+
+  const VCMDecoderMapItem* FindDecoderItem(uint8_t payload_type) const;
+
+  const VCMExtDecoderMapItem* FindExternalDecoderItem(
+      uint8_t payload_type) const;
+
+  VideoCodec receive_codec_;
+  std::unique_ptr<VCMGenericDecoder> ptr_decoder_;
+  DecoderMap dec_map_;
+  ExternalDecoderMap dec_external_map_;
+};
+
+}  // namespace webrtc
+
+#endif  // MODULES_VIDEO_CODING_DECODER_DATABASE_H_