blob: 1b6a893cb24084c699669eb231a3dad41d4dcace [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
mflodman@webrtc.orgc80d9d92012-02-06 10:11:25 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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
pbos@webrtc.orga4407322013-07-16 12:32:05 +000011#include "webrtc/common_types.h"
12#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
Henrik Kjellander2557b862015-11-18 22:00:21 +010013#include "webrtc/modules/video_coding/include/video_codec_interface.h"
14#include "webrtc/modules/video_coding/encoded_frame.h"
15#include "webrtc/modules/video_coding/jitter_buffer.h"
16#include "webrtc/modules/video_coding/packet.h"
17#include "webrtc/modules/video_coding/video_coding_impl.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010018#include "webrtc/system_wrappers/include/clock.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000019
agalusza@google.coma7e360e2013-08-01 03:15:08 +000020namespace webrtc {
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +000021namespace vcm {
niklase@google.com470e71d2011-07-07 08:21:25 +000022
pkasting@chromium.org0b1534c2014-12-15 22:09:40 +000023int64_t
agalusza@google.coma7e360e2013-08-01 03:15:08 +000024VCMProcessTimer::Period() const {
niklase@google.com470e71d2011-07-07 08:21:25 +000025 return _periodMs;
26}
27
pkasting@chromium.org0b1534c2014-12-15 22:09:40 +000028int64_t
agalusza@google.coma7e360e2013-08-01 03:15:08 +000029VCMProcessTimer::TimeUntilProcess() const {
pkasting@chromium.org0b1534c2014-12-15 22:09:40 +000030 const int64_t time_since_process = _clock->TimeInMilliseconds() - _latestMs;
31 const int64_t time_until_process = _periodMs - time_since_process;
32 return std::max<int64_t>(time_until_process, 0);
niklase@google.com470e71d2011-07-07 08:21:25 +000033}
34
35void
agalusza@google.coma7e360e2013-08-01 03:15:08 +000036VCMProcessTimer::Processed() {
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +000037 _latestMs = _clock->TimeInMilliseconds();
niklase@google.com470e71d2011-07-07 08:21:25 +000038}
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +000039} // namespace vcm
niklase@google.com470e71d2011-07-07 08:21:25 +000040
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +000041namespace {
andresp@webrtc.org1df9dc32014-01-09 08:01:57 +000042// This wrapper provides a way to modify the callback without the need to expose
43// a register method all the way down to the function calling it.
44class EncodedImageCallbackWrapper : public EncodedImageCallback {
45 public:
46 EncodedImageCallbackWrapper()
47 : cs_(CriticalSectionWrapper::CreateCriticalSection()), callback_(NULL) {}
48
49 virtual ~EncodedImageCallbackWrapper() {}
50
51 void Register(EncodedImageCallback* callback) {
52 CriticalSectionScoped cs(cs_.get());
53 callback_ = callback;
54 }
55
56 // TODO(andresp): Change to void as return value is ignored.
pbos@webrtc.org273a4142014-12-01 15:23:21 +000057 virtual int32_t Encoded(const EncodedImage& encoded_image,
andresp@webrtc.org1df9dc32014-01-09 08:01:57 +000058 const CodecSpecificInfo* codec_specific_info,
59 const RTPFragmentationHeader* fragmentation) {
60 CriticalSectionScoped cs(cs_.get());
61 if (callback_)
62 return callback_->Encoded(
63 encoded_image, codec_specific_info, fragmentation);
64 return 0;
65 }
66
67 private:
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +000068 rtc::scoped_ptr<CriticalSectionWrapper> cs_;
andresp@webrtc.org1df9dc32014-01-09 08:01:57 +000069 EncodedImageCallback* callback_ GUARDED_BY(cs_);
70};
71
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +000072class VideoCodingModuleImpl : public VideoCodingModule {
73 public:
stefan@webrtc.org34c5da62014-04-11 14:08:35 +000074 VideoCodingModuleImpl(Clock* clock,
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +000075 EventFactory* event_factory,
pbos@webrtc.org891d4832015-02-26 13:15:22 +000076 bool owns_event_factory,
mflodmanfcf54bd2015-04-14 21:28:08 +020077 VideoEncoderRateObserver* encoder_rate_observer,
78 VCMQMSettingsCallback* qm_settings_callback)
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +000079 : VideoCodingModule(),
pbos0fa9b222015-11-13 05:59:57 -080080 sender_(clock,
81 &post_encode_callback_,
82 encoder_rate_observer,
83 qm_settings_callback),
84 receiver_(clock, event_factory),
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +000085 own_event_factory_(owns_event_factory ? event_factory : NULL) {}
86
87 virtual ~VideoCodingModuleImpl() {
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +000088 own_event_factory_.reset();
89 }
90
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000091 int64_t TimeUntilNextProcess() override {
pbos0fa9b222015-11-13 05:59:57 -080092 int64_t sender_time = sender_.TimeUntilNextProcess();
93 int64_t receiver_time = receiver_.TimeUntilNextProcess();
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +000094 assert(sender_time >= 0);
95 assert(receiver_time >= 0);
96 return VCM_MIN(sender_time, receiver_time);
97 }
98
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000099 int32_t Process() override {
pbos0fa9b222015-11-13 05:59:57 -0800100 int32_t sender_return = sender_.Process();
101 int32_t receiver_return = receiver_.Process();
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000102 if (sender_return != VCM_OK)
103 return sender_return;
104 return receiver_return;
105 }
106
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000107 int32_t RegisterSendCodec(const VideoCodec* sendCodec,
108 uint32_t numberOfCores,
109 uint32_t maxPayloadSize) override {
pbos0fa9b222015-11-13 05:59:57 -0800110 return sender_.RegisterSendCodec(sendCodec, numberOfCores, maxPayloadSize);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000111 }
112
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000113 const VideoCodec& GetSendCodec() const override {
pbos0fa9b222015-11-13 05:59:57 -0800114 return sender_.GetSendCodec();
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000115 }
116
tommi@webrtc.orge07710c2015-02-19 17:43:25 +0000117 // DEPRECATED.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000118 int32_t SendCodec(VideoCodec* currentSendCodec) const override {
pbos0fa9b222015-11-13 05:59:57 -0800119 return sender_.SendCodecBlocking(currentSendCodec);
tommi@webrtc.orge07710c2015-02-19 17:43:25 +0000120 }
121
122 // DEPRECATED.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000123 VideoCodecType SendCodec() const override {
pbos0fa9b222015-11-13 05:59:57 -0800124 return sender_.SendCodecBlocking();
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000125 }
126
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000127 int32_t RegisterExternalEncoder(VideoEncoder* externalEncoder,
128 uint8_t payloadType,
129 bool internalSource) override {
pbos0fa9b222015-11-13 05:59:57 -0800130 return sender_.RegisterExternalEncoder(externalEncoder, payloadType,
131 internalSource);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000132 }
133
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000134 int Bitrate(unsigned int* bitrate) const override {
pbos0fa9b222015-11-13 05:59:57 -0800135 return sender_.Bitrate(bitrate);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000136 }
137
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000138 int FrameRate(unsigned int* framerate) const override {
pbos0fa9b222015-11-13 05:59:57 -0800139 return sender_.FrameRate(framerate);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000140 }
141
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000142 int32_t SetChannelParameters(uint32_t target_bitrate, // bits/s.
143 uint8_t lossRate,
144 int64_t rtt) override {
pbos0fa9b222015-11-13 05:59:57 -0800145 return sender_.SetChannelParameters(target_bitrate, lossRate, rtt);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000146 }
147
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000148 int32_t RegisterTransportCallback(
149 VCMPacketizationCallback* transport) override {
pbos0fa9b222015-11-13 05:59:57 -0800150 return sender_.RegisterTransportCallback(transport);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000151 }
152
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000153 int32_t RegisterSendStatisticsCallback(
154 VCMSendStatisticsCallback* sendStats) override {
pbos0fa9b222015-11-13 05:59:57 -0800155 return sender_.RegisterSendStatisticsCallback(sendStats);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000156 }
157
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000158 int32_t RegisterProtectionCallback(
159 VCMProtectionCallback* protection) override {
pbos0fa9b222015-11-13 05:59:57 -0800160 return sender_.RegisterProtectionCallback(protection);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000161 }
162
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000163 int32_t SetVideoProtection(VCMVideoProtection videoProtection,
164 bool enable) override {
pbosba8c15b2015-07-14 09:36:34 -0700165 // TODO(pbos): Remove enable from receive-side protection modes as well.
166 if (enable)
pbos0fa9b222015-11-13 05:59:57 -0800167 sender_.SetVideoProtection(videoProtection);
168 return receiver_.SetVideoProtection(videoProtection, enable);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000169 }
170
Miguel Casas-Sanchez47650702015-05-29 17:21:40 -0700171 int32_t AddVideoFrame(const VideoFrame& videoFrame,
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000172 const VideoContentMetrics* contentMetrics,
173 const CodecSpecificInfo* codecSpecificInfo) override {
pbos0fa9b222015-11-13 05:59:57 -0800174 return sender_.AddVideoFrame(videoFrame, contentMetrics, codecSpecificInfo);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000175 }
176
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000177 int32_t IntraFrameRequest(int stream_index) override {
pbos0fa9b222015-11-13 05:59:57 -0800178 return sender_.IntraFrameRequest(stream_index);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000179 }
180
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000181 int32_t EnableFrameDropper(bool enable) override {
pbos0fa9b222015-11-13 05:59:57 -0800182 return sender_.EnableFrameDropper(enable);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000183 }
184
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000185 void SuspendBelowMinBitrate() override {
pbos0fa9b222015-11-13 05:59:57 -0800186 return sender_.SuspendBelowMinBitrate();
henrik.lundin@webrtc.org572699d2013-09-30 12:16:08 +0000187 }
188
pbos0fa9b222015-11-13 05:59:57 -0800189 bool VideoSuspended() const override { return sender_.VideoSuspended(); }
henrik.lundin@webrtc.org572699d2013-09-30 12:16:08 +0000190
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000191 int32_t RegisterReceiveCodec(const VideoCodec* receiveCodec,
192 int32_t numberOfCores,
193 bool requireKeyFrame) override {
pbos0fa9b222015-11-13 05:59:57 -0800194 return receiver_.RegisterReceiveCodec(receiveCodec, numberOfCores,
195 requireKeyFrame);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000196 }
197
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000198 int32_t RegisterExternalDecoder(VideoDecoder* externalDecoder,
199 uint8_t payloadType,
200 bool internalRenderTiming) override {
pbos0fa9b222015-11-13 05:59:57 -0800201 return receiver_.RegisterExternalDecoder(externalDecoder, payloadType,
202 internalRenderTiming);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000203 }
204
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000205 int32_t RegisterReceiveCallback(
206 VCMReceiveCallback* receiveCallback) override {
pbos0fa9b222015-11-13 05:59:57 -0800207 return receiver_.RegisterReceiveCallback(receiveCallback);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000208 }
209
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000210 int32_t RegisterReceiveStatisticsCallback(
211 VCMReceiveStatisticsCallback* receiveStats) override {
pbos0fa9b222015-11-13 05:59:57 -0800212 return receiver_.RegisterReceiveStatisticsCallback(receiveStats);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000213 }
214
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000215 int32_t RegisterDecoderTimingCallback(
216 VCMDecoderTimingCallback* decoderTiming) override {
pbos0fa9b222015-11-13 05:59:57 -0800217 return receiver_.RegisterDecoderTimingCallback(decoderTiming);
fischman@webrtc.org37bb4972013-10-23 23:59:45 +0000218 }
219
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000220 int32_t RegisterFrameTypeCallback(
221 VCMFrameTypeCallback* frameTypeCallback) override {
pbos0fa9b222015-11-13 05:59:57 -0800222 return receiver_.RegisterFrameTypeCallback(frameTypeCallback);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000223 }
224
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000225 int32_t RegisterPacketRequestCallback(
226 VCMPacketRequestCallback* callback) override {
pbos0fa9b222015-11-13 05:59:57 -0800227 return receiver_.RegisterPacketRequestCallback(callback);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000228 }
229
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000230 int RegisterRenderBufferSizeCallback(
231 VCMRenderBufferSizeCallback* callback) override {
pbos0fa9b222015-11-13 05:59:57 -0800232 return receiver_.RegisterRenderBufferSizeCallback(callback);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000233 }
234
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000235 int32_t Decode(uint16_t maxWaitTimeMs) override {
pbos0fa9b222015-11-13 05:59:57 -0800236 return receiver_.Decode(maxWaitTimeMs);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000237 }
238
pbos0fa9b222015-11-13 05:59:57 -0800239 int32_t ResetDecoder() override { return receiver_.ResetDecoder(); }
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000240
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000241 int32_t ReceiveCodec(VideoCodec* currentReceiveCodec) const override {
pbos0fa9b222015-11-13 05:59:57 -0800242 return receiver_.ReceiveCodec(currentReceiveCodec);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000243 }
244
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000245 VideoCodecType ReceiveCodec() const override {
pbos0fa9b222015-11-13 05:59:57 -0800246 return receiver_.ReceiveCodec();
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000247 }
248
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000249 int32_t IncomingPacket(const uint8_t* incomingPayload,
250 size_t payloadLength,
251 const WebRtcRTPHeader& rtpInfo) override {
pbos0fa9b222015-11-13 05:59:57 -0800252 return receiver_.IncomingPacket(incomingPayload, payloadLength, rtpInfo);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000253 }
254
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000255 int32_t SetMinimumPlayoutDelay(uint32_t minPlayoutDelayMs) override {
pbos0fa9b222015-11-13 05:59:57 -0800256 return receiver_.SetMinimumPlayoutDelay(minPlayoutDelayMs);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000257 }
258
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000259 int32_t SetRenderDelay(uint32_t timeMS) override {
pbos0fa9b222015-11-13 05:59:57 -0800260 return receiver_.SetRenderDelay(timeMS);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000261 }
262
pbos0fa9b222015-11-13 05:59:57 -0800263 int32_t Delay() const override { return receiver_.Delay(); }
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000264
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000265 uint32_t DiscardedPackets() const override {
pbos0fa9b222015-11-13 05:59:57 -0800266 return receiver_.DiscardedPackets();
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000267 }
268
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000269 int SetReceiverRobustnessMode(ReceiverRobustness robustnessMode,
270 VCMDecodeErrorMode errorMode) override {
pbos0fa9b222015-11-13 05:59:57 -0800271 return receiver_.SetReceiverRobustnessMode(robustnessMode, errorMode);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000272 }
273
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000274 void SetNackSettings(size_t max_nack_list_size,
275 int max_packet_age_to_nack,
276 int max_incomplete_time_ms) override {
pbos0fa9b222015-11-13 05:59:57 -0800277 return receiver_.SetNackSettings(max_nack_list_size, max_packet_age_to_nack,
278 max_incomplete_time_ms);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000279 }
280
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000281 void SetDecodeErrorMode(VCMDecodeErrorMode decode_error_mode) override {
pbos0fa9b222015-11-13 05:59:57 -0800282 return receiver_.SetDecodeErrorMode(decode_error_mode);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000283 }
284
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000285 int SetMinReceiverDelay(int desired_delay_ms) override {
pbos0fa9b222015-11-13 05:59:57 -0800286 return receiver_.SetMinReceiverDelay(desired_delay_ms);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000287 }
288
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000289 int32_t SetReceiveChannelParameters(int64_t rtt) override {
pbos0fa9b222015-11-13 05:59:57 -0800290 return receiver_.SetReceiveChannelParameters(rtt);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000291 }
292
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000293 void RegisterPreDecodeImageCallback(EncodedImageCallback* observer) override {
pbos0fa9b222015-11-13 05:59:57 -0800294 receiver_.RegisterPreDecodeImageCallback(observer);
sprang@webrtc.org40709352013-11-26 11:41:59 +0000295 }
296
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000297 void RegisterPostEncodeImageCallback(
298 EncodedImageCallback* observer) override {
andresp@webrtc.org1df9dc32014-01-09 08:01:57 +0000299 post_encode_callback_.Register(observer);
sprang@webrtc.org40709352013-11-26 11:41:59 +0000300 }
301
pbos0fa9b222015-11-13 05:59:57 -0800302 void TriggerDecoderShutdown() override { receiver_.TriggerDecoderShutdown(); }
pbos@webrtc.org4dd40d62015-02-17 13:22:43 +0000303
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000304 private:
andresp@webrtc.org1df9dc32014-01-09 08:01:57 +0000305 EncodedImageCallbackWrapper post_encode_callback_;
pbos0fa9b222015-11-13 05:59:57 -0800306 vcm::VideoSender sender_;
307 vcm::VideoReceiver receiver_;
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +0000308 rtc::scoped_ptr<EventFactory> own_event_factory_;
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000309};
310} // namespace
311
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000312int32_t VideoCodingModule::Codec(VideoCodecType codecType, VideoCodec* codec) {
Peter Boström92f8dbd2015-11-24 13:55:55 +0100313 VCMCodecDataBase::Codec(codecType, codec);
314 return 0;
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000315}
316
pbos@webrtc.org891d4832015-02-26 13:15:22 +0000317VideoCodingModule* VideoCodingModule::Create(
mflodmanfcf54bd2015-04-14 21:28:08 +0200318 Clock* clock,
319 VideoEncoderRateObserver* encoder_rate_observer,
320 VCMQMSettingsCallback* qm_settings_callback) {
321 return new VideoCodingModuleImpl(clock, new EventFactoryImpl, true,
322 encoder_rate_observer, qm_settings_callback);
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000323}
324
pbos@webrtc.org891d4832015-02-26 13:15:22 +0000325VideoCodingModule* VideoCodingModule::Create(
326 Clock* clock,
327 EventFactory* event_factory) {
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000328 assert(clock);
329 assert(event_factory);
mflodmanfcf54bd2015-04-14 21:28:08 +0200330 return new VideoCodingModuleImpl(clock, event_factory, false, nullptr,
331 nullptr);
niklase@google.com470e71d2011-07-07 08:21:25 +0000332}
333
andresp@webrtc.orgf7eb75b2013-09-14 00:25:28 +0000334void VideoCodingModule::Destroy(VideoCodingModule* module) {
335 if (module != NULL) {
336 delete static_cast<VideoCodingModuleImpl*>(module);
stefan@webrtc.org439be292012-02-16 14:45:37 +0000337 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000338}
stefan@webrtc.org791eec72011-10-11 07:53:43 +0000339} // namespace webrtc