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

Unified Diff: webrtc/media/engine/videodecodersoftwarefallbackwrapper.cc

Issue 2690183004: Handle InitDecode and reset in fallback decoder. (Closed)
Patch Set: remove puts from test Created 3 years, 10 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/media/engine/videodecodersoftwarefallbackwrapper.cc
diff --git a/webrtc/media/engine/videodecodersoftwarefallbackwrapper.cc b/webrtc/media/engine/videodecodersoftwarefallbackwrapper.cc
index cd6eef9b6482d82a5a5e1ff92b42980911679779..00f3ea7f3f518fb16b92d66820083cc8d3273a7d 100644
--- a/webrtc/media/engine/videodecodersoftwarefallbackwrapper.cc
+++ b/webrtc/media/engine/videodecodersoftwarefallbackwrapper.cc
@@ -12,6 +12,7 @@
#include <string>
+#include "webrtc/base/checks.h"
#include "webrtc/base/logging.h"
#include "webrtc/media/engine/internaldecoderfactory.h"
#include "webrtc/modules/video_coding/include/video_error_codes.h"
@@ -21,14 +22,30 @@ namespace webrtc {
VideoDecoderSoftwareFallbackWrapper::VideoDecoderSoftwareFallbackWrapper(
VideoCodecType codec_type,
VideoDecoder* decoder)
- : codec_type_(codec_type), decoder_(decoder), callback_(nullptr) {}
+ : codec_type_(codec_type),
+ decoder_(decoder),
+ decoder_initialized_(false),
+ callback_(nullptr) {}
int32_t VideoDecoderSoftwareFallbackWrapper::InitDecode(
const VideoCodec* codec_settings,
int32_t number_of_cores) {
+ RTC_DCHECK(!fallback_decoder_) << "Fallback decoder should never be "
+ "initialized here, it should've been "
+ "released.";
codec_settings_ = *codec_settings;
number_of_cores_ = number_of_cores;
- return decoder_->InitDecode(codec_settings, number_of_cores);
+ int32_t ret = decoder_->InitDecode(codec_settings, number_of_cores);
+ if (ret != WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE) {
+ decoder_initialized_ = (ret == WEBRTC_VIDEO_CODEC_OK);
+ return ret;
+ }
+ decoder_initialized_ = false;
+
+ // Try to initialize fallback decoder.
+ if (InitFallbackDecoder())
+ return WEBRTC_VIDEO_CODEC_OK;
+ return ret;
}
bool VideoDecoderSoftwareFallbackWrapper::InitFallbackDecoder() {
@@ -58,14 +75,25 @@ int32_t VideoDecoderSoftwareFallbackWrapper::Decode(
const RTPFragmentationHeader* fragmentation,
const CodecSpecificInfo* codec_specific_info,
int64_t render_time_ms) {
- // Try decoding with the provided decoder on every keyframe or when there's no
- // fallback decoder. This is the normal case.
+ // Try initializing and decoding with the provided decoder on every keyframe
+ // or when there's no fallback decoder. This is the normal case.
if (!fallback_decoder_ || input_image._frameType == kVideoFrameKey) {
- int32_t ret = decoder_->Decode(input_image, missing_frames, fragmentation,
- codec_specific_info, render_time_ms);
+ int32_t ret = WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE;
+ // Try reinitializing the decoder if it had failed before.
+ if (!decoder_initialized_) {
+ decoder_initialized_ =
+ decoder_->InitDecode(&codec_settings_, number_of_cores_) ==
+ WEBRTC_VIDEO_CODEC_OK;
+ }
+ if (decoder_initialized_) {
+ ret = decoder_->Decode(input_image, missing_frames, fragmentation,
+ codec_specific_info, render_time_ms);
+ }
if (ret == WEBRTC_VIDEO_CODEC_OK) {
if (fallback_decoder_) {
// Decode OK -> stop using fallback decoder.
+ LOG(LS_INFO)
+ << "Decode OK, no longer using the software fallback decoder.";
fallback_decoder_->Release();
fallback_decoder_.reset();
return WEBRTC_VIDEO_CODEC_OK;
@@ -93,8 +121,12 @@ int32_t VideoDecoderSoftwareFallbackWrapper::RegisterDecodeCompleteCallback(
}
int32_t VideoDecoderSoftwareFallbackWrapper::Release() {
- if (fallback_decoder_)
+ if (fallback_decoder_) {
+ LOG(LS_INFO) << "Releasing software fallback decoder.";
fallback_decoder_->Release();
+ fallback_decoder_.reset();
+ }
+ decoder_initialized_ = false;
return decoder_->Release();
}

Powered by Google App Engine
This is Rietveld 408576698