| 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 "media/base/text_renderer.h" | 5 #include "media/base/text_renderer.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/callback_helpers.h" | 8 #include "base/callback_helpers.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
| 11 #include "base/stl_util.h" | 11 #include "base/stl_util.h" |
| 12 #include "media/base/bind_to_current_loop.h" | 12 #include "media/base/bind_to_current_loop.h" |
| 13 #include "media/base/decoder_buffer.h" | 13 #include "media/base/decoder_buffer.h" |
| 14 #include "media/base/demuxer.h" | 14 #include "media/base/demuxer.h" |
| 15 #include "media/base/demuxer_stream.h" | 15 #include "media/base/demuxer_stream.h" |
| 16 #include "media/base/text_cue.h" | 16 #include "media/base/text_cue.h" |
| 17 | 17 |
| 18 namespace media { | 18 namespace media { |
| 19 | 19 |
| 20 TextRenderer::TextRenderer( | 20 TextRenderer::TextRenderer( |
| 21 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | 21 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
| 22 const AddTextTrackCB& add_text_track_cb) | 22 const AddTextTrackCB& add_text_track_cb) |
| 23 : task_runner_(task_runner), | 23 : task_runner_(task_runner), |
| 24 weak_factory_(this), | |
| 25 add_text_track_cb_(add_text_track_cb), | 24 add_text_track_cb_(add_text_track_cb), |
| 26 state_(kUninitialized), | 25 state_(kUninitialized), |
| 27 pending_read_count_(0) { | 26 pending_read_count_(0), |
| 28 } | 27 weak_factory_(this) {} |
| 29 | 28 |
| 30 TextRenderer::~TextRenderer() { | 29 TextRenderer::~TextRenderer() { |
| 31 DCHECK(state_ == kUninitialized || | 30 DCHECK(state_ == kUninitialized || |
| 32 state_ == kStopped) << "state_ " << state_; | 31 state_ == kStopped) << "state_ " << state_; |
| 33 DCHECK_EQ(pending_read_count_, 0); | 32 DCHECK_EQ(pending_read_count_, 0); |
| 34 STLDeleteValues(&text_track_state_map_); | 33 STLDeleteValues(&text_track_state_map_); |
| 35 } | 34 } |
| 36 | 35 |
| 37 void TextRenderer::Initialize(const base::Closure& ended_cb) { | 36 void TextRenderer::Initialize(const base::Closure& ended_cb) { |
| 38 DCHECK(task_runner_->BelongsToCurrentThread()); | 37 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 39 DCHECK(!ended_cb.is_null()); | 38 DCHECK(!ended_cb.is_null()); |
| 40 DCHECK_EQ(kUninitialized, state_) << "state_ " << state_; | 39 DCHECK_EQ(kUninitialized, state_) << "state_ " << state_; |
| 41 DCHECK(text_track_state_map_.empty()); | 40 DCHECK(text_track_state_map_.empty()); |
| 42 DCHECK_EQ(pending_read_count_, 0); | 41 DCHECK_EQ(pending_read_count_, 0); |
| 43 DCHECK(pending_eos_set_.empty()); | 42 DCHECK(pending_eos_set_.empty()); |
| 44 DCHECK(ended_cb_.is_null()); | 43 DCHECK(ended_cb_.is_null()); |
| 45 | 44 |
| 46 weak_this_ = weak_factory_.GetWeakPtr(); | |
| 47 ended_cb_ = ended_cb; | 45 ended_cb_ = ended_cb; |
| 48 state_ = kPaused; | 46 state_ = kPaused; |
| 49 } | 47 } |
| 50 | 48 |
| 51 void TextRenderer::Play(const base::Closure& callback) { | 49 void TextRenderer::Play(const base::Closure& callback) { |
| 52 DCHECK(task_runner_->BelongsToCurrentThread()); | 50 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 53 DCHECK_EQ(state_, kPaused) << "state_ " << state_; | 51 DCHECK_EQ(state_, kPaused) << "state_ " << state_; |
| 54 | 52 |
| 55 for (TextTrackStateMap::iterator itr = text_track_state_map_.begin(); | 53 for (TextTrackStateMap::iterator itr = text_track_state_map_.begin(); |
| 56 itr != text_track_state_map_.end(); ++itr) { | 54 itr != text_track_state_map_.end(); ++itr) { |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 const TextTrackConfig& config) { | 118 const TextTrackConfig& config) { |
| 121 DCHECK(task_runner_->BelongsToCurrentThread()); | 119 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 122 DCHECK(state_ != kUninitialized) << "state_ " << state_; | 120 DCHECK(state_ != kUninitialized) << "state_ " << state_; |
| 123 DCHECK_NE(state_, kStopPending); | 121 DCHECK_NE(state_, kStopPending); |
| 124 DCHECK_NE(state_, kStopped); | 122 DCHECK_NE(state_, kStopped); |
| 125 DCHECK(text_track_state_map_.find(text_stream) == | 123 DCHECK(text_track_state_map_.find(text_stream) == |
| 126 text_track_state_map_.end()); | 124 text_track_state_map_.end()); |
| 127 DCHECK(pending_eos_set_.find(text_stream) == | 125 DCHECK(pending_eos_set_.find(text_stream) == |
| 128 pending_eos_set_.end()); | 126 pending_eos_set_.end()); |
| 129 | 127 |
| 130 AddTextTrackDoneCB done_cb = BindToCurrentLoop( | 128 AddTextTrackDoneCB done_cb = |
| 131 base::Bind(&TextRenderer::OnAddTextTrackDone, weak_this_, text_stream)); | 129 BindToCurrentLoop(base::Bind(&TextRenderer::OnAddTextTrackDone, |
| 130 weak_factory_.GetWeakPtr(), |
| 131 text_stream)); |
| 132 | 132 |
| 133 add_text_track_cb_.Run(config, done_cb); | 133 add_text_track_cb_.Run(config, done_cb); |
| 134 } | 134 } |
| 135 | 135 |
| 136 void TextRenderer::RemoveTextStream(DemuxerStream* text_stream) { | 136 void TextRenderer::RemoveTextStream(DemuxerStream* text_stream) { |
| 137 DCHECK(task_runner_->BelongsToCurrentThread()); | 137 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 138 | 138 |
| 139 TextTrackStateMap::iterator itr = text_track_state_map_.find(text_stream); | 139 TextTrackStateMap::iterator itr = text_track_state_map_.find(text_stream); |
| 140 DCHECK(itr != text_track_state_map_.end()); | 140 DCHECK(itr != text_track_state_map_.end()); |
| 141 | 141 |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 } | 347 } |
| 348 | 348 |
| 349 void TextRenderer::Read( | 349 void TextRenderer::Read( |
| 350 TextTrackState* state, | 350 TextTrackState* state, |
| 351 DemuxerStream* text_stream) { | 351 DemuxerStream* text_stream) { |
| 352 DCHECK_NE(state->read_state, TextTrackState::kReadPending); | 352 DCHECK_NE(state->read_state, TextTrackState::kReadPending); |
| 353 | 353 |
| 354 state->read_state = TextTrackState::kReadPending; | 354 state->read_state = TextTrackState::kReadPending; |
| 355 ++pending_read_count_; | 355 ++pending_read_count_; |
| 356 | 356 |
| 357 text_stream->Read(base::Bind(&TextRenderer::BufferReady, | 357 text_stream->Read(base::Bind( |
| 358 weak_this_, | 358 &TextRenderer::BufferReady, weak_factory_.GetWeakPtr(), text_stream)); |
| 359 text_stream)); | |
| 360 } | 359 } |
| 361 | 360 |
| 362 TextRenderer::TextTrackState::TextTrackState(scoped_ptr<TextTrack> tt) | 361 TextRenderer::TextTrackState::TextTrackState(scoped_ptr<TextTrack> tt) |
| 363 : read_state(kReadIdle), | 362 : read_state(kReadIdle), |
| 364 text_track(tt.Pass()) { | 363 text_track(tt.Pass()) { |
| 365 } | 364 } |
| 366 | 365 |
| 367 TextRenderer::TextTrackState::~TextTrackState() { | 366 TextRenderer::TextTrackState::~TextTrackState() { |
| 368 } | 367 } |
| 369 | 368 |
| 370 } // namespace media | 369 } // namespace media |
| OLD | NEW |