Index: chromecast/media/cma/pipeline/media_pipeline_impl.cc |
diff --git a/chromecast/media/cma/pipeline/media_pipeline_impl.cc b/chromecast/media/cma/pipeline/media_pipeline_impl.cc |
index c9d0e288c76479a9604ef9e5c689fe7a440fe2c3..3feb62526150465f5a42bf821e4aad6ff68bd69f 100644 |
--- a/chromecast/media/cma/pipeline/media_pipeline_impl.cc |
+++ b/chromecast/media/cma/pipeline/media_pipeline_impl.cc |
@@ -66,6 +66,16 @@ MediaPipelineImpl::MediaPipelineImpl() |
MediaPipelineImpl::~MediaPipelineImpl() { |
CMALOG(kLogControl) << __FUNCTION__; |
DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ weak_factory_.InvalidateWeakPtrs(); |
+ |
+ // Since av pipeline still need to access device components in their |
+ // destructor, it's important to delete them first. |
+ video_pipeline_.reset(); |
+ audio_pipeline_.reset(); |
+ media_pipeline_backend_.reset(); |
+ if (!client_.pipeline_backend_destroyed_cb.is_null()) |
+ client_.pipeline_backend_destroyed_cb.Run(); |
} |
void MediaPipelineImpl::Initialize( |
@@ -75,6 +85,8 @@ void MediaPipelineImpl::Initialize( |
DCHECK(thread_checker_.CalledOnValidThread()); |
media_pipeline_backend_.reset(media_pipeline_backend.release()); |
clock_device_ = media_pipeline_backend_->GetClock(); |
+ if (!client_.pipeline_backend_created_cb.is_null()) |
+ client_.pipeline_backend_created_cb.Run(); |
if (load_type == kLoadTypeURL || load_type == kLoadTypeMediaSource) { |
base::TimeDelta low_threshold(kLowBufferThresholdURL); |
@@ -102,6 +114,8 @@ void MediaPipelineImpl::SetClient(const MediaPipelineClient& client) { |
DCHECK(!client.error_cb.is_null()); |
DCHECK(!client.time_update_cb.is_null()); |
DCHECK(!client.buffering_state_cb.is_null()); |
+ DCHECK(!client.pipeline_backend_created_cb.is_null()); |
+ DCHECK(!client.pipeline_backend_destroyed_cb.is_null()); |
client_ = client; |
} |