Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "base/bind.h" | |
| 5 #include "base/logging.h" | 6 #include "base/logging.h" |
| 6 #include "base/string_number_conversions.h" | 7 #include "base/string_number_conversions.h" |
| 7 #include "base/string_split.h" | 8 #include "base/string_split.h" |
| 8 #include "base/string_util.h" | 9 #include "base/string_util.h" |
| 9 #include "media/filters/adaptive_demuxer.h" | 10 #include "media/filters/adaptive_demuxer.h" |
| 10 | 11 |
| 11 namespace media { | 12 namespace media { |
| 12 | 13 |
| 13 // | 14 // |
| 14 // AdaptiveDemuxerStream | 15 // AdaptiveDemuxerStream |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 184 orig_cb_->Run(); | 185 orig_cb_->Run(); |
| 185 delete this; | 186 delete this; |
| 186 } | 187 } |
| 187 } | 188 } |
| 188 | 189 |
| 189 base::Lock lock_; | 190 base::Lock lock_; |
| 190 int remaining_count_; | 191 int remaining_count_; |
| 191 scoped_ptr<FilterCallback> orig_cb_; | 192 scoped_ptr<FilterCallback> orig_cb_; |
| 192 }; | 193 }; |
| 193 | 194 |
| 195 // Helper class that wraps FilterStatusCB and expects to get called a set | |
|
Ami GONE FROM CHROMIUM
2011/05/12 20:42:16
Sad panda that this has to coexist w/ CountingCall
acolwell GONE FROM CHROMIUM
2011/05/12 22:30:40
Agreed. It won't last too long. Once I convert Sto
| |
| 196 // number of times, after which the wrapped callback is fired. If an error | |
| 197 // is reported in any of the callbacks, only the first error code is passed | |
| 198 // to the wrapped callback. | |
| 199 class CountingStatusCB { | |
| 200 public: | |
| 201 CountingStatusCB(int count, const FilterStatusCB& orig_cb) | |
| 202 : remaining_count_(count), orig_cb_(orig_cb), | |
| 203 overall_status_(PIPELINE_OK) { | |
| 204 DCHECK_GT(remaining_count_, 0); | |
| 205 DCHECK(!orig_cb.is_null()); | |
| 206 } | |
| 207 | |
| 208 FilterStatusCB GetACallback() { | |
| 209 return base::Bind(&CountingStatusCB::OnChildCallbackDone, | |
| 210 base::Unretained(this)); | |
|
Ami GONE FROM CHROMIUM
2011/05/12 20:42:16
I think if you drop the unretained then you can al
acolwell GONE FROM CHROMIUM
2011/05/12 22:30:40
Yes. I had to derive from RefCountedThreadSafe<> t
| |
| 211 } | |
| 212 | |
| 213 private: | |
| 214 void OnChildCallbackDone(PipelineStatus status) { | |
| 215 bool fire_orig_cb = false; | |
| 216 PipelineStatus overall_status = PIPELINE_OK; | |
| 217 | |
| 218 { | |
| 219 base::AutoLock auto_lock(lock_); | |
| 220 | |
| 221 if (overall_status_ == PIPELINE_OK && status != PIPELINE_OK) | |
| 222 overall_status_ = status; | |
| 223 | |
| 224 if (--remaining_count_ == 0) { | |
| 225 fire_orig_cb = true; | |
| 226 overall_status = overall_status_; | |
| 227 } | |
| 228 } | |
| 229 | |
| 230 if (fire_orig_cb) { | |
| 231 orig_cb_.Run(overall_status); | |
| 232 delete this; | |
| 233 } | |
| 234 } | |
| 235 | |
| 236 base::Lock lock_; | |
| 237 int remaining_count_; | |
| 238 FilterStatusCB orig_cb_; | |
| 239 PipelineStatus overall_status_; | |
| 240 }; | |
| 241 | |
| 194 void AdaptiveDemuxer::Stop(FilterCallback* callback) { | 242 void AdaptiveDemuxer::Stop(FilterCallback* callback) { |
| 195 // Stop() must be called on all of the demuxers even though only one demuxer | 243 // Stop() must be called on all of the demuxers even though only one demuxer |
| 196 // is actively delivering audio and another one is delivering video. This | 244 // is actively delivering audio and another one is delivering video. This |
| 197 // just satisfies the contract that all demuxers must have Stop() called on | 245 // just satisfies the contract that all demuxers must have Stop() called on |
| 198 // them before they are destroyed. | 246 // them before they are destroyed. |
| 199 CountingCallback* wrapper = new CountingCallback(demuxers_.size(), callback); | 247 CountingCallback* wrapper = new CountingCallback(demuxers_.size(), callback); |
| 200 for (size_t i = 0; i < demuxers_.size(); ++i) | 248 for (size_t i = 0; i < demuxers_.size(); ++i) |
| 201 demuxers_[i]->Stop(wrapper->GetACallback()); | 249 demuxers_[i]->Stop(wrapper->GetACallback()); |
| 202 } | 250 } |
| 203 | 251 |
| 204 void AdaptiveDemuxer::Seek(base::TimeDelta time, FilterCallback* callback) { | 252 void AdaptiveDemuxer::Seek(base::TimeDelta time, const FilterStatusCB& cb) { |
| 205 Demuxer* audio = current_demuxer(DemuxerStream::AUDIO); | 253 Demuxer* audio = current_demuxer(DemuxerStream::AUDIO); |
| 206 Demuxer* video = current_demuxer(DemuxerStream::VIDEO); | 254 Demuxer* video = current_demuxer(DemuxerStream::VIDEO); |
| 207 int count = (audio ? 1 : 0) + (video && audio != video ? 1 : 0); | 255 int count = (audio ? 1 : 0) + (video && audio != video ? 1 : 0); |
| 208 CountingCallback* wrapper = new CountingCallback(count, callback); | 256 CountingStatusCB* wrapper = new CountingStatusCB(count, cb); |
| 209 if (audio) | 257 if (audio) |
| 210 audio->Seek(time, wrapper->GetACallback()); | 258 audio->Seek(time, wrapper->GetACallback()); |
| 211 if (video && audio != video) | 259 if (video && audio != video) |
| 212 video->Seek(time, wrapper->GetACallback()); | 260 video->Seek(time, wrapper->GetACallback()); |
| 213 } | 261 } |
| 214 | 262 |
| 215 void AdaptiveDemuxer::OnAudioRendererDisabled() { | 263 void AdaptiveDemuxer::OnAudioRendererDisabled() { |
| 216 for (size_t i = 0; i < demuxers_.size(); ++i) | 264 for (size_t i = 0; i < demuxers_.size(); ++i) |
| 217 demuxers_[i]->OnAudioRendererDisabled(); | 265 demuxers_[i]->OnAudioRendererDisabled(); |
| 218 } | 266 } |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 434 delete cb; | 482 delete cb; |
| 435 return; | 483 return; |
| 436 } | 484 } |
| 437 DemuxerAccumulator* accumulator = new DemuxerAccumulator( | 485 DemuxerAccumulator* accumulator = new DemuxerAccumulator( |
| 438 audio_index, video_index, urls.size(), cb); | 486 audio_index, video_index, urls.size(), cb); |
| 439 for (size_t i = 0; i < urls.size(); ++i) | 487 for (size_t i = 0; i < urls.size(); ++i) |
| 440 delegate_factory_->Build(urls[i], accumulator->GetNthCallback(i)); | 488 delegate_factory_->Build(urls[i], accumulator->GetNthCallback(i)); |
| 441 } | 489 } |
| 442 | 490 |
| 443 } // namespace media | 491 } // namespace media |
| OLD | NEW |