private:
bool InitHwDecoder();
- bool InitSwDecoder(bool is_fallback);
+ bool InitSwDecoder();
webrtc::VideoDecoder& active_decoder() const;
webrtc::DecodedImageCallback* callback_;
size_t hw_consequtive_generic_errors_;
+ suspend_resume::State last_state_;
+
mojo::Receiver<suspend_resume::mojom::SuspendResumeObserver> receiver_{this};
};
mojo::Remote<suspend_resume::mojom::SuspendResumeManager>(
std::move(pending_manager))
->AddObserver(receiver_.BindNewPipeAndPassRemote(), &state);
+ last_state_ = state.value_or(suspend_resume::State::SUSPENDED);
}
bool SwitchableVideoDecoderWrapper::Configure(
return true;
}
- return InitHwDecoder() || InitSwDecoder(true);
+ switch (last_state_) {
+ case suspend_resume::State::SUSPENDED:
+ break;
+ case suspend_resume::State::PARTIAL:
+ if (!InitSwDecoder()) {
+ return false;
+ }
+ decoding_mode_ = DecodingMode::kSoftware;
+ break;
+ case suspend_resume::State::RESUMED:
+ if (InitHwDecoder()) {
+ decoding_mode_ = DecodingMode::kHardware;
+ } else {
+ hw_decoder_->Release();
+ if (InitSwDecoder()) {
+ decoding_mode_ = DecodingMode::kSoftwareFallback;
+ } else {
+ return false;
+ }
+ }
+ break;
+ }
+ return true;
}
int32_t SwitchableVideoDecoderWrapper::Decode(
// HW decoder returned WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE or
// too many generic errors on key-frames encountered.
- if (!InitSwDecoder(true)) {
+ hw_decoder_->Release();
+ if (!InitSwDecoder()) {
return ret;
}
+ decoding_mode_ = DecodingMode::kSoftwareFallback;
return sw_decoder_->Decode(input_image, missing_frames, render_time_ms);
}
case DecodingMode::kSoftware:
break;
case suspend_resume::State::PARTIAL:
if (decoding_mode_ == DecodingMode::kHardware) {
- if (!InitSwDecoder(false)) {
+ if (!InitSwDecoder()) {
LOG(ERROR) << "Error initializing software decoder";
}
+ decoding_mode_ = DecodingMode::kSoftware;
}
break;
case suspend_resume::State::RESUMED:
if (decoding_mode_ == DecodingMode::kSoftware) {
+ if (!InitHwDecoder()) {
+ LOG(ERROR) << "Error initializing hardware decoder";
+ }
decoding_mode_ = DecodingMode::kHardware;
}
break;
}
hw_decoder_configured_ = true;
- decoding_mode_ = DecodingMode::kHardware;
if (callback_) {
hw_decoder_->RegisterDecodeCompleteCallback(callback_);
}
return true;
}
-bool SwitchableVideoDecoderWrapper::InitSwDecoder(bool is_fallback) {
+bool SwitchableVideoDecoderWrapper::InitSwDecoder() {
LOG(INFO) << "Initialize software decoder";
if (!sw_decoder_configured_ && !sw_decoder_->Configure(decoder_settings_)) {
return false;
}
sw_decoder_configured_ = true;
- if (is_fallback) {
- hw_decoder_->Release();
- decoding_mode_ = DecodingMode::kSoftwareFallback;
- } else {
- decoding_mode_ = DecodingMode::kSoftware;
- }
-
if (callback_) {
sw_decoder_->RegisterDecodeCompleteCallback(callback_);
}