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

Side by Side Diff: chromecast/media/cma/backend/media_component_device_default.cc

Issue 1257013003: Load CMA backend from shared library (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Unit test + android fixes Created 5 years, 4 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "chromecast/media/cma/backend/media_component_device_default.h" 5 #include "chromecast/media/cma/backend/media_component_device_default.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/location.h" 9 #include "base/location.h"
10 #include "base/thread_task_runner_handle.h" 10 #include "base/thread_task_runner_handle.h"
11 #include "chromecast/media/cma/base/decoder_buffer_base.h" 11 #include "chromecast/public/media/decoder_buffer.h"
12 #include "chromecast/public/media/media_pipeline_device_params.h"
13 #include "chromecast/public/task_runner.h"
12 #include "media/base/buffers.h" 14 #include "media/base/buffers.h"
13 15
14 namespace chromecast { 16 namespace chromecast {
15 namespace media { 17 namespace media {
16 18
17 namespace { 19 namespace {
18 20
19 // Maximum number of frames that can be buffered. 21 // Maximum number of frames that can be buffered.
20 const size_t kMaxFrameCount = 20; 22 const size_t kMaxFrameCount = 20;
21 23
24 // Wraps base::Closure in the chromecast/public TaskRunner interface.
25 class ClosureTask : public TaskRunner::Task {
26 public:
27 ClosureTask(const base::Closure& cb) : cb_(cb) {}
28 void Run() override { cb_.Run(); }
29
30 private:
31 base::Closure cb_;
32 };
33
22 } // namespace 34 } // namespace
23 35
24 MediaComponentDeviceDefault::DefaultDecoderBuffer::DefaultDecoderBuffer() 36 MediaComponentDeviceDefault::DefaultDecoderBuffer::DefaultDecoderBuffer()
25 : size(0) { 37 : size(0) {
26 } 38 }
27 39
28 MediaComponentDeviceDefault::DefaultDecoderBuffer::~DefaultDecoderBuffer() { 40 MediaComponentDeviceDefault::DefaultDecoderBuffer::~DefaultDecoderBuffer() {
29 } 41 }
30 42
31 MediaComponentDeviceDefault::MediaComponentDeviceDefault( 43 MediaComponentDeviceDefault::MediaComponentDeviceDefault(
44 const MediaPipelineDeviceParams& params,
32 MediaClockDevice* media_clock_device) 45 MediaClockDevice* media_clock_device)
33 : media_clock_device_(media_clock_device), 46 : task_runner_(params.task_runner),
47 media_clock_device_(media_clock_device),
34 state_(kStateUninitialized), 48 state_(kStateUninitialized),
35 rendering_time_(::media::kNoTimestamp()), 49 rendering_time_(TimeDelta::Invalid()),
36 decoded_frame_count_(0), 50 decoded_frame_count_(0),
37 decoded_byte_count_(0), 51 decoded_byte_count_(0),
38 scheduled_rendering_task_(false), 52 scheduled_rendering_task_(false),
39 weak_factory_(this) { 53 weak_factory_(this) {
40 weak_this_ = weak_factory_.GetWeakPtr(); 54 weak_this_ = weak_factory_.GetWeakPtr();
41 DetachFromThread(); 55 thread_checker_.DetachFromThread();
42 } 56 }
43 57
44 MediaComponentDeviceDefault::~MediaComponentDeviceDefault() { 58 MediaComponentDeviceDefault::~MediaComponentDeviceDefault() {
45 } 59 }
46 60
47 void MediaComponentDeviceDefault::SetClient(const Client& client) { 61 void MediaComponentDeviceDefault::SetClient(Client* client) {
48 DCHECK(CalledOnValidThread()); 62 DCHECK(thread_checker_.CalledOnValidThread());
49 client_ = client; 63 client_.reset(client);
50 } 64 }
51 65
52 MediaComponentDevice::State MediaComponentDeviceDefault::GetState() const { 66 MediaComponentDevice::State MediaComponentDeviceDefault::GetState() const {
53 DCHECK(CalledOnValidThread()); 67 DCHECK(thread_checker_.CalledOnValidThread());
54 return state_; 68 return state_;
55 } 69 }
56 70
57 bool MediaComponentDeviceDefault::SetState(State new_state) { 71 bool MediaComponentDeviceDefault::SetState(State new_state) {
58 DCHECK(CalledOnValidThread()); 72 DCHECK(thread_checker_.CalledOnValidThread());
59 if (!MediaComponentDevice::IsValidStateTransition(state_, new_state)) 73 if (!MediaComponentDevice::IsValidStateTransition(state_, new_state))
60 return false; 74 return false;
61 state_ = new_state; 75 state_ = new_state;
62 76
63 if (state_ == kStateIdle) { 77 if (state_ == kStateIdle) {
64 // Back to the idle state: reset a bunch of parameters. 78 // Back to the idle state: reset a bunch of parameters.
65 is_eos_ = false; 79 is_eos_ = false;
66 rendering_time_ = ::media::kNoTimestamp(); 80 rendering_time_ = TimeDelta::Invalid();
67 decoded_frame_count_ = 0; 81 decoded_frame_count_ = 0;
68 decoded_byte_count_ = 0; 82 decoded_byte_count_ = 0;
69 frames_.clear(); 83 frames_.clear();
70 pending_buffer_ = scoped_refptr<DecoderBufferBase>(); 84 pending_buffer_ = scoped_ptr<DecoderBuffer>();
71 frame_pushed_cb_.Reset(); 85 frame_pushed_cb_.reset();
72 return true; 86 return true;
73 } 87 }
74 88
75 if (state_ == kStateRunning) { 89 if (state_ == kStateRunning) {
76 if (!scheduled_rendering_task_) { 90 if (!scheduled_rendering_task_) {
77 scheduled_rendering_task_ = true; 91 scheduled_rendering_task_ = true;
78 base::ThreadTaskRunnerHandle::Get()->PostTask( 92 task_runner_->PostTask(new ClosureTask(
79 FROM_HERE, 93 base::Bind(&MediaComponentDeviceDefault::RenderTask, weak_this_)));
80 base::Bind(&MediaComponentDeviceDefault::RenderTask, weak_this_));
81 } 94 }
82 return true; 95 return true;
83 } 96 }
84 97
85 return true; 98 return true;
86 } 99 }
87 100
88 bool MediaComponentDeviceDefault::SetStartPts(base::TimeDelta time) { 101 bool MediaComponentDeviceDefault::SetStartPts(TimeDelta time) {
89 DCHECK(CalledOnValidThread()); 102 DCHECK(thread_checker_.CalledOnValidThread());
90 DCHECK_EQ(state_, kStateIdle); 103 DCHECK_EQ(state_, kStateIdle);
91 rendering_time_ = time; 104 rendering_time_ = time;
92 return true; 105 return true;
93 } 106 }
94 107
95 MediaComponentDevice::FrameStatus MediaComponentDeviceDefault::PushFrame( 108 MediaComponentDevice::FrameStatus MediaComponentDeviceDefault::PushFrame(
96 const scoped_refptr<DecryptContext>& decrypt_context, 109 CastKeySystem cast_key_system,
97 const scoped_refptr<DecoderBufferBase>& buffer, 110 DecoderBuffer* buffer_in,
98 const FrameStatusCB& completion_cb) { 111 FrameStatusCB* completion_cb_in) {
99 DCHECK(CalledOnValidThread()); 112 DCHECK(thread_checker_.CalledOnValidThread());
100 DCHECK(state_ == kStatePaused || state_ == kStateRunning); 113 DCHECK(state_ == kStatePaused || state_ == kStateRunning);
101 DCHECK(!is_eos_); 114 DCHECK(!is_eos_);
102 DCHECK(!pending_buffer_.get()); 115 DCHECK(!pending_buffer_.get());
103 DCHECK(buffer.get()); 116 DCHECK(buffer_in);
104 117
118 scoped_ptr<FrameStatusCB> completion_cb(completion_cb_in);
119
120 scoped_ptr<DecoderBuffer> buffer(buffer_in);
105 if (buffer->end_of_stream()) { 121 if (buffer->end_of_stream()) {
106 is_eos_ = true; 122 is_eos_ = true;
107 return kFrameSuccess; 123 return kFrameSuccess;
108 } 124 }
109 125
110 if (frames_.size() > kMaxFrameCount) { 126 if (frames_.size() > kMaxFrameCount) {
111 pending_buffer_ = buffer; 127 pending_buffer_ = buffer.Pass();
112 frame_pushed_cb_ = completion_cb; 128 frame_pushed_cb_ = completion_cb.Pass();
113 return kFramePending; 129 return kFramePending;
114 } 130 }
115 131
116 DefaultDecoderBuffer fake_buffer; 132 DefaultDecoderBuffer fake_buffer;
117 fake_buffer.size = buffer->data_size(); 133 fake_buffer.size = buffer->data_size();
118 fake_buffer.pts = buffer->timestamp(); 134 fake_buffer.pts = buffer->timestamp();
119 frames_.push_back(fake_buffer); 135 frames_.push_back(fake_buffer);
120 return kFrameSuccess; 136 return kFrameSuccess;
121 } 137 }
122 138
123 base::TimeDelta MediaComponentDeviceDefault::GetRenderingTime() const { 139 TimeDelta MediaComponentDeviceDefault::GetRenderingDelay() const {
124 return rendering_time_;
125 }
126
127 base::TimeDelta MediaComponentDeviceDefault::GetRenderingDelay() const {
128 NOTIMPLEMENTED(); 140 NOTIMPLEMENTED();
129 return ::media::kNoTimestamp(); 141 return TimeDelta::Invalid();
130 } 142 }
131 143
132 void MediaComponentDeviceDefault::RenderTask() { 144 void MediaComponentDeviceDefault::RenderTask() {
133 scheduled_rendering_task_ = false; 145 scheduled_rendering_task_ = false;
134 146
135 if (state_ != kStateRunning) 147 if (state_ != kStateRunning)
136 return; 148 return;
137 149
138 base::TimeDelta media_time = media_clock_device_->GetTime(); 150 TimeDelta media_time = media_clock_device_->GetTime();
139 if (media_time == ::media::kNoTimestamp()) { 151 if (media_time == TimeDelta::Invalid()) {
140 scheduled_rendering_task_ = true; 152 scheduled_rendering_task_ = true;
141 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 153 task_runner_->PostDelayedTask(
142 FROM_HERE, 154 new ClosureTask(
143 base::Bind(&MediaComponentDeviceDefault::RenderTask, weak_this_), 155 base::Bind(&MediaComponentDeviceDefault::RenderTask, weak_this_)),
144 base::TimeDelta::FromMilliseconds(50)); 156 TimeDelta::FromMilliseconds(50));
145 return; 157 return;
146 } 158 }
147 159
148 while (!frames_.empty() && frames_.front().pts <= media_time) { 160 while (!frames_.empty() && frames_.front().pts <= media_time) {
149 rendering_time_ = frames_.front().pts; 161 rendering_time_ = frames_.front().pts;
150 decoded_frame_count_++; 162 decoded_frame_count_++;
151 decoded_byte_count_ += frames_.front().size; 163 decoded_byte_count_ += frames_.front().size;
152 frames_.pop_front(); 164 frames_.pop_front();
153 if (pending_buffer_.get()) { 165 if (pending_buffer_.get()) {
154 DefaultDecoderBuffer fake_buffer; 166 DefaultDecoderBuffer fake_buffer;
155 fake_buffer.size = pending_buffer_->data_size(); 167 fake_buffer.size = pending_buffer_->data_size();
156 fake_buffer.pts = pending_buffer_->timestamp(); 168 fake_buffer.pts = pending_buffer_->timestamp();
157 frames_.push_back(fake_buffer); 169 frames_.push_back(fake_buffer);
158 pending_buffer_ = scoped_refptr<DecoderBufferBase>(); 170 pending_buffer_ = scoped_ptr<DecoderBuffer>();
159 base::ResetAndReturn(&frame_pushed_cb_).Run(kFrameSuccess); 171 frame_pushed_cb_->Run(kFrameSuccess);
172 frame_pushed_cb_.reset();
160 } 173 }
161 } 174 }
162 175
163 if (frames_.empty() && is_eos_) { 176 if (frames_.empty() && is_eos_) {
164 if (!client_.eos_cb.is_null()) 177 if (client_) {
165 client_.eos_cb.Run(); 178 client_->OnEndOfStream();
179 }
166 return; 180 return;
167 } 181 }
168 182
169 scheduled_rendering_task_ = true; 183 scheduled_rendering_task_ = true;
170 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 184 task_runner_->PostDelayedTask(
171 FROM_HERE, 185 new ClosureTask(
172 base::Bind(&MediaComponentDeviceDefault::RenderTask, weak_this_), 186 base::Bind(&MediaComponentDeviceDefault::RenderTask, weak_this_)),
173 base::TimeDelta::FromMilliseconds(50)); 187 TimeDelta::FromMilliseconds(50));
174 } 188 }
175 189
176 bool MediaComponentDeviceDefault::GetStatistics(Statistics* stats) const { 190 bool MediaComponentDeviceDefault::GetStatistics(Statistics* stats) const {
177 if (state_ != kStateRunning) 191 if (state_ != kStateRunning)
178 return false; 192 return false;
179 193
180 // Note: what is returned here is not the number of samples but the number of 194 // Note: what is returned here is not the number of samples but the number of
181 // frames. The value is different for audio. 195 // frames. The value is different for audio.
182 stats->decoded_bytes = decoded_byte_count_; 196 stats->decoded_bytes = decoded_byte_count_;
183 stats->decoded_samples = decoded_frame_count_; 197 stats->decoded_samples = decoded_frame_count_;
184 stats->dropped_samples = 0; 198 stats->dropped_samples = 0;
185 return true; 199 return true;
186 } 200 }
187 201
188 } // namespace media 202 } // namespace media
189 } // namespace chromecast 203 } // namespace chromecast
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698