• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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       const RTPFragmentationHeader* fragmentation);
62 
63  private:
64   // Wrapper class that redirects OnEncodedImage() calls.
65   class AdapterEncodedImageCallback;
66 
67   VideoEncoderFactory* const factory_;
68   const SdpVideoFormat associated_format_;
69   std::vector<std::unique_ptr<VideoEncoder>> encoders_;
70   std::vector<std::unique_ptr<AdapterEncodedImageCallback>> adapter_callbacks_;
71   EncodedImageCallback* encoded_complete_callback_;
72 
73   std::map<uint32_t /* timestamp */, MultiplexImage> stashed_images_
74       RTC_GUARDED_BY(mutex_);
75 
76   uint16_t picture_index_ = 0;
77   std::vector<uint8_t> multiplex_dummy_planes_;
78 
79   int key_frame_interval_;
80   EncodedImage combined_image_;
81 
82   Mutex mutex_;
83 
84   const bool supports_augmented_data_;
85   int augmenting_data_size_ = 0;
86 
87   EncoderInfo encoder_info_;
88 };
89 
90 }  // namespace webrtc
91 
92 #endif  // MODULES_VIDEO_CODING_CODECS_MULTIPLEX_INCLUDE_MULTIPLEX_ENCODER_ADAPTER_H_
93