Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |