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 #include "media/engine/encoder_simulcast_proxy.h"
12
13 #include "api/video_codecs/video_encoder.h"
14 #include "media/engine/simulcast_encoder_adapter.h"
15 #include "modules/video_coding/include/video_error_codes.h"
16
17 namespace webrtc {
18
EncoderSimulcastProxy(VideoEncoderFactory * factory,const SdpVideoFormat & format)19 EncoderSimulcastProxy::EncoderSimulcastProxy(VideoEncoderFactory* factory,
20 const SdpVideoFormat& format)
21 : factory_(factory), video_format_(format), callback_(nullptr) {
22 encoder_ = factory_->CreateVideoEncoder(format);
23 }
24
25 EncoderSimulcastProxy::~EncoderSimulcastProxy() = default;
26
Release()27 int EncoderSimulcastProxy::Release() {
28 return encoder_->Release();
29 }
30
SetFecControllerOverride(FecControllerOverride * fec_controller_override)31 void EncoderSimulcastProxy::SetFecControllerOverride(
32 FecControllerOverride* fec_controller_override) {
33 encoder_->SetFecControllerOverride(fec_controller_override);
34 }
35
36 // TODO(eladalon): s/inst/codec_settings/g.
InitEncode(const VideoCodec * inst,const VideoEncoder::Settings & settings)37 int EncoderSimulcastProxy::InitEncode(const VideoCodec* inst,
38 const VideoEncoder::Settings& settings) {
39 int ret = encoder_->InitEncode(inst, settings);
40 if (ret == WEBRTC_VIDEO_CODEC_ERR_SIMULCAST_PARAMETERS_NOT_SUPPORTED) {
41 encoder_.reset(new SimulcastEncoderAdapter(factory_, video_format_));
42 if (callback_) {
43 encoder_->RegisterEncodeCompleteCallback(callback_);
44 }
45 ret = encoder_->InitEncode(inst, settings);
46 }
47 return ret;
48 }
49
Encode(const VideoFrame & input_image,const std::vector<VideoFrameType> * frame_types)50 int EncoderSimulcastProxy::Encode(
51 const VideoFrame& input_image,
52 const std::vector<VideoFrameType>* frame_types) {
53 return encoder_->Encode(input_image, frame_types);
54 }
55
RegisterEncodeCompleteCallback(EncodedImageCallback * callback)56 int EncoderSimulcastProxy::RegisterEncodeCompleteCallback(
57 EncodedImageCallback* callback) {
58 callback_ = callback;
59 return encoder_->RegisterEncodeCompleteCallback(callback);
60 }
61
SetRates(const RateControlParameters & parameters)62 void EncoderSimulcastProxy::SetRates(const RateControlParameters& parameters) {
63 encoder_->SetRates(parameters);
64 }
65
OnPacketLossRateUpdate(float packet_loss_rate)66 void EncoderSimulcastProxy::OnPacketLossRateUpdate(float packet_loss_rate) {
67 encoder_->OnPacketLossRateUpdate(packet_loss_rate);
68 }
69
OnRttUpdate(int64_t rtt_ms)70 void EncoderSimulcastProxy::OnRttUpdate(int64_t rtt_ms) {
71 encoder_->OnRttUpdate(rtt_ms);
72 }
73
OnLossNotification(const LossNotification & loss_notification)74 void EncoderSimulcastProxy::OnLossNotification(
75 const LossNotification& loss_notification) {
76 encoder_->OnLossNotification(loss_notification);
77 }
78
GetEncoderInfo() const79 VideoEncoder::EncoderInfo EncoderSimulcastProxy::GetEncoderInfo() const {
80 return encoder_->GetEncoderInfo();
81 }
82
83 } // namespace webrtc
84