Index: media/gpu/android_video_decode_accelerator.cc |
diff --git a/media/gpu/android_video_decode_accelerator.cc b/media/gpu/android_video_decode_accelerator.cc |
index 5b8c856701c5645cd6324720a9d1086ba9b0532c..0a3e80833caa228133350c22fc65b464601144a3 100644 |
--- a/media/gpu/android_video_decode_accelerator.cc |
+++ b/media/gpu/android_video_decode_accelerator.cc |
@@ -109,6 +109,12 @@ static inline const base::TimeDelta ErrorPostingDelay() { |
return base::TimeDelta::FromSeconds(2); |
} |
+// Time allowed to elapse between codec configuration completion and the first |
+// Decode() callback. Unless a site is intentionally stalling after providing |
+// initialization information, this timeout should never be hit. |
+constexpr base::TimeDelta kNoDecodeIdleTimeout = |
+ base::TimeDelta::FromSeconds(1); |
+ |
// For RecordFormatChangedMetric. |
enum FormatChangedValue { |
CodecInitialized = false, |
@@ -963,6 +969,7 @@ void AndroidVideoDecodeAccelerator::SendDecodedFrameToClient( |
void AndroidVideoDecodeAccelerator::Decode( |
const BitstreamBuffer& bitstream_buffer) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
+ no_decode_timeout_.Stop(); |
// If we previously deferred a codec restart, take care of it now. This can |
// happen on older devices where configuration changes require a codec reset. |
@@ -1202,7 +1209,8 @@ void AndroidVideoDecodeAccelerator::OnCodecConfigured( |
} |
state_ = NO_ERROR; |
- |
+ no_decode_timeout_.Start(FROM_HERE, kNoDecodeIdleTimeout, this, |
+ &AndroidVideoDecodeAccelerator::CloseIdleCodec); |
ManageTimer(true); |
} |
@@ -1311,7 +1319,7 @@ void AndroidVideoDecodeAccelerator::ResetCodecState() { |
// Prior to JB-MR2, flush() had several bugs (b/8125974, b/8347958) so we must |
// delete the MediaCodec and create a new one. The full reconfigure is much |
// slower and may cause visible freezing if done mid-stream. |
- if (!did_codec_error_happen && |
+ if (!did_codec_error_happen && media_codec_ && |
base::android::BuildInfo::GetInstance()->sdk_int() >= 18) { |
DVLOG(3) << __FUNCTION__ << " Flushing MediaCodec."; |
media_codec_->Flush(); |
@@ -1671,6 +1679,8 @@ void AndroidVideoDecodeAccelerator::ReleaseMediaCodec() { |
if (!media_codec_) |
return; |
+ no_decode_timeout_.Stop(); |
+ |
// If codec construction is broken, then we can't release this codec if it's |
// backed by hardware, else it may hang too. Post it to the construction |
// thread, and it'll get freed if things start working. If things are |
@@ -1786,4 +1796,12 @@ bool AndroidVideoDecodeAccelerator::IsMediaCodecSoftwareDecodingForbidden() |
codec_config_->codec_ == media::kCodecVP9); |
} |
+void AndroidVideoDecodeAccelerator::CloseIdleCodec() { |
+ if (!media_codec_) |
+ return; |
+ |
+ ReleaseMediaCodec(); |
+ codec_needs_reset_ = true; |
watk
2016/07/13 22:38:25
Do we need to call strategy_->CodecChanged(nullptr
liberato (no reviews please)
2016/07/14 15:33:57
i don't think that we do, since no decode has been
|
+} |
+ |
} // namespace media |