• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2012 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 WEBRTC_MODULES_VIDEO_CODING_VIDEO_CODING_IMPL_H_
12 #define WEBRTC_MODULES_VIDEO_CODING_VIDEO_CODING_IMPL_H_
13 
14 #include "webrtc/modules/video_coding/main/interface/video_coding.h"
15 
16 #include <vector>
17 
18 #include "webrtc/base/thread_annotations.h"
19 #include "webrtc/modules/video_coding/main/source/codec_database.h"
20 #include "webrtc/modules/video_coding/main/source/frame_buffer.h"
21 #include "webrtc/modules/video_coding/main/source/generic_decoder.h"
22 #include "webrtc/modules/video_coding/main/source/generic_encoder.h"
23 #include "webrtc/modules/video_coding/main/source/jitter_buffer.h"
24 #include "webrtc/modules/video_coding/main/source/media_optimization.h"
25 #include "webrtc/modules/video_coding/main/source/receiver.h"
26 #include "webrtc/modules/video_coding/main/source/timing.h"
27 #include "webrtc/system_wrappers/interface/clock.h"
28 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
29 
30 namespace webrtc {
31 
32 class EncodedFrameObserver;
33 
34 namespace vcm {
35 
36 class DebugRecorder;
37 
38 class VCMProcessTimer {
39  public:
VCMProcessTimer(uint32_t periodMs,Clock * clock)40   VCMProcessTimer(uint32_t periodMs, Clock* clock)
41       : _clock(clock),
42         _periodMs(periodMs),
43         _latestMs(_clock->TimeInMilliseconds()) {}
44   uint32_t Period() const;
45   uint32_t TimeUntilProcess() const;
46   void Processed();
47 
48  private:
49   Clock* _clock;
50   uint32_t _periodMs;
51   int64_t _latestMs;
52 };
53 
54 class VideoSender {
55  public:
56   typedef VideoCodingModule::SenderNackMode SenderNackMode;
57 
58   VideoSender(Clock* clock, EncodedImageCallback* post_encode_callback);
59 
60   ~VideoSender();
61 
62   int32_t InitializeSender();
63 
64   // Register the send codec to be used.
65   int32_t RegisterSendCodec(const VideoCodec* sendCodec,
66                             uint32_t numberOfCores,
67                             uint32_t maxPayloadSize);
68 
69   int32_t SendCodec(VideoCodec* currentSendCodec) const;
70   VideoCodecType SendCodec() const;
71   int32_t RegisterExternalEncoder(VideoEncoder* externalEncoder,
72                                   uint8_t payloadType,
73                                   bool internalSource);
74 
75   int32_t CodecConfigParameters(uint8_t* buffer, int32_t size) const;
76   int32_t SentFrameCount(VCMFrameCount* frameCount);
77   int Bitrate(unsigned int* bitrate) const;
78   int FrameRate(unsigned int* framerate) const;
79 
80   int32_t SetChannelParameters(uint32_t target_bitrate,  // bits/s.
81                                uint8_t lossRate,
82                                uint32_t rtt);
83 
84   int32_t RegisterTransportCallback(VCMPacketizationCallback* transport);
85   int32_t RegisterSendStatisticsCallback(VCMSendStatisticsCallback* sendStats);
86   int32_t RegisterVideoQMCallback(VCMQMSettingsCallback* videoQMSettings);
87   int32_t RegisterProtectionCallback(VCMProtectionCallback* protection);
88   int32_t SetVideoProtection(VCMVideoProtection videoProtection, bool enable);
89 
90   int32_t AddVideoFrame(const I420VideoFrame& videoFrame,
91                         const VideoContentMetrics* _contentMetrics,
92                         const CodecSpecificInfo* codecSpecificInfo);
93 
94   int32_t IntraFrameRequest(int stream_index);
95   int32_t EnableFrameDropper(bool enable);
96 
97   int SetSenderNackMode(SenderNackMode mode);
98   int SetSenderReferenceSelection(bool enable);
99   int SetSenderFEC(bool enable);
100   int SetSenderKeyFramePeriod(int periodMs);
101 
102   int StartDebugRecording(const char* file_name_utf8);
103   void StopDebugRecording();
104 
105   void SuspendBelowMinBitrate();
106   bool VideoSuspended() const;
107 
108   int32_t TimeUntilNextProcess();
109   int32_t Process();
110 
111  private:
112   Clock* clock_;
113 
114   scoped_ptr<DebugRecorder> recorder_;
115 
116   scoped_ptr<CriticalSectionWrapper> process_crit_sect_;
117   CriticalSectionWrapper* _sendCritSect;
118   VCMGenericEncoder* _encoder;
119   VCMEncodedFrameCallback _encodedFrameCallback;
120   std::vector<FrameType> _nextFrameTypes;
121   media_optimization::MediaOptimization _mediaOpt;
122   VCMSendStatisticsCallback* _sendStatsCallback;
123   VCMCodecDataBase _codecDataBase;
124   bool frame_dropper_enabled_;
125   VCMProcessTimer _sendStatsTimer;
126 
127   VCMQMSettingsCallback* qm_settings_callback_;
128   VCMProtectionCallback* protection_callback_;
129 };
130 
131 class VideoReceiver {
132  public:
133   typedef VideoCodingModule::ReceiverRobustness ReceiverRobustness;
134 
135   VideoReceiver(Clock* clock, EventFactory* event_factory);
136   ~VideoReceiver();
137 
138   int32_t InitializeReceiver();
139   int32_t RegisterReceiveCodec(const VideoCodec* receiveCodec,
140                                int32_t numberOfCores,
141                                bool requireKeyFrame);
142 
143   int32_t RegisterExternalDecoder(VideoDecoder* externalDecoder,
144                                   uint8_t payloadType,
145                                   bool internalRenderTiming);
146   int32_t RegisterReceiveCallback(VCMReceiveCallback* receiveCallback);
147   int32_t RegisterReceiveStatisticsCallback(
148       VCMReceiveStatisticsCallback* receiveStats);
149   int32_t RegisterDecoderTimingCallback(
150       VCMDecoderTimingCallback* decoderTiming);
151   int32_t RegisterFrameTypeCallback(VCMFrameTypeCallback* frameTypeCallback);
152   int32_t RegisterPacketRequestCallback(VCMPacketRequestCallback* callback);
153   int RegisterRenderBufferSizeCallback(VCMRenderBufferSizeCallback* callback);
154 
155   int32_t Decode(uint16_t maxWaitTimeMs);
156   int32_t DecodeDualFrame(uint16_t maxWaitTimeMs);
157   int32_t ResetDecoder();
158 
159   int32_t ReceiveCodec(VideoCodec* currentReceiveCodec) const;
160   VideoCodecType ReceiveCodec() const;
161 
162   int32_t IncomingPacket(const uint8_t* incomingPayload,
163                          uint32_t payloadLength,
164                          const WebRtcRTPHeader& rtpInfo);
165   int32_t SetMinimumPlayoutDelay(uint32_t minPlayoutDelayMs);
166   int32_t SetRenderDelay(uint32_t timeMS);
167   int32_t Delay() const;
168   int32_t ReceivedFrameCount(VCMFrameCount* frameCount) const;
169   uint32_t DiscardedPackets() const;
170 
171   int SetReceiverRobustnessMode(ReceiverRobustness robustnessMode,
172                                 VCMDecodeErrorMode errorMode);
173   void SetNackSettings(size_t max_nack_list_size,
174                        int max_packet_age_to_nack,
175                        int max_incomplete_time_ms);
176 
177   void SetDecodeErrorMode(VCMDecodeErrorMode decode_error_mode);
178   int SetMinReceiverDelay(int desired_delay_ms);
179 
180   int32_t SetReceiveChannelParameters(uint32_t rtt);
181   int32_t SetVideoProtection(VCMVideoProtection videoProtection, bool enable);
182 
183   int32_t TimeUntilNextProcess();
184   int32_t Process();
185 
186   void RegisterPreDecodeImageCallback(EncodedImageCallback* observer);
187 
188  protected:
189   int32_t Decode(const webrtc::VCMEncodedFrame& frame);
190   int32_t RequestKeyFrame();
191   int32_t RequestSliceLossIndication(const uint64_t pictureID) const;
192   int32_t NackList(uint16_t* nackList, uint16_t* size);
193 
194  private:
195   enum VCMKeyRequestMode {
196     kKeyOnError,    // Normal mode, request key frames on decoder error
197     kKeyOnKeyLoss,  // Request key frames on decoder error and on packet loss
198                     // in key frames.
199     kKeyOnLoss,     // Request key frames on decoder error and on packet loss
200                     // in any frame
201   };
202 
203   Clock* const clock_;
204   scoped_ptr<CriticalSectionWrapper> process_crit_sect_;
205   CriticalSectionWrapper* _receiveCritSect;
206   bool _receiverInited GUARDED_BY(_receiveCritSect);
207   VCMTiming _timing;
208   VCMTiming _dualTiming;
209   VCMReceiver _receiver;
210   VCMReceiver _dualReceiver;
211   VCMDecodedFrameCallback _decodedFrameCallback;
212   VCMDecodedFrameCallback _dualDecodedFrameCallback;
213   VCMFrameTypeCallback* _frameTypeCallback GUARDED_BY(process_crit_sect_);
214   VCMReceiveStatisticsCallback* _receiveStatsCallback
215       GUARDED_BY(process_crit_sect_);
216   VCMDecoderTimingCallback* _decoderTimingCallback
217       GUARDED_BY(process_crit_sect_);
218   VCMPacketRequestCallback* _packetRequestCallback
219       GUARDED_BY(process_crit_sect_);
220   VCMRenderBufferSizeCallback* render_buffer_callback_
221       GUARDED_BY(process_crit_sect_);
222   VCMGenericDecoder* _decoder;
223   VCMGenericDecoder* _dualDecoder;
224 #ifdef DEBUG_DECODER_BIT_STREAM
225   FILE* _bitStreamBeforeDecoder;
226 #endif
227   VCMFrameBuffer _frameFromFile;
228   VCMKeyRequestMode _keyRequestMode;
229   bool _scheduleKeyRequest GUARDED_BY(process_crit_sect_);
230   size_t max_nack_list_size_ GUARDED_BY(process_crit_sect_);
231   EncodedImageCallback* pre_decode_image_callback_ GUARDED_BY(_receiveCritSect);
232 
233   VCMCodecDataBase _codecDataBase;
234   VCMProcessTimer _receiveStatsTimer;
235   VCMProcessTimer _retransmissionTimer;
236   VCMProcessTimer _keyRequestTimer;
237 };
238 
239 }  // namespace vcm
240 }  // namespace webrtc
241 #endif  // WEBRTC_MODULES_VIDEO_CODING_VIDEO_CODING_IMPL_H_
242