webrtc::VideoDecoder& active_decoder() const;
DecodingMode decoding_mode_ = DecodingMode::kNone;
+ bool expects_keyframe_ = true;
bool hw_decoder_configured_ = false;
std::unique_ptr<VideoDecoder> hw_decoder_;
const webrtc::EncodedImage& input_image,
bool missing_frames,
int64_t render_time_ms) {
+ if (decoding_mode_ == DecodingMode::kNone) {
+ return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
+ }
+
+ if (expects_keyframe_) {
+ if (input_image.FrameType() != webrtc::VideoFrameType::kVideoFrameKey) {
+ return WEBRTC_VIDEO_CODEC_OK_REQUEST_KEYFRAME;
+ }
+ expects_keyframe_ = false;
+ }
+
switch (decoding_mode_) {
case DecodingMode::kNone:
- return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
+ // Already handled above.
+ break;
case DecodingMode::kHardware: {
int32_t ret = WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE;
ret = hw_decoder_->Decode(input_image, missing_frames, render_time_ms);
return ret;
}
decoding_mode_ = DecodingMode::kSoftwareFallback;
+ if (input_image.FrameType() != webrtc::VideoFrameType::kVideoFrameKey) {
+ expects_keyframe_ = true;
+ return WEBRTC_VIDEO_CODEC_OK_REQUEST_KEYFRAME;
+ }
return sw_decoder_->Decode(input_image, missing_frames, render_time_ms);
}
case DecodingMode::kSoftware:
LOG(ERROR) << "Error initializing software decoder";
}
decoding_mode_ = DecodingMode::kSoftware;
+ expects_keyframe_ = true;
}
break;
case suspend_resume::State::RESUMED:
LOG(ERROR) << "Error initializing hardware decoder";
}
decoding_mode_ = DecodingMode::kHardware;
+ expects_keyframe_ = true;
}
break;
}