webrtc/modules/video_coding/decoder_database.h
Tommi 20b3271b61 Fork VCMDecoderDatabase for VideoReceiver.
This is to keep the deprecated VideoReceiver separate from the
implementation used by VideoReceiver2 before updating
VCMDecoderDatabase to have ownership of the registered decoders.

Fixing typo (DataBase->Database) in the name of the remaining class.

Bug: webrtc:14486, webrtc:14497
Change-Id: I5ee755921454b0831b3af6d0161f5b48c7c60540
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/276781
Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org>
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#38247}
2022-09-29 19:01:05 +00:00

72 lines
2.6 KiB
C++

/*
* 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 <stdint.h>
#include <map>
#include "absl/types/optional.h"
#include "api/sequence_checker.h"
#include "api/video_codecs/video_decoder.h"
#include "modules/video_coding/encoded_frame.h"
#include "modules/video_coding/generic_decoder.h"
namespace webrtc {
class VCMDecoderDatabase {
public:
VCMDecoderDatabase();
VCMDecoderDatabase(const VCMDecoderDatabase&) = delete;
VCMDecoderDatabase& operator=(const VCMDecoderDatabase&) = delete;
~VCMDecoderDatabase() = default;
// Returns a pointer to the previously registered decoder or nullptr if none
// was registered for the `payload_type`.
VideoDecoder* DeregisterExternalDecoder(uint8_t payload_type);
void RegisterExternalDecoder(uint8_t payload_type,
VideoDecoder* external_decoder);
bool IsExternalDecoderRegistered(uint8_t payload_type) const;
void RegisterReceiveCodec(uint8_t payload_type,
const VideoDecoder::Settings& settings);
bool DeregisterReceiveCodec(uint8_t payload_type);
void DeregisterReceiveCodecs();
// Returns a decoder specified by frame.PayloadType. The decoded frame
// callback of the decoder is set to `decoded_frame_callback`. If no such
// decoder already exists an instance will be created and initialized.
// nullptr is returned if no decoder with the specified payload type was found
// and the function failed to create one.
VCMGenericDecoder* GetDecoder(
const VCMEncodedFrame& frame,
VCMDecodedFrameCallback* decoded_frame_callback);
private:
void CreateAndInitDecoder(const VCMEncodedFrame& frame)
RTC_RUN_ON(decoder_sequence_checker_);
SequenceChecker decoder_sequence_checker_;
absl::optional<uint8_t> current_payload_type_;
absl::optional<VCMGenericDecoder> current_decoder_
RTC_GUARDED_BY(decoder_sequence_checker_);
// Initialization paramaters for decoders keyed by payload type.
std::map<uint8_t, VideoDecoder::Settings> decoder_settings_;
// Decoders keyed by payload type.
std::map<uint8_t, VideoDecoder*> decoders_
RTC_GUARDED_BY(decoder_sequence_checker_);
};
} // namespace webrtc
#endif // MODULES_VIDEO_CODING_DECODER_DATABASE_H_