blob: 8969feaf8f958f803a54b168c1028322c487f481 [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>
17
18#include "absl/types/optional.h"
Erik Språng79c96de2022-08-19 11:48:10 +020019#include "api/sequence_checker.h"
Danil Chapovalov7b78a312021-08-06 12:30:02 +020020#include "api/video_codecs/video_decoder.h"
21#include "modules/video_coding/encoded_frame.h"
Niels Möllerf9063782018-02-20 16:09:48 +010022#include "modules/video_coding/generic_decoder.h"
23
24namespace webrtc {
25
Tommi20b32712022-09-29 14:13:15 +020026class VCMDecoderDatabase {
Niels Möllerf9063782018-02-20 16:09:48 +010027 public:
Tommi20b32712022-09-29 14:13:15 +020028 VCMDecoderDatabase();
29 VCMDecoderDatabase(const VCMDecoderDatabase&) = delete;
30 VCMDecoderDatabase& operator=(const VCMDecoderDatabase&) = delete;
31 ~VCMDecoderDatabase() = default;
Niels Möllerf9063782018-02-20 16:09:48 +010032
Tommibd02e702022-08-22 12:56:38 +020033 // Returns a pointer to the previously registered decoder or nullptr if none
34 // was registered for the `payload_type`.
35 VideoDecoder* DeregisterExternalDecoder(uint8_t payload_type);
Danil Chapovalov7b78a312021-08-06 12:30:02 +020036 void RegisterExternalDecoder(uint8_t payload_type,
37 VideoDecoder* external_decoder);
Johannes Kron16359f62021-02-18 23:37:22 +010038 bool IsExternalDecoderRegistered(uint8_t payload_type) const;
Niels Möllerf9063782018-02-20 16:09:48 +010039
Danil Chapovalovba0a3062021-08-13 18:15:55 +020040 void RegisterReceiveCodec(uint8_t payload_type,
Danil Chapovalov355b8d22021-08-13 16:50:37 +020041 const VideoDecoder::Settings& settings);
Niels Möllerf9063782018-02-20 16:09:48 +010042 bool DeregisterReceiveCodec(uint8_t payload_type);
Tommi96c1a9b2022-09-29 12:24:02 +020043 void DeregisterReceiveCodecs();
Niels Möllerf9063782018-02-20 16:09:48 +010044
Åsa Persson6cb74fd2018-06-01 15:13:42 +020045 // Returns a decoder specified by frame.PayloadType. The decoded frame
Artem Titovdcd7fc72021-08-09 13:02:57 +020046 // callback of the decoder is set to `decoded_frame_callback`. If no such
Åsa Persson6cb74fd2018-06-01 15:13:42 +020047 // decoder already exists an instance will be created and initialized.
48 // nullptr is returned if no decoder with the specified payload type was found
Niels Möllerf9063782018-02-20 16:09:48 +010049 // and the function failed to create one.
50 VCMGenericDecoder* GetDecoder(
51 const VCMEncodedFrame& frame,
52 VCMDecodedFrameCallback* decoded_frame_callback);
53
Niels Möllerf9063782018-02-20 16:09:48 +010054 private:
Erik Språng79c96de2022-08-19 11:48:10 +020055 void CreateAndInitDecoder(const VCMEncodedFrame& frame)
56 RTC_RUN_ON(decoder_sequence_checker_);
57
58 SequenceChecker decoder_sequence_checker_;
Niels Möllerf9063782018-02-20 16:09:48 +010059
Danil Chapovalov7b78a312021-08-06 12:30:02 +020060 absl::optional<uint8_t> current_payload_type_;
Erik Språng79c96de2022-08-19 11:48:10 +020061 absl::optional<VCMGenericDecoder> current_decoder_
62 RTC_GUARDED_BY(decoder_sequence_checker_);
Danil Chapovalov7b78a312021-08-06 12:30:02 +020063 // Initialization paramaters for decoders keyed by payload type.
Danil Chapovalov355b8d22021-08-13 16:50:37 +020064 std::map<uint8_t, VideoDecoder::Settings> decoder_settings_;
Danil Chapovalov7b78a312021-08-06 12:30:02 +020065 // Decoders keyed by payload type.
Erik Språng79c96de2022-08-19 11:48:10 +020066 std::map<uint8_t, VideoDecoder*> decoders_
67 RTC_GUARDED_BY(decoder_sequence_checker_);
Niels Möllerf9063782018-02-20 16:09:48 +010068};
69
70} // namespace webrtc
71
72#endif // MODULES_VIDEO_CODING_DECODER_DATABASE_H_