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 |