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

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: Changes according to Stefan's comments. Created 4 years, 2 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
« no previous file with comments | « webrtc/api/android/jni/androidmediaencoder_jni.cc ('k') | webrtc/video_encoder.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/video/video_encoder.cc
diff --git a/webrtc/video/video_encoder.cc b/webrtc/video/video_encoder.cc
index 5d4867f8c069a78e50a72789d4e26c5ced9a43ab..bb6e9e23082ae0b93a6adaefa5bf6dc28f262658 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(IsSupportedSoftware(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,7 +34,24 @@ VideoEncoder* VideoEncoder::Create(VideoEncoder::EncoderType codec_type) {
return nullptr;
}
-VideoEncoder::EncoderType CodecToEncoderType(VideoCodecType codec_type) {
+bool VideoEncoder::IsSupportedSoftware(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 VideoEncoder::CodecToEncoderType(
+ VideoCodecType codec_type) {
switch (codec_type) {
case kVideoCodecH264:
return VideoEncoder::kH264;
@@ -58,8 +74,11 @@ VideoEncoderSoftwareFallbackWrapper::VideoEncoderSoftwareFallbackWrapper(
callback_(nullptr) {}
bool VideoEncoderSoftwareFallbackWrapper::InitFallbackEncoder() {
- RTC_CHECK(encoder_type_ != kUnsupportedCodec)
- << "Encoder requesting fallback to codec not supported in software.";
+ if (!VideoEncoder::IsSupportedSoftware(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 +164,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);
}
« no previous file with comments | « webrtc/api/android/jni/androidmediaencoder_jni.cc ('k') | webrtc/video_encoder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698