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

Unified Diff: webrtc/video/video_encoder.cc

Issue 2263043003: Make MediaCodecEncoder fallback to a software encoder on failure. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Return WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE immediately. Created 4 years, 4 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 side-by-side diff with in-line comments
Download patch
Index: webrtc/video/video_encoder.cc
diff --git a/webrtc/video/video_encoder.cc b/webrtc/video/video_encoder.cc
index 1534a97fdf486bc1c36b672590c9bf896f40c117..d2733e1fd2358ec5f690ec6782f64233ee53de25 100644
--- a/webrtc/video/video_encoder.cc
+++ b/webrtc/video/video_encoder.cc
@@ -18,14 +18,13 @@
namespace webrtc {
VideoEncoder* VideoEncoder::Create(VideoEncoder::EncoderType codec_type) {
+ RTC_DCHECK(IsSupported(codec_type));
switch (codec_type) {
case kH264:
- RTC_DCHECK(H264Encoder::IsSupported());
return H264Encoder::Create();
case kVp8:
return VP8Encoder::Create();
case kVp9:
- RTC_DCHECK(VP9Encoder::IsSupported());
return VP9Encoder::Create();
case kUnsupportedCodec:
RTC_NOTREACHED();
@@ -35,6 +34,22 @@ VideoEncoder* VideoEncoder::Create(VideoEncoder::EncoderType codec_type) {
return nullptr;
}
+bool VideoEncoder::IsSupported(EncoderType codec_type) {
+ switch (codec_type) {
+ case kH264:
+ return H264Encoder::IsSupported();
+ case kVp8:
+ return true;
+ case kVp9:
+ return VP9Encoder::IsSupported();
+ case kUnsupportedCodec:
+ RTC_NOTREACHED();
+ return false;
+ }
+ RTC_NOTREACHED();
+ return false;
+}
+
VideoEncoder::EncoderType CodecToEncoderType(VideoCodecType codec_type) {
switch (codec_type) {
case kVideoCodecH264:
@@ -58,8 +73,11 @@ VideoEncoderSoftwareFallbackWrapper::VideoEncoderSoftwareFallbackWrapper(
callback_(nullptr) {}
bool VideoEncoderSoftwareFallbackWrapper::InitFallbackEncoder() {
- RTC_CHECK(encoder_type_ != kUnsupportedCodec)
- << "Encoder requesting fallback to codec not supported in software.";
+ if (!VideoEncoder::IsSupported(encoder_type_)) {
+ LOG(LS_WARNING)
+ << "Encoder requesting fallback to codec not supported in software.";
+ return false;
+ }
fallback_encoder_.reset(VideoEncoder::Create(encoder_type_));
if (fallback_encoder_->InitEncode(&codec_settings_, number_of_cores_,
max_payload_size_) !=
@@ -145,6 +163,13 @@ int32_t VideoEncoderSoftwareFallbackWrapper::Encode(
int32_t ret = encoder_->Encode(frame, codec_specific_info, frame_types);
// If requested, try a software fallback.
if (ret == WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE && InitFallbackEncoder()) {
+ if (frame.video_frame_buffer()->native_handle() &&
+ !fallback_encoder_->SupportsNativeHandle()) {
+ LOG(LS_WARNING) << "Fallback encoder doesn't support native frames, "
+ << "dropping one frame.";
+ return WEBRTC_VIDEO_CODEC_ERROR;
+ }
+
// Fallback was successful, so start using it with this frame.
return fallback_encoder_->Encode(frame, codec_specific_info, frame_types);
}

Powered by Google App Engine
This is Rietveld 408576698