2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
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.
11 #include "webrtc/common_types.h"
12 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
13 #include "webrtc/modules/video_coding/codecs/interface/video_codec_interface.h"
14 #include "webrtc/modules/video_coding/main/source/encoded_frame.h"
15 #include "webrtc/modules/video_coding/main/source/jitter_buffer.h"
16 #include "webrtc/modules/video_coding/main/source/packet.h"
17 #include "webrtc/modules/video_coding/main/source/video_coding_impl.h"
18 #include "webrtc/system_wrappers/interface/clock.h"
19 #include "webrtc/system_wrappers/interface/trace_event.h"
25 VCMProcessTimer::Period() const {
30 VCMProcessTimer::TimeUntilProcess() const {
31 const int64_t time_since_process = _clock->TimeInMilliseconds() -
32 static_cast<int64_t>(_latestMs);
33 const int64_t time_until_process = static_cast<int64_t>(_periodMs) -
35 if (time_until_process < 0)
37 return time_until_process;
41 VCMProcessTimer::Processed() {
42 _latestMs = _clock->TimeInMilliseconds();
47 // This wrapper provides a way to modify the callback without the need to expose
48 // a register method all the way down to the function calling it.
49 class EncodedImageCallbackWrapper : public EncodedImageCallback {
51 EncodedImageCallbackWrapper()
52 : cs_(CriticalSectionWrapper::CreateCriticalSection()), callback_(NULL) {}
54 virtual ~EncodedImageCallbackWrapper() {}
56 void Register(EncodedImageCallback* callback) {
57 CriticalSectionScoped cs(cs_.get());
61 // TODO(andresp): Change to void as return value is ignored.
62 virtual int32_t Encoded(EncodedImage& encoded_image,
63 const CodecSpecificInfo* codec_specific_info,
64 const RTPFragmentationHeader* fragmentation) {
65 CriticalSectionScoped cs(cs_.get());
67 return callback_->Encoded(
68 encoded_image, codec_specific_info, fragmentation);
73 scoped_ptr<CriticalSectionWrapper> cs_;
74 EncodedImageCallback* callback_ GUARDED_BY(cs_);
77 class VideoCodingModuleImpl : public VideoCodingModule {
79 VideoCodingModuleImpl(Clock* clock,
80 EventFactory* event_factory,
81 bool owns_event_factory)
82 : VideoCodingModule(),
83 sender_(new vcm::VideoSender(clock, &post_encode_callback_)),
84 receiver_(new vcm::VideoReceiver(clock, event_factory)),
85 own_event_factory_(owns_event_factory ? event_factory : NULL) {}
87 virtual ~VideoCodingModuleImpl() {
90 own_event_factory_.reset();
93 virtual int32_t TimeUntilNextProcess() OVERRIDE {
94 int32_t sender_time = sender_->TimeUntilNextProcess();
95 int32_t receiver_time = receiver_->TimeUntilNextProcess();
96 assert(sender_time >= 0);
97 assert(receiver_time >= 0);
98 return VCM_MIN(sender_time, receiver_time);
101 virtual int32_t Process() OVERRIDE {
102 int32_t sender_return = sender_->Process();
103 int32_t receiver_return = receiver_->Process();
104 if (sender_return != VCM_OK)
105 return sender_return;
106 return receiver_return;
109 virtual int32_t InitializeSender() OVERRIDE {
110 return sender_->InitializeSender();
113 virtual int32_t RegisterSendCodec(const VideoCodec* sendCodec,
114 uint32_t numberOfCores,
115 uint32_t maxPayloadSize) OVERRIDE {
116 return sender_->RegisterSendCodec(sendCodec, numberOfCores, maxPayloadSize);
119 virtual int32_t SendCodec(VideoCodec* currentSendCodec) const OVERRIDE {
120 return sender_->SendCodec(currentSendCodec);
123 virtual VideoCodecType SendCodec() const OVERRIDE {
124 return sender_->SendCodec();
127 virtual int32_t RegisterExternalEncoder(VideoEncoder* externalEncoder,
129 bool internalSource) OVERRIDE {
130 return sender_->RegisterExternalEncoder(
131 externalEncoder, payloadType, internalSource);
134 virtual int32_t CodecConfigParameters(uint8_t* buffer, int32_t size)
136 return sender_->CodecConfigParameters(buffer, size);
139 virtual int Bitrate(unsigned int* bitrate) const OVERRIDE {
140 return sender_->Bitrate(bitrate);
143 virtual int FrameRate(unsigned int* framerate) const OVERRIDE {
144 return sender_->FrameRate(framerate);
147 virtual int32_t SetChannelParameters(uint32_t target_bitrate, // bits/s.
149 uint32_t rtt) OVERRIDE {
150 return sender_->SetChannelParameters(target_bitrate, lossRate, rtt);
153 virtual int32_t RegisterTransportCallback(VCMPacketizationCallback* transport)
155 return sender_->RegisterTransportCallback(transport);
158 virtual int32_t RegisterSendStatisticsCallback(
159 VCMSendStatisticsCallback* sendStats) OVERRIDE {
160 return sender_->RegisterSendStatisticsCallback(sendStats);
163 virtual int32_t RegisterVideoQMCallback(
164 VCMQMSettingsCallback* videoQMSettings) OVERRIDE {
165 return sender_->RegisterVideoQMCallback(videoQMSettings);
168 virtual int32_t RegisterProtectionCallback(VCMProtectionCallback* protection)
170 return sender_->RegisterProtectionCallback(protection);
173 virtual int32_t SetVideoProtection(VCMVideoProtection videoProtection,
174 bool enable) OVERRIDE {
175 int32_t sender_return =
176 sender_->SetVideoProtection(videoProtection, enable);
177 int32_t receiver_return =
178 receiver_->SetVideoProtection(videoProtection, enable);
179 if (sender_return == VCM_OK)
180 return receiver_return;
181 return sender_return;
184 virtual int32_t AddVideoFrame(const I420VideoFrame& videoFrame,
185 const VideoContentMetrics* contentMetrics,
186 const CodecSpecificInfo* codecSpecificInfo)
188 return sender_->AddVideoFrame(
189 videoFrame, contentMetrics, codecSpecificInfo);
192 virtual int32_t IntraFrameRequest(int stream_index) OVERRIDE {
193 return sender_->IntraFrameRequest(stream_index);
196 virtual int32_t EnableFrameDropper(bool enable) OVERRIDE {
197 return sender_->EnableFrameDropper(enable);
200 virtual int32_t SentFrameCount(VCMFrameCount& frameCount) const OVERRIDE {
201 return sender_->SentFrameCount(&frameCount);
204 virtual int SetSenderNackMode(SenderNackMode mode) OVERRIDE {
205 return sender_->SetSenderNackMode(mode);
208 virtual int SetSenderReferenceSelection(bool enable) OVERRIDE {
209 return sender_->SetSenderReferenceSelection(enable);
212 virtual int SetSenderFEC(bool enable) OVERRIDE {
213 return sender_->SetSenderFEC(enable);
216 virtual int SetSenderKeyFramePeriod(int periodMs) OVERRIDE {
217 return sender_->SetSenderKeyFramePeriod(periodMs);
220 virtual int StartDebugRecording(const char* file_name_utf8) OVERRIDE {
221 return sender_->StartDebugRecording(file_name_utf8);
224 virtual int StopDebugRecording() OVERRIDE {
225 sender_->StopDebugRecording();
229 virtual void SuspendBelowMinBitrate() {
230 return sender_->SuspendBelowMinBitrate();
233 virtual bool VideoSuspended() const {
234 return sender_->VideoSuspended();
237 virtual int32_t InitializeReceiver() OVERRIDE {
238 return receiver_->InitializeReceiver();
241 virtual int32_t RegisterReceiveCodec(const VideoCodec* receiveCodec,
242 int32_t numberOfCores,
243 bool requireKeyFrame) OVERRIDE {
244 return receiver_->RegisterReceiveCodec(
245 receiveCodec, numberOfCores, requireKeyFrame);
248 virtual int32_t RegisterExternalDecoder(VideoDecoder* externalDecoder,
250 bool internalRenderTiming) OVERRIDE {
251 return receiver_->RegisterExternalDecoder(
252 externalDecoder, payloadType, internalRenderTiming);
255 virtual int32_t RegisterReceiveCallback(VCMReceiveCallback* receiveCallback)
257 return receiver_->RegisterReceiveCallback(receiveCallback);
260 virtual int32_t RegisterReceiveStatisticsCallback(
261 VCMReceiveStatisticsCallback* receiveStats) OVERRIDE {
262 return receiver_->RegisterReceiveStatisticsCallback(receiveStats);
265 virtual int32_t RegisterDecoderTimingCallback(
266 VCMDecoderTimingCallback* decoderTiming) OVERRIDE {
267 return receiver_->RegisterDecoderTimingCallback(decoderTiming);
270 virtual int32_t RegisterFrameTypeCallback(
271 VCMFrameTypeCallback* frameTypeCallback) OVERRIDE {
272 return receiver_->RegisterFrameTypeCallback(frameTypeCallback);
275 virtual int32_t RegisterPacketRequestCallback(
276 VCMPacketRequestCallback* callback) OVERRIDE {
277 return receiver_->RegisterPacketRequestCallback(callback);
280 virtual int RegisterRenderBufferSizeCallback(
281 VCMRenderBufferSizeCallback* callback) OVERRIDE {
282 return receiver_->RegisterRenderBufferSizeCallback(callback);
285 virtual int32_t Decode(uint16_t maxWaitTimeMs) OVERRIDE {
286 return receiver_->Decode(maxWaitTimeMs);
289 virtual int32_t DecodeDualFrame(uint16_t maxWaitTimeMs) OVERRIDE {
290 return receiver_->DecodeDualFrame(maxWaitTimeMs);
293 virtual int32_t ResetDecoder() OVERRIDE { return receiver_->ResetDecoder(); }
295 virtual int32_t ReceiveCodec(VideoCodec* currentReceiveCodec) const {
296 return receiver_->ReceiveCodec(currentReceiveCodec);
299 virtual VideoCodecType ReceiveCodec() const OVERRIDE {
300 return receiver_->ReceiveCodec();
303 virtual int32_t IncomingPacket(const uint8_t* incomingPayload,
304 uint32_t payloadLength,
305 const WebRtcRTPHeader& rtpInfo) OVERRIDE {
306 return receiver_->IncomingPacket(incomingPayload, payloadLength, rtpInfo);
309 virtual int32_t SetMinimumPlayoutDelay(uint32_t minPlayoutDelayMs) OVERRIDE {
310 return receiver_->SetMinimumPlayoutDelay(minPlayoutDelayMs);
313 virtual int32_t SetRenderDelay(uint32_t timeMS) OVERRIDE {
314 return receiver_->SetRenderDelay(timeMS);
317 virtual int32_t Delay() const OVERRIDE { return receiver_->Delay(); }
319 virtual int32_t ReceivedFrameCount(VCMFrameCount& frameCount) const OVERRIDE {
320 return receiver_->ReceivedFrameCount(&frameCount);
323 virtual uint32_t DiscardedPackets() const OVERRIDE {
324 return receiver_->DiscardedPackets();
327 virtual int SetReceiverRobustnessMode(ReceiverRobustness robustnessMode,
328 VCMDecodeErrorMode errorMode) OVERRIDE {
329 return receiver_->SetReceiverRobustnessMode(robustnessMode, errorMode);
332 virtual void SetNackSettings(size_t max_nack_list_size,
333 int max_packet_age_to_nack,
334 int max_incomplete_time_ms) OVERRIDE {
335 return receiver_->SetNackSettings(
336 max_nack_list_size, max_packet_age_to_nack, max_incomplete_time_ms);
339 void SetDecodeErrorMode(VCMDecodeErrorMode decode_error_mode) OVERRIDE {
340 return receiver_->SetDecodeErrorMode(decode_error_mode);
343 virtual int SetMinReceiverDelay(int desired_delay_ms) OVERRIDE {
344 return receiver_->SetMinReceiverDelay(desired_delay_ms);
347 virtual int32_t SetReceiveChannelParameters(uint32_t rtt) OVERRIDE {
348 return receiver_->SetReceiveChannelParameters(rtt);
351 virtual void RegisterPreDecodeImageCallback(
352 EncodedImageCallback* observer) OVERRIDE {
353 receiver_->RegisterPreDecodeImageCallback(observer);
356 virtual void RegisterPostEncodeImageCallback(
357 EncodedImageCallback* observer) OVERRIDE {
358 post_encode_callback_.Register(observer);
362 EncodedImageCallbackWrapper post_encode_callback_;
363 scoped_ptr<vcm::VideoSender> sender_;
364 scoped_ptr<vcm::VideoReceiver> receiver_;
365 scoped_ptr<EventFactory> own_event_factory_;
369 uint8_t VideoCodingModule::NumberOfCodecs() {
370 return VCMCodecDataBase::NumberOfCodecs();
373 int32_t VideoCodingModule::Codec(uint8_t listId, VideoCodec* codec) {
375 return VCM_PARAMETER_ERROR;
377 return VCMCodecDataBase::Codec(listId, codec) ? 0 : -1;
380 int32_t VideoCodingModule::Codec(VideoCodecType codecType, VideoCodec* codec) {
382 return VCM_PARAMETER_ERROR;
384 return VCMCodecDataBase::Codec(codecType, codec) ? 0 : -1;
387 VideoCodingModule* VideoCodingModule::Create() {
388 return new VideoCodingModuleImpl(
389 Clock::GetRealTimeClock(), new EventFactoryImpl, true);
392 VideoCodingModule* VideoCodingModule::Create(Clock* clock,
393 EventFactory* event_factory) {
395 assert(event_factory);
396 return new VideoCodingModuleImpl(clock, event_factory, false);
399 void VideoCodingModule::Destroy(VideoCodingModule* module) {
400 if (module != NULL) {
401 delete static_cast<VideoCodingModuleImpl*>(module);
404 } // namespace webrtc