Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(60)

Side by Side Diff: webrtc/video/video_encoder.cc

Issue 1328863002: Allow encoders to fall back dynamically to software. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: git cl format Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | webrtc/video/video_encoder_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 case kVideoCodecVP9: 43 case kVideoCodecVP9:
44 return VideoEncoder::kVp9; 44 return VideoEncoder::kVp9;
45 default: 45 default:
46 return VideoEncoder::kUnsupportedCodec; 46 return VideoEncoder::kUnsupportedCodec;
47 } 47 }
48 } 48 }
49 49
50 VideoEncoderSoftwareFallbackWrapper::VideoEncoderSoftwareFallbackWrapper( 50 VideoEncoderSoftwareFallbackWrapper::VideoEncoderSoftwareFallbackWrapper(
51 VideoCodecType codec_type, 51 VideoCodecType codec_type,
52 webrtc::VideoEncoder* encoder) 52 webrtc::VideoEncoder* encoder)
53 : encoder_type_(CodecToEncoderType(codec_type)), 53 : rates_set_(false),
54 channel_parameters_set_(false),
55 encoder_type_(CodecToEncoderType(codec_type)),
54 encoder_(encoder), 56 encoder_(encoder),
55 callback_(nullptr) { 57 callback_(nullptr) {}
58
59 bool VideoEncoderSoftwareFallbackWrapper::InitFallbackEncoder() {
pbos-webrtc 2015/09/09 14:31:02 Should this Release() an initialized encoder_ ?
noahric 2015/10/13 18:08:07 Done. Also added Release() calls to fallback_encod
60 CHECK(encoder_type_ != kUnsupportedCodec)
61 << "Encoder requesting fallback to codec not supported in software.";
62 fallback_encoder_.reset(VideoEncoder::Create(encoder_type_));
63 if (fallback_encoder_->InitEncode(&codec_settings_, number_of_cores_,
64 max_payload_size_) !=
65 WEBRTC_VIDEO_CODEC_OK) {
66 LOG(LS_ERROR) << "Failed to initialize software-encoder fallback.";
67 fallback_encoder_.reset();
68 return false;
69 }
70 // Replay callback, rates, and channel parameters.
71 if (callback_)
72 fallback_encoder_->RegisterEncodeCompleteCallback(callback_);
73 if (rates_set_)
74 fallback_encoder_->SetRates(bitrate_, framerate_);
75 if (channel_parameters_set_)
76 fallback_encoder_->SetChannelParameters(packet_loss_, rtt_);
77 return true;
56 } 78 }
57 79
58 int32_t VideoEncoderSoftwareFallbackWrapper::InitEncode( 80 int32_t VideoEncoderSoftwareFallbackWrapper::InitEncode(
59 const VideoCodec* codec_settings, 81 const VideoCodec* codec_settings,
60 int32_t number_of_cores, 82 int32_t number_of_cores,
61 size_t max_payload_size) { 83 size_t max_payload_size) {
84 // Store settings, in case we need to dynamically switch to the fallback
85 // encoder after a failed Encode call.
86 codec_settings_ = *codec_settings;
87 number_of_cores_ = number_of_cores;
88 max_payload_size_ = max_payload_size;
89 // Clear bitrate/framerate override.
90 rates_set_ = false;
91 channel_parameters_set_ = false;
92
62 int32_t ret = 93 int32_t ret =
63 encoder_->InitEncode(codec_settings, number_of_cores, max_payload_size); 94 encoder_->InitEncode(codec_settings, number_of_cores, max_payload_size);
64 if (ret == WEBRTC_VIDEO_CODEC_OK || encoder_type_ == kUnsupportedCodec) { 95 if (ret == WEBRTC_VIDEO_CODEC_OK || encoder_type_ == kUnsupportedCodec) {
65 fallback_encoder_.reset(); 96 fallback_encoder_.reset();
66 if (callback_) 97 if (callback_)
67 encoder_->RegisterEncodeCompleteCallback(callback_); 98 encoder_->RegisterEncodeCompleteCallback(callback_);
68 return ret; 99 return ret;
69 } 100 }
70 // Try to instantiate software codec. 101 // Try to instantiate software codec.
71 fallback_encoder_.reset(VideoEncoder::Create(encoder_type_)); 102 if (InitFallbackEncoder()) {
72 if (fallback_encoder_->InitEncode(codec_settings, number_of_cores,
73 max_payload_size) ==
74 WEBRTC_VIDEO_CODEC_OK) {
75 if (callback_)
76 fallback_encoder_->RegisterEncodeCompleteCallback(callback_);
77 return WEBRTC_VIDEO_CODEC_OK; 103 return WEBRTC_VIDEO_CODEC_OK;
78 } 104 }
79 // Software encoder failed, reset and use original return code. 105 // Software encoder failed, use original return code.
80 fallback_encoder_.reset();
81 return ret; 106 return ret;
82 } 107 }
83 108
84 int32_t VideoEncoderSoftwareFallbackWrapper::RegisterEncodeCompleteCallback( 109 int32_t VideoEncoderSoftwareFallbackWrapper::RegisterEncodeCompleteCallback(
85 EncodedImageCallback* callback) { 110 EncodedImageCallback* callback) {
86 callback_ = callback; 111 callback_ = callback;
87 int32_t ret = encoder_->RegisterEncodeCompleteCallback(callback); 112 int32_t ret = encoder_->RegisterEncodeCompleteCallback(callback);
88 if (fallback_encoder_) 113 if (fallback_encoder_)
89 return fallback_encoder_->RegisterEncodeCompleteCallback(callback); 114 return fallback_encoder_->RegisterEncodeCompleteCallback(callback);
90 return ret; 115 return ret;
91 } 116 }
92 117
93 int32_t VideoEncoderSoftwareFallbackWrapper::Release() { 118 int32_t VideoEncoderSoftwareFallbackWrapper::Release() {
119 int32_t ret = encoder_->Release();
pbos-webrtc 2015/09/09 14:30:24 Either encoder_ or fallback_encoder_ should be ini
noahric 2015/10/13 18:08:07 I'm worried about two things: 1) encoders not expe
94 if (fallback_encoder_) 120 if (fallback_encoder_)
95 return fallback_encoder_->Release(); 121 return fallback_encoder_->Release();
96 return encoder_->Release(); 122 return ret;
97 } 123 }
98 124
99 int32_t VideoEncoderSoftwareFallbackWrapper::Encode( 125 int32_t VideoEncoderSoftwareFallbackWrapper::Encode(
100 const VideoFrame& frame, 126 const VideoFrame& frame,
101 const CodecSpecificInfo* codec_specific_info, 127 const CodecSpecificInfo* codec_specific_info,
102 const std::vector<VideoFrameType>* frame_types) { 128 const std::vector<VideoFrameType>* frame_types) {
103 if (fallback_encoder_) 129 if (fallback_encoder_)
104 return fallback_encoder_->Encode(frame, codec_specific_info, frame_types); 130 return fallback_encoder_->Encode(frame, codec_specific_info, frame_types);
105 return encoder_->Encode(frame, codec_specific_info, frame_types); 131 int32_t ret = encoder_->Encode(frame, codec_specific_info, frame_types);
132 // If requested, try a software fallback.
133 if (ret == WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE && InitFallbackEncoder()) {
134 // Fallback was successful, so start using it with this frame.
135 return fallback_encoder_->Encode(frame, codec_specific_info, frame_types);
136 }
137 return ret;
106 } 138 }
107 139
108 int32_t VideoEncoderSoftwareFallbackWrapper::SetChannelParameters( 140 int32_t VideoEncoderSoftwareFallbackWrapper::SetChannelParameters(
109 uint32_t packet_loss, 141 uint32_t packet_loss,
110 int64_t rtt) { 142 int64_t rtt) {
143 channel_parameters_set_ = true;
144 packet_loss_ = packet_loss;
145 rtt_ = rtt;
111 int32_t ret = encoder_->SetChannelParameters(packet_loss, rtt); 146 int32_t ret = encoder_->SetChannelParameters(packet_loss, rtt);
112 if (fallback_encoder_) 147 if (fallback_encoder_)
113 return fallback_encoder_->SetChannelParameters(packet_loss, rtt); 148 return fallback_encoder_->SetChannelParameters(packet_loss, rtt);
114 return ret; 149 return ret;
115 } 150 }
116 151
117 int32_t VideoEncoderSoftwareFallbackWrapper::SetRates(uint32_t bitrate, 152 int32_t VideoEncoderSoftwareFallbackWrapper::SetRates(uint32_t bitrate,
118 uint32_t framerate) { 153 uint32_t framerate) {
154 rates_set_ = true;
155 bitrate_ = bitrate;
156 framerate_ = framerate;
119 int32_t ret = encoder_->SetRates(bitrate, framerate); 157 int32_t ret = encoder_->SetRates(bitrate, framerate);
120 if (fallback_encoder_) 158 if (fallback_encoder_)
121 return fallback_encoder_->SetRates(bitrate, framerate); 159 return fallback_encoder_->SetRates(bitrate, framerate);
122 return ret; 160 return ret;
123 } 161 }
124 162
125 void VideoEncoderSoftwareFallbackWrapper::OnDroppedFrame() { 163 void VideoEncoderSoftwareFallbackWrapper::OnDroppedFrame() {
126 if (fallback_encoder_) 164 if (fallback_encoder_)
127 return fallback_encoder_->OnDroppedFrame(); 165 return fallback_encoder_->OnDroppedFrame();
128 return encoder_->OnDroppedFrame(); 166 return encoder_->OnDroppedFrame();
129 } 167 }
130 168
131 bool VideoEncoderSoftwareFallbackWrapper::SupportsNativeHandle() const { 169 bool VideoEncoderSoftwareFallbackWrapper::SupportsNativeHandle() const {
132 if (fallback_encoder_) 170 if (fallback_encoder_)
133 return fallback_encoder_->SupportsNativeHandle(); 171 return fallback_encoder_->SupportsNativeHandle();
134 return encoder_->SupportsNativeHandle(); 172 return encoder_->SupportsNativeHandle();
135 } 173 }
136 174
137 int VideoEncoderSoftwareFallbackWrapper::GetTargetFramerate() { 175 int VideoEncoderSoftwareFallbackWrapper::GetTargetFramerate() {
138 if (fallback_encoder_) 176 if (fallback_encoder_)
139 return fallback_encoder_->GetTargetFramerate(); 177 return fallback_encoder_->GetTargetFramerate();
140 return encoder_->GetTargetFramerate(); 178 return encoder_->GetTargetFramerate();
141 } 179 }
142 180
143 } // namespace webrtc 181 } // namespace webrtc
OLDNEW
« no previous file with comments | « no previous file | webrtc/video/video_encoder_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698