Index: media/base/android/media_codec_decoder.cc |
diff --git a/media/base/android/media_codec_decoder.cc b/media/base/android/media_codec_decoder.cc |
index 5c9931f1c2b7021a92efce0d5ab5e95b146cd468..89aa87db5b03b1e08325b2bfbd017f2054e8de2a 100644 |
--- a/media/base/android/media_codec_decoder.cc |
+++ b/media/base/android/media_codec_decoder.cc |
@@ -40,6 +40,7 @@ MediaCodecDecoder::MediaCodecDecoder( |
const char* decoder_thread_name) |
: media_task_runner_(media_task_runner), |
decoder_thread_(decoder_thread_name), |
+ needs_reconfigure_(false), |
external_request_data_cb_(external_request_data_cb), |
starvation_cb_(starvation_cb), |
stop_done_cb_(stop_done_cb), |
@@ -82,6 +83,9 @@ void MediaCodecDecoder::ReleaseDecoderResources() { |
DVLOG(1) << class_name() << "::" << __FUNCTION__; |
+ // Set [kInEmergencyStop| state to block already posted ProcessNextFrame(). |
+ SetState(kInEmergencyStop); |
+ |
decoder_thread_.Stop(); // synchronous |
state_ = kStopped; |
media_codec_bridge_.reset(); |
@@ -186,6 +190,16 @@ MediaCodecDecoder::ConfigStatus MediaCodecDecoder::Configure() { |
// Here I assume that OnDemuxerConfigsAvailable won't come |
// in the middle of demuxer data. |
+ if (needs_reconfigure_) { |
+ DVLOG(1) << class_name() << "::" << __FUNCTION__ |
+ << ": needs reconfigure, deleting MediaCodec"; |
+ needs_reconfigure_ = false; |
+ media_codec_bridge_.reset(); |
+ |
+ // Shall we move |delayed_buffers_| from VideoDecoder to Decoder class? |
+ ClearDelayedBuffers(); |
+ } |
+ |
MediaCodecDecoder::ConfigStatus result; |
if (media_codec_bridge_) { |
DVLOG(1) << class_name() << "::" << __FUNCTION__ |
@@ -269,6 +283,9 @@ void MediaCodecDecoder::SyncStop() { |
// After this method returns, decoder thread will not be running. |
+ // Set [kInEmergencyStop| state to block already posted ProcessNextFrame(). |
+ SetState(kInEmergencyStop); |
+ |
decoder_thread_.Stop(); // synchronous |
state_ = kStopped; |
@@ -333,10 +350,10 @@ void MediaCodecDecoder::OnDemuxerDataAvailable(const DemuxerData& data) { |
: (aborted_data ? " skipped as aborted" : ""); |
for (const auto& unit : data.access_units) |
- DVLOG(1) << class_name() << "::" << __FUNCTION__ << explain_if_skipped |
+ DVLOG(2) << class_name() << "::" << __FUNCTION__ << explain_if_skipped |
<< " au: " << unit; |
for (const auto& configs : data.demuxer_configs) |
- DVLOG(1) << class_name() << "::" << __FUNCTION__ << " configs: " << configs; |
+ DVLOG(2) << class_name() << "::" << __FUNCTION__ << " configs: " << configs; |
#endif |
if (!is_incoming_data_invalid_ && !aborted_data) |
@@ -637,7 +654,7 @@ MediaCodecDecoder::DecoderState MediaCodecDecoder::GetState() const { |
} |
void MediaCodecDecoder::SetState(DecoderState state) { |
- DVLOG(1) << class_name() << "::" << __FUNCTION__ << " " << state; |
+ DVLOG(1) << class_name() << "::" << __FUNCTION__ << " " << AsString(state); |
base::AutoLock lock(state_lock_); |
state_ = state; |
@@ -655,6 +672,7 @@ const char* MediaCodecDecoder::AsString(DecoderState state) { |
RETURN_STRING(kPrefetched); |
RETURN_STRING(kRunning); |
RETURN_STRING(kStopping); |
+ RETURN_STRING(kInEmergencyStop); |
RETURN_STRING(kError); |
default: |
return "Unknown DecoderState"; |