Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(156)

Side by Side Diff: content/renderer/media/android/media_source_delegate.cc

Issue 605013002: Refactor MediaSourceDelegate destruction. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@mp4_stream_parser_hack
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/media/android/media_source_delegate.h" 5 #include "content/renderer/media/android/media_source_delegate.h"
6 6
7 #include <limits> 7 #include <limits>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 DCHECK(main_task_runner_->BelongsToCurrentThread()); 74 DCHECK(main_task_runner_->BelongsToCurrentThread());
75 DVLOG(1) << __FUNCTION__ << " : " << demuxer_client_id_; 75 DVLOG(1) << __FUNCTION__ << " : " << demuxer_client_id_;
76 DCHECK(!chunk_demuxer_); 76 DCHECK(!chunk_demuxer_);
77 DCHECK(!demuxer_client_); 77 DCHECK(!demuxer_client_);
78 DCHECK(!audio_decrypting_demuxer_stream_); 78 DCHECK(!audio_decrypting_demuxer_stream_);
79 DCHECK(!video_decrypting_demuxer_stream_); 79 DCHECK(!video_decrypting_demuxer_stream_);
80 DCHECK(!audio_stream_); 80 DCHECK(!audio_stream_);
81 DCHECK(!video_stream_); 81 DCHECK(!video_stream_);
82 } 82 }
83 83
84 void MediaSourceDelegate::Destroy() { 84 void MediaSourceDelegate::Stop(const base::Closure& stop_cb) {
85 DCHECK(main_task_runner_->BelongsToCurrentThread()); 85 DCHECK(main_task_runner_->BelongsToCurrentThread());
86 DVLOG(1) << __FUNCTION__ << " : " << demuxer_client_id_; 86 DVLOG(1) << __FUNCTION__ << " : " << demuxer_client_id_;
87 87
88 if (!chunk_demuxer_) { 88 if (!chunk_demuxer_) {
89 DCHECK(!demuxer_client_); 89 DCHECK(!demuxer_client_);
90 delete this;
91 return; 90 return;
92 } 91 }
93 92
94 duration_change_cb_.Reset(); 93 duration_change_cb_.Reset();
95 update_network_state_cb_.Reset(); 94 update_network_state_cb_.Reset();
96 media_source_opened_cb_.Reset(); 95 media_source_opened_cb_.Reset();
97 96
98 main_weak_factory_.InvalidateWeakPtrs(); 97 main_weak_factory_.InvalidateWeakPtrs();
99 DCHECK(!main_weak_factory_.HasWeakPtrs()); 98 DCHECK(!main_weak_factory_.HasWeakPtrs());
100 99
101 chunk_demuxer_->Shutdown(); 100 chunk_demuxer_->Shutdown();
102 101
103 // |this| will be transferred to the callback StopDemuxer() and 102 // Continue to stop objects on the media thread.
104 // OnDemuxerStopDone(). They own |this| and OnDemuxerStopDone() will delete 103 media_task_runner_->PostTask(
105 // it when called, hence using base::Unretained(this) is safe here. 104 FROM_HERE,
106 media_task_runner_->PostTask(FROM_HERE, 105 base::Bind(
107 base::Bind(&MediaSourceDelegate::StopDemuxer, 106 &MediaSourceDelegate::StopDemuxer, base::Unretained(this), stop_cb));
108 base::Unretained(this)));
109 } 107 }
110 108
111 bool MediaSourceDelegate::IsVideoEncrypted() { 109 bool MediaSourceDelegate::IsVideoEncrypted() {
112 DCHECK(main_task_runner_->BelongsToCurrentThread()); 110 DCHECK(main_task_runner_->BelongsToCurrentThread());
113 base::AutoLock auto_lock(is_video_encrypted_lock_); 111 base::AutoLock auto_lock(is_video_encrypted_lock_);
114 return is_video_encrypted_; 112 return is_video_encrypted_;
115 } 113 }
116 114
117 base::Time MediaSourceDelegate::GetTimelineOffset() const { 115 base::Time MediaSourceDelegate::GetTimelineOffset() const {
118 DCHECK(main_task_runner_->BelongsToCurrentThread()); 116 DCHECK(main_task_runner_->BelongsToCurrentThread());
119 if (!chunk_demuxer_) 117 if (!chunk_demuxer_)
120 return base::Time(); 118 return base::Time();
121 119
122 return chunk_demuxer_->GetTimelineOffset(); 120 return chunk_demuxer_->GetTimelineOffset();
123 } 121 }
124 122
125 void MediaSourceDelegate::StopDemuxer() { 123 void MediaSourceDelegate::StopDemuxer(const base::Closure& stop_cb) {
124 DVLOG(2) << __FUNCTION__;
126 DCHECK(media_task_runner_->BelongsToCurrentThread()); 125 DCHECK(media_task_runner_->BelongsToCurrentThread());
127 DCHECK(chunk_demuxer_); 126 DCHECK(chunk_demuxer_);
128 127
129 demuxer_client_->RemoveDelegate(demuxer_client_id_); 128 demuxer_client_->RemoveDelegate(demuxer_client_id_);
130 demuxer_client_ = NULL; 129 demuxer_client_ = NULL;
131 130
132 audio_stream_ = NULL; 131 audio_stream_ = NULL;
133 video_stream_ = NULL; 132 video_stream_ = NULL;
134 // TODO(xhwang): Figure out if we need to Reset the DDSs after Seeking or 133 // TODO(xhwang): Figure out if we need to Reset the DDSs after Seeking or
135 // before destroying them. 134 // before destroying them.
136 audio_decrypting_demuxer_stream_.reset(); 135 audio_decrypting_demuxer_stream_.reset();
137 video_decrypting_demuxer_stream_.reset(); 136 video_decrypting_demuxer_stream_.reset();
138 137
139 media_weak_factory_.InvalidateWeakPtrs(); 138 media_weak_factory_.InvalidateWeakPtrs();
140 DCHECK(!media_weak_factory_.HasWeakPtrs()); 139 DCHECK(!media_weak_factory_.HasWeakPtrs());
141 140
142 chunk_demuxer_->Stop(); 141 chunk_demuxer_->Stop();
143 chunk_demuxer_.reset(); 142 chunk_demuxer_.reset();
144 143
145 // The callback DeleteSelf() owns |this| and will delete it when called. 144 stop_cb.Run();
146 // Hence using base::Unretained(this) is safe here.
147 media_task_runner_->PostTask(
148 FROM_HERE,
149 base::Bind(&MediaSourceDelegate::DeleteSelf, base::Unretained(this)));
150 } 145 }
scherkus (not reviewing) 2014/09/26 00:45:18 perhaps add comment here that |this| may be destro
xhwang 2014/09/26 19:26:59 Done.
151 146
152 void MediaSourceDelegate::InitializeMediaSource( 147 void MediaSourceDelegate::InitializeMediaSource(
153 const MediaSourceOpenedCB& media_source_opened_cb, 148 const MediaSourceOpenedCB& media_source_opened_cb,
154 const media::Demuxer::NeedKeyCB& need_key_cb, 149 const media::Demuxer::NeedKeyCB& need_key_cb,
155 const media::SetDecryptorReadyCB& set_decryptor_ready_cb, 150 const media::SetDecryptorReadyCB& set_decryptor_ready_cb,
156 const UpdateNetworkStateCB& update_network_state_cb, 151 const UpdateNetworkStateCB& update_network_state_cb,
157 const DurationChangeCB& duration_change_cb) { 152 const DurationChangeCB& duration_change_cb) {
158 DCHECK(main_task_runner_->BelongsToCurrentThread()); 153 DCHECK(main_task_runner_->BelongsToCurrentThread());
159 DCHECK(!media_source_opened_cb.is_null()); 154 DCHECK(!media_source_opened_cb.is_null());
160 media_source_opened_cb_ = media_source_opened_cb; 155 media_source_opened_cb_ = media_source_opened_cb;
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after
623 DCHECK(media_task_runner_->BelongsToCurrentThread()); 618 DCHECK(media_task_runner_->BelongsToCurrentThread());
624 DVLOG(1) << __FUNCTION__ << " : " << demuxer_client_id_; 619 DVLOG(1) << __FUNCTION__ << " : " << demuxer_client_id_;
625 620
626 base::AutoLock auto_lock(seeking_lock_); 621 base::AutoLock auto_lock(seeking_lock_);
627 DCHECK(seeking_); 622 DCHECK(seeking_);
628 seeking_ = false; 623 seeking_ = false;
629 doing_browser_seek_ = false; 624 doing_browser_seek_ = false;
630 demuxer_client_->DemuxerSeekDone(demuxer_client_id_, browser_seek_time_); 625 demuxer_client_->DemuxerSeekDone(demuxer_client_id_, browser_seek_time_);
631 } 626 }
632 627
633 void MediaSourceDelegate::DeleteSelf() {
634 DCHECK(main_task_runner_->BelongsToCurrentThread());
635 DVLOG(1) << __FUNCTION__ << " : " << demuxer_client_id_;
636 delete this;
637 }
638
639 void MediaSourceDelegate::NotifyDemuxerReady() { 628 void MediaSourceDelegate::NotifyDemuxerReady() {
640 DCHECK(media_task_runner_->BelongsToCurrentThread()); 629 DCHECK(media_task_runner_->BelongsToCurrentThread());
641 DVLOG(1) << __FUNCTION__ << " : " << demuxer_client_id_; 630 DVLOG(1) << __FUNCTION__ << " : " << demuxer_client_id_;
642 DCHECK(is_demuxer_ready_); 631 DCHECK(is_demuxer_ready_);
643 632
644 scoped_ptr<DemuxerConfigs> configs(new DemuxerConfigs()); 633 scoped_ptr<DemuxerConfigs> configs(new DemuxerConfigs());
645 GetDemuxerConfigFromStream(configs.get(), true); 634 GetDemuxerConfigFromStream(configs.get(), true);
646 GetDemuxerConfigFromStream(configs.get(), false); 635 GetDemuxerConfigFromStream(configs.get(), false);
647 configs->duration = GetDuration(); 636 configs->duration = GetDuration();
648 637
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
751 configs->video_size = config.natural_size(); 740 configs->video_size = config.natural_size();
752 configs->is_video_encrypted = config.is_encrypted(); 741 configs->is_video_encrypted = config.is_encrypted();
753 configs->video_extra_data = std::vector<uint8>( 742 configs->video_extra_data = std::vector<uint8>(
754 config.extra_data(), config.extra_data() + config.extra_data_size()); 743 config.extra_data(), config.extra_data() + config.extra_data_size());
755 return true; 744 return true;
756 } 745 }
757 return false; 746 return false;
758 } 747 }
759 748
760 } // namespace content 749 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698