xref: /aosp_15_r20/external/webrtc/modules/video_coding/codecs/multiplex/include/multiplex_encoder_adapter.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright (c) 2017 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_CODECS_MULTIPLEX_INCLUDE_MULTIPLEX_ENCODER_ADAPTER_H_
12 #define MODULES_VIDEO_CODING_CODECS_MULTIPLEX_INCLUDE_MULTIPLEX_ENCODER_ADAPTER_H_
13 
14 #include <map>
15 #include <memory>
16 #include <vector>
17 
18 #include "api/fec_controller_override.h"
19 #include "api/video_codecs/sdp_video_format.h"
20 #include "api/video_codecs/video_encoder.h"
21 #include "api/video_codecs/video_encoder_factory.h"
22 #include "modules/video_coding/codecs/multiplex/multiplex_encoded_image_packer.h"
23 #include "modules/video_coding/include/video_codec_interface.h"
24 #include "rtc_base/synchronization/mutex.h"
25 
26 namespace webrtc {
27 
28 enum AlphaCodecStream {
29   kYUVStream = 0,
30   kAXXStream = 1,
31   kAlphaCodecStreams = 2,
32 };
33 
34 class MultiplexEncoderAdapter : public VideoEncoder {
35  public:
36   // `factory` is not owned and expected to outlive this class.
37   MultiplexEncoderAdapter(VideoEncoderFactory* factory,
38                           const SdpVideoFormat& associated_format,
39                           bool supports_augmenting_data = false);
40   virtual ~MultiplexEncoderAdapter();
41 
42   // Implements VideoEncoder
43   void SetFecControllerOverride(
44       FecControllerOverride* fec_controller_override) override;
45   int InitEncode(const VideoCodec* inst,
46                  const VideoEncoder::Settings& settings) override;
47   int Encode(const VideoFrame& input_image,
48              const std::vector<VideoFrameType>* frame_types) override;
49   int RegisterEncodeCompleteCallback(EncodedImageCallback* callback) override;
50   void SetRates(const RateControlParameters& parameters) override;
51   void OnPacketLossRateUpdate(float packet_loss_rate) override;
52   void OnRttUpdate(int64_t rtt_ms) override;
53   void OnLossNotification(const LossNotification& loss_notification) override;
54   int Release() override;
55   EncoderInfo GetEncoderInfo() const override;
56 
57   EncodedImageCallback::Result OnEncodedImage(
58       AlphaCodecStream stream_idx,
59       const EncodedImage& encodedImage,
60       const CodecSpecificInfo* codecSpecificInfo);
61 
62  private:
63   // Wrapper class that redirects OnEncodedImage() calls.
64   class AdapterEncodedImageCallback;
65 
66   VideoEncoderFactory* const factory_;
67   const SdpVideoFormat associated_format_;
68   std::vector<std::unique_ptr<VideoEncoder>> encoders_;
69   std::vector<std::unique_ptr<AdapterEncodedImageCallback>> adapter_callbacks_;
70   EncodedImageCallback* encoded_complete_callback_;
71 
72   std::map<uint32_t /* timestamp */, MultiplexImage> stashed_images_
73       RTC_GUARDED_BY(mutex_);
74 
75   uint16_t picture_index_ = 0;
76   std::vector<uint8_t> multiplex_dummy_planes_;
77 
78   int key_frame_interval_;
79   EncodedImage combined_image_;
80 
81   Mutex mutex_;
82 
83   const bool supports_augmented_data_;
84   int augmenting_data_size_ = 0;
85 
86   EncoderInfo encoder_info_;
87 };
88 
89 }  // namespace webrtc
90 
91 #endif  // MODULES_VIDEO_CODING_CODECS_MULTIPLEX_INCLUDE_MULTIPLEX_ENCODER_ADAPTER_H_
92