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