blob: 98f4335621ce85b9b7255754bcfa30069e9b3002 [file] [log] [blame]
Niels Möllerf9063782018-02-20 16:09:48 +01001/*
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
11#ifndef MODULES_VIDEO_CODING_DECODER_DATABASE_H_
12#define MODULES_VIDEO_CODING_DECODER_DATABASE_H_
13
Danil Chapovalov7b78a312021-08-06 12:30:02 +020014#include <stdint.h>
Niels Möllerf9063782018-02-20 16:09:48 +010015
Danil Chapovalov7b78a312021-08-06 12:30:02 +020016#include <map>
Tommi73009ec2022-09-29 21:02:04 +020017#include <memory>
Danil Chapovalov7b78a312021-08-06 12:30:02 +020018
19#include "absl/types/optional.h"
Erik Språng79c96de2022-08-19 11:48:10 +020020#include "api/sequence_checker.h"
Danil Chapovalov7b78a312021-08-06 12:30:02 +020021#include "api/video_codecs/video_decoder.h"
22#include "modules/video_coding/encoded_frame.h"
Niels Möllerf9063782018-02-20 16:09:48 +010023#include "modules/video_coding/generic_decoder.h"
24
25namespace webrtc {
26
Tommi20b32712022-09-29 14:13:15 +020027class VCMDecoderDatabase {
Niels Möllerf9063782018-02-20 16:09:48 +010028 public:
Tommi20b32712022-09-29 14:13:15 +020029 VCMDecoderDatabase();
30 VCMDecoderDatabase(const VCMDecoderDatabase&) = delete;
31 VCMDecoderDatabase& operator=(const VCMDecoderDatabase&) = delete;
32 ~VCMDecoderDatabase() = default;
Niels Möllerf9063782018-02-20 16:09:48 +010033
Tommibd02e702022-08-22 12:56:38 +020034 // Returns a pointer to the previously registered decoder or nullptr if none
35 // was registered for the `payload_type`.
Tommi73009ec2022-09-29 21:02:04 +020036 void DeregisterExternalDecoder(uint8_t payload_type);
Danil Chapovalov7b78a312021-08-06 12:30:02 +020037 void RegisterExternalDecoder(uint8_t payload_type,
Tommi73009ec2022-09-29 21:02:04 +020038 std::unique_ptr<VideoDecoder> external_decoder);
Johannes Kron16359f62021-02-18 23:37:22 +010039 bool IsExternalDecoderRegistered(uint8_t payload_type) const;
Niels Möllerf9063782018-02-20 16:09:48 +010040
Danil Chapovalovba0a3062021-08-13 18:15:55 +020041 void RegisterReceiveCodec(uint8_t payload_type,
Danil Chapovalov355b8d22021-08-13 16:50:37 +020042 const VideoDecoder::Settings& settings);
Niels Möllerf9063782018-02-20 16:09:48 +010043 bool DeregisterReceiveCodec(uint8_t payload_type);
Tommi96c1a9b2022-09-29 12:24:02 +020044 void DeregisterReceiveCodecs();
Niels Möllerf9063782018-02-20 16:09:48 +010045
Åsa Persson6cb74fd2018-06-01 15:13:42 +020046 // Returns a decoder specified by frame.PayloadType. The decoded frame
Artem Titovdcd7fc72021-08-09 13:02:57 +020047 // callback of the decoder is set to `decoded_frame_callback`. If no such
Åsa Persson6cb74fd2018-06-01 15:13:42 +020048 // decoder already exists an instance will be created and initialized.
49 // nullptr is returned if no decoder with the specified payload type was found
Niels Möllerf9063782018-02-20 16:09:48 +010050 // and the function failed to create one.
51 VCMGenericDecoder* GetDecoder(
52 const VCMEncodedFrame& frame,
53 VCMDecodedFrameCallback* decoded_frame_callback);
54
Niels Möllerf9063782018-02-20 16:09:48 +010055 private:
Erik Språng79c96de2022-08-19 11:48:10 +020056 void CreateAndInitDecoder(const VCMEncodedFrame& frame)
57 RTC_RUN_ON(decoder_sequence_checker_);
58
59 SequenceChecker decoder_sequence_checker_;
Niels Möllerf9063782018-02-20 16:09:48 +010060
Danil Chapovalov7b78a312021-08-06 12:30:02 +020061 absl::optional<uint8_t> current_payload_type_;
Erik Språng79c96de2022-08-19 11:48:10 +020062 absl::optional<VCMGenericDecoder> current_decoder_
63 RTC_GUARDED_BY(decoder_sequence_checker_);
Danil Chapovalov7b78a312021-08-06 12:30:02 +020064 // Initialization paramaters for decoders keyed by payload type.
Danil Chapovalov355b8d22021-08-13 16:50:37 +020065 std::map<uint8_t, VideoDecoder::Settings> decoder_settings_;
Danil Chapovalov7b78a312021-08-06 12:30:02 +020066 // Decoders keyed by payload type.
Tommi73009ec2022-09-29 21:02:04 +020067 std::map<uint8_t, std::unique_ptr<VideoDecoder>> decoders_
Erik Språng79c96de2022-08-19 11:48:10 +020068 RTC_GUARDED_BY(decoder_sequence_checker_);
Niels Möllerf9063782018-02-20 16:09:48 +010069};
70
71} // namespace webrtc
72
73#endif // MODULES_VIDEO_CODING_DECODER_DATABASE_H_