blob: 80b32b36466a88b8b143c2064b374042f8a76708 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
stefan@webrtc.orgf27916a2012-01-20 14:04:13 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef MODULES_VIDEO_CODING_CODEC_DATABASE_H_
12#define MODULES_VIDEO_CODING_CODEC_DATABASE_H_
niklase@google.com470e71d2011-07-07 08:21:25 +000013
stefan@webrtc.orgf27916a2012-01-20 14:04:13 +000014#include <map>
kwiberg3f55dea2016-02-29 05:51:59 -080015#include <memory>
stefan@webrtc.orgf27916a2012-01-20 14:04:13 +000016
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "modules/video_coding/include/video_codec_interface.h"
18#include "modules/video_coding/include/video_coding.h"
19#include "modules/video_coding/generic_decoder.h"
20#include "modules/video_coding/generic_encoder.h"
Mirko Bonadei71207422017-09-15 13:58:09 +020021#include "typedefs.h" // NOLINT(build/include)
niklase@google.com470e71d2011-07-07 08:21:25 +000022
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +000023namespace webrtc {
niklase@google.com470e71d2011-07-07 08:21:25 +000024
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +000025struct VCMDecoderMapItem {
26 public:
27 VCMDecoderMapItem(VideoCodec* settings,
28 int number_of_cores,
29 bool require_key_frame);
niklase@google.com470e71d2011-07-07 08:21:25 +000030
kwiberg3f55dea2016-02-29 05:51:59 -080031 std::unique_ptr<VideoCodec> settings;
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +000032 int number_of_cores;
33 bool require_key_frame;
niklase@google.com470e71d2011-07-07 08:21:25 +000034};
35
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +000036struct VCMExtDecoderMapItem {
37 public:
38 VCMExtDecoderMapItem(VideoDecoder* external_decoder_instance,
perkj796cfaf2015-12-10 09:27:38 -080039 uint8_t payload_type);
niklase@google.com470e71d2011-07-07 08:21:25 +000040
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +000041 uint8_t payload_type;
42 VideoDecoder* external_decoder_instance;
niklase@google.com470e71d2011-07-07 08:21:25 +000043};
44
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +000045class VCMCodecDataBase {
46 public:
perkjf5b2e512016-07-05 08:34:04 -070047 explicit VCMCodecDataBase(VCMEncodedFrameCallback* encoded_frame_callback);
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +000048 ~VCMCodecDataBase();
niklase@google.com470e71d2011-07-07 08:21:25 +000049
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +000050 // Sets the sender side codec and initiates the desired codec given the
51 // VideoCodec struct.
52 // Returns true if the codec was successfully registered, false otherwise.
pbos@webrtc.orgb9bb3d12013-05-16 18:40:48 +000053 bool SetSendCodec(const VideoCodec* send_codec,
54 int number_of_cores,
Peter Boström4f5db112015-10-29 16:53:59 +010055 size_t max_payload_size);
niklase@google.com470e71d2011-07-07 08:21:25 +000056
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +000057 // Registers and initializes an external encoder object.
58 // |internal_source| should be set to true if the codec has an internal
59 // video source and doesn't need the user to provide it with frames via
60 // the Encode() method.
61 void RegisterExternalEncoder(VideoEncoder* external_encoder,
62 uint8_t payload_type,
63 bool internal_source);
niklase@google.com470e71d2011-07-07 08:21:25 +000064
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +000065 // Deregisters an external encoder. Returns true if the encoder was
66 // found and deregistered, false otherwise. |was_send_codec| is set to true
67 // if the external encoder was the send codec before being deregistered.
68 bool DeregisterExternalEncoder(uint8_t payload_type, bool* was_send_codec);
niklase@google.com470e71d2011-07-07 08:21:25 +000069
pbos@webrtc.orgb9bb3d12013-05-16 18:40:48 +000070 VCMGenericEncoder* GetEncoder();
niklase@google.com470e71d2011-07-07 08:21:25 +000071
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +000072 bool SetPeriodicKeyFrames(bool enable);
niklase@google.com470e71d2011-07-07 08:21:25 +000073
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +000074 // Deregisters an external decoder object specified by |payload_type|.
75 bool DeregisterExternalDecoder(uint8_t payload_type);
niklase@google.com470e71d2011-07-07 08:21:25 +000076
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +000077 // Registers an external decoder object to the payload type |payload_type|.
Peter Boström795dbe42015-11-27 14:09:07 +010078 void RegisterExternalDecoder(VideoDecoder* external_decoder,
perkj796cfaf2015-12-10 09:27:38 -080079 uint8_t payload_type);
niklase@google.com470e71d2011-07-07 08:21:25 +000080
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +000081 bool DecoderRegistered() const;
niklase@google.com470e71d2011-07-07 08:21:25 +000082
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +000083 bool RegisterReceiveCodec(const VideoCodec* receive_codec,
84 int number_of_cores,
85 bool require_key_frame);
86
87 bool DeregisterReceiveCodec(uint8_t payload_type);
88
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +000089 // Returns a decoder specified by |payload_type|. The decoded frame callback
90 // of the encoder is set to |decoded_frame_callback|. If no such decoder
91 // already exists an instance will be created and initialized.
92 // NULL is returned if no encoder with the specified payload type was found
93 // and the function failed to create one.
94 VCMGenericDecoder* GetDecoder(
Peter Boströme997a7d2015-11-27 14:23:21 +010095 const VCMEncodedFrame& frame,
96 VCMDecodedFrameCallback* decoded_frame_callback);
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +000097
tommi5b7fc8c2017-07-05 16:45:57 -070098 // Returns the current decoder (i.e. the same value as was last returned from
99 // GetDecoder();
100 VCMGenericDecoder* GetCurrentDecoder();
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +0000101
perkj796cfaf2015-12-10 09:27:38 -0800102 // Returns true if the currently active decoder prefer to decode frames late.
103 // That means that frames must be decoded near the render times stamp.
104 bool PrefersLateDecoding() const;
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +0000105
pbos@webrtc.org67a9e402015-03-05 13:57:37 +0000106 bool MatchesCurrentResolution(int width, int height) const;
107
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +0000108 private:
109 typedef std::map<uint8_t, VCMDecoderMapItem*> DecoderMap;
110 typedef std::map<uint8_t, VCMExtDecoderMapItem*> ExternalDecoderMap;
111
tommi5b7fc8c2017-07-05 16:45:57 -0700112 std::unique_ptr<VCMGenericDecoder> CreateAndInitDecoder(
113 const VCMEncodedFrame& frame,
114 VideoCodec* new_codec) const;
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +0000115
pbos@webrtc.orgb9bb3d12013-05-16 18:40:48 +0000116 // Determines whether a new codec has to be created or not.
117 // Checks every setting apart from maxFramerate and startBitrate.
118 bool RequiresEncoderReset(const VideoCodec& send_codec);
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +0000119
120 void DeleteEncoder();
121
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +0000122 const VCMDecoderMapItem* FindDecoderItem(uint8_t payload_type) const;
123
124 const VCMExtDecoderMapItem* FindExternalDecoderItem(
125 uint8_t payload_type) const;
126
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +0000127 int number_of_cores_;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000128 size_t max_payload_size_;
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +0000129 bool periodic_key_frames_;
pbos@webrtc.orgb9bb3d12013-05-16 18:40:48 +0000130 bool pending_encoder_reset_;
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +0000131 VideoCodec send_codec_;
132 VideoCodec receive_codec_;
Peter Boströmab73d132015-10-15 12:01:38 +0200133 uint8_t encoder_payload_type_;
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +0000134 VideoEncoder* external_encoder_;
135 bool internal_source_;
Peter Boström4f5db112015-10-29 16:53:59 +0100136 VCMEncodedFrameCallback* const encoded_frame_callback_;
kwiberg3f55dea2016-02-29 05:51:59 -0800137 std::unique_ptr<VCMGenericEncoder> ptr_encoder_;
tommi5b7fc8c2017-07-05 16:45:57 -0700138 std::unique_ptr<VCMGenericDecoder> ptr_decoder_;
stefan@webrtc.orgfa7e8682012-10-11 11:21:38 +0000139 DecoderMap dec_map_;
140 ExternalDecoderMap dec_external_map_;
141}; // VCMCodecDataBase
142
143} // namespace webrtc
144
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200145#endif // MODULES_VIDEO_CODING_CODEC_DATABASE_H_