decoder_database.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /*
  2. * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
  3. *
  4. * Use of this source code is governed by a BSD-style license
  5. * that can be found in the LICENSE file in the root of the source
  6. * tree. An additional intellectual property rights grant can be found
  7. * in the file PATENTS. All contributing project authors may
  8. * be found in the AUTHORS file in the root of the source tree.
  9. */
  10. #ifndef MODULES_VIDEO_CODING_DECODER_DATABASE_H_
  11. #define MODULES_VIDEO_CODING_DECODER_DATABASE_H_
  12. #include <map>
  13. #include <memory>
  14. #include "modules/video_coding/generic_decoder.h"
  15. namespace webrtc {
  16. struct VCMDecoderMapItem {
  17. public:
  18. VCMDecoderMapItem(VideoCodec* settings,
  19. int number_of_cores,
  20. bool require_key_frame);
  21. ~VCMDecoderMapItem();
  22. std::unique_ptr<VideoCodec> settings;
  23. int number_of_cores;
  24. bool require_key_frame;
  25. };
  26. struct VCMExtDecoderMapItem {
  27. public:
  28. VCMExtDecoderMapItem(VideoDecoder* external_decoder_instance,
  29. uint8_t payload_type);
  30. uint8_t payload_type;
  31. VideoDecoder* external_decoder_instance;
  32. };
  33. class VCMDecoderDataBase {
  34. public:
  35. VCMDecoderDataBase();
  36. ~VCMDecoderDataBase();
  37. bool DeregisterExternalDecoder(uint8_t payload_type);
  38. void RegisterExternalDecoder(VideoDecoder* external_decoder,
  39. uint8_t payload_type);
  40. bool RegisterReceiveCodec(const VideoCodec* receive_codec,
  41. int number_of_cores,
  42. bool require_key_frame);
  43. bool DeregisterReceiveCodec(uint8_t payload_type);
  44. // Returns a decoder specified by frame.PayloadType. The decoded frame
  45. // callback of the decoder is set to |decoded_frame_callback|. If no such
  46. // decoder already exists an instance will be created and initialized.
  47. // nullptr is returned if no decoder with the specified payload type was found
  48. // and the function failed to create one.
  49. VCMGenericDecoder* GetDecoder(
  50. const VCMEncodedFrame& frame,
  51. VCMDecodedFrameCallback* decoded_frame_callback);
  52. // Returns true if the currently active decoder prefer to decode frames late.
  53. // That means that frames must be decoded near the render times stamp.
  54. bool PrefersLateDecoding() const;
  55. private:
  56. typedef std::map<uint8_t, VCMDecoderMapItem*> DecoderMap;
  57. typedef std::map<uint8_t, VCMExtDecoderMapItem*> ExternalDecoderMap;
  58. std::unique_ptr<VCMGenericDecoder> CreateAndInitDecoder(
  59. const VCMEncodedFrame& frame,
  60. VideoCodec* new_codec) const;
  61. const VCMDecoderMapItem* FindDecoderItem(uint8_t payload_type) const;
  62. const VCMExtDecoderMapItem* FindExternalDecoderItem(
  63. uint8_t payload_type) const;
  64. VideoCodec receive_codec_;
  65. std::unique_ptr<VCMGenericDecoder> ptr_decoder_;
  66. DecoderMap dec_map_;
  67. ExternalDecoderMap dec_external_map_;
  68. };
  69. } // namespace webrtc
  70. #endif // MODULES_VIDEO_CODING_DECODER_DATABASE_H_