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

Side by Side Diff: media/filters/decrypting_audio_decoder.cc

Issue 65803002: Replace MessageLoopProxy with SingleThreadTaskRunner for media/filters/ + associated code. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years 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 | Annotate | Revision Log
« no previous file with comments | « media/filters/decrypting_audio_decoder.h ('k') | media/filters/decrypting_demuxer_stream.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/filters/decrypting_audio_decoder.h" 5 #include "media/filters/decrypting_audio_decoder.h"
6 6
7 #include <cstdlib> 7 #include <cstdlib>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback_helpers.h" 10 #include "base/callback_helpers.h"
11 #include "base/location.h" 11 #include "base/location.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/message_loop/message_loop_proxy.h" 13 #include "base/single_thread_task_runner.h"
14 #include "media/base/audio_buffer.h" 14 #include "media/base/audio_buffer.h"
15 #include "media/base/audio_decoder_config.h" 15 #include "media/base/audio_decoder_config.h"
16 #include "media/base/audio_timestamp_helper.h" 16 #include "media/base/audio_timestamp_helper.h"
17 #include "media/base/bind_to_loop.h" 17 #include "media/base/bind_to_loop.h"
18 #include "media/base/buffers.h" 18 #include "media/base/buffers.h"
19 #include "media/base/decoder_buffer.h" 19 #include "media/base/decoder_buffer.h"
20 #include "media/base/decryptor.h" 20 #include "media/base/decryptor.h"
21 #include "media/base/demuxer_stream.h" 21 #include "media/base/demuxer_stream.h"
22 #include "media/base/pipeline.h" 22 #include "media/base/pipeline.h"
23 23
24 namespace media { 24 namespace media {
25 25
26 const int DecryptingAudioDecoder::kSupportedBitsPerChannel = 16; 26 const int DecryptingAudioDecoder::kSupportedBitsPerChannel = 16;
27 27
28 static inline bool IsOutOfSync(const base::TimeDelta& timestamp_1, 28 static inline bool IsOutOfSync(const base::TimeDelta& timestamp_1,
29 const base::TimeDelta& timestamp_2) { 29 const base::TimeDelta& timestamp_2) {
30 // Out of sync of 100ms would be pretty noticeable and we should keep any 30 // Out of sync of 100ms would be pretty noticeable and we should keep any
31 // drift below that. 31 // drift below that.
32 const int64 kOutOfSyncThresholdInMilliseconds = 100; 32 const int64 kOutOfSyncThresholdInMilliseconds = 100;
33 return std::abs(timestamp_1.InMilliseconds() - timestamp_2.InMilliseconds()) > 33 return std::abs(timestamp_1.InMilliseconds() - timestamp_2.InMilliseconds()) >
34 kOutOfSyncThresholdInMilliseconds; 34 kOutOfSyncThresholdInMilliseconds;
35 } 35 }
36 36
37 DecryptingAudioDecoder::DecryptingAudioDecoder( 37 DecryptingAudioDecoder::DecryptingAudioDecoder(
38 const scoped_refptr<base::MessageLoopProxy>& message_loop, 38 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
39 const SetDecryptorReadyCB& set_decryptor_ready_cb) 39 const SetDecryptorReadyCB& set_decryptor_ready_cb)
40 : message_loop_(message_loop), 40 : task_runner_(task_runner),
41 weak_factory_(this), 41 weak_factory_(this),
42 state_(kUninitialized), 42 state_(kUninitialized),
43 demuxer_stream_(NULL), 43 demuxer_stream_(NULL),
44 set_decryptor_ready_cb_(set_decryptor_ready_cb), 44 set_decryptor_ready_cb_(set_decryptor_ready_cb),
45 decryptor_(NULL), 45 decryptor_(NULL),
46 key_added_while_decode_pending_(false), 46 key_added_while_decode_pending_(false),
47 bits_per_channel_(0), 47 bits_per_channel_(0),
48 channel_layout_(CHANNEL_LAYOUT_NONE), 48 channel_layout_(CHANNEL_LAYOUT_NONE),
49 samples_per_second_(0) { 49 samples_per_second_(0) {
50 } 50 }
51 51
52 void DecryptingAudioDecoder::Initialize( 52 void DecryptingAudioDecoder::Initialize(
53 DemuxerStream* stream, 53 DemuxerStream* stream,
54 const PipelineStatusCB& status_cb, 54 const PipelineStatusCB& status_cb,
55 const StatisticsCB& statistics_cb) { 55 const StatisticsCB& statistics_cb) {
56 DVLOG(2) << "Initialize()"; 56 DVLOG(2) << "Initialize()";
57 DCHECK(message_loop_->BelongsToCurrentThread()); 57 DCHECK(task_runner_->BelongsToCurrentThread());
58 DCHECK_EQ(state_, kUninitialized) << state_; 58 DCHECK_EQ(state_, kUninitialized) << state_;
59 DCHECK(stream); 59 DCHECK(stream);
60 60
61 weak_this_ = weak_factory_.GetWeakPtr(); 61 weak_this_ = weak_factory_.GetWeakPtr();
62 init_cb_ = BindToCurrentLoop(status_cb); 62 init_cb_ = BindToCurrentLoop(status_cb);
63 63
64 const AudioDecoderConfig& config = stream->audio_decoder_config(); 64 const AudioDecoderConfig& config = stream->audio_decoder_config();
65 if (!config.IsValidConfig()) { 65 if (!config.IsValidConfig()) {
66 DLOG(ERROR) << "Invalid audio stream config."; 66 DLOG(ERROR) << "Invalid audio stream config.";
67 base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_DECODE); 67 base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_DECODE);
(...skipping 10 matching lines...) Expand all
78 demuxer_stream_ = stream; 78 demuxer_stream_ = stream;
79 statistics_cb_ = statistics_cb; 79 statistics_cb_ = statistics_cb;
80 80
81 state_ = kDecryptorRequested; 81 state_ = kDecryptorRequested;
82 set_decryptor_ready_cb_.Run(BindToCurrentLoop( 82 set_decryptor_ready_cb_.Run(BindToCurrentLoop(
83 base::Bind(&DecryptingAudioDecoder::SetDecryptor, weak_this_))); 83 base::Bind(&DecryptingAudioDecoder::SetDecryptor, weak_this_)));
84 } 84 }
85 85
86 void DecryptingAudioDecoder::Read(const ReadCB& read_cb) { 86 void DecryptingAudioDecoder::Read(const ReadCB& read_cb) {
87 DVLOG(3) << "Read()"; 87 DVLOG(3) << "Read()";
88 DCHECK(message_loop_->BelongsToCurrentThread()); 88 DCHECK(task_runner_->BelongsToCurrentThread());
89 DCHECK(state_ == kIdle || state_ == kDecodeFinished) << state_; 89 DCHECK(state_ == kIdle || state_ == kDecodeFinished) << state_;
90 DCHECK(!read_cb.is_null()); 90 DCHECK(!read_cb.is_null());
91 CHECK(read_cb_.is_null()) << "Overlapping decodes are not supported."; 91 CHECK(read_cb_.is_null()) << "Overlapping decodes are not supported.";
92 92
93 read_cb_ = BindToCurrentLoop(read_cb); 93 read_cb_ = BindToCurrentLoop(read_cb);
94 94
95 // Return empty (end-of-stream) frames if decoding has finished. 95 // Return empty (end-of-stream) frames if decoding has finished.
96 if (state_ == kDecodeFinished) { 96 if (state_ == kDecodeFinished) {
97 base::ResetAndReturn(&read_cb_).Run(kOk, AudioBuffer::CreateEOSBuffer()); 97 base::ResetAndReturn(&read_cb_).Run(kOk, AudioBuffer::CreateEOSBuffer());
98 return; 98 return;
99 } 99 }
100 100
101 if (!queued_audio_frames_.empty()) { 101 if (!queued_audio_frames_.empty()) {
102 base::ResetAndReturn(&read_cb_).Run(kOk, queued_audio_frames_.front()); 102 base::ResetAndReturn(&read_cb_).Run(kOk, queued_audio_frames_.front());
103 queued_audio_frames_.pop_front(); 103 queued_audio_frames_.pop_front();
104 return; 104 return;
105 } 105 }
106 106
107 state_ = kPendingDemuxerRead; 107 state_ = kPendingDemuxerRead;
108 ReadFromDemuxerStream(); 108 ReadFromDemuxerStream();
109 } 109 }
110 110
111 void DecryptingAudioDecoder::Reset(const base::Closure& closure) { 111 void DecryptingAudioDecoder::Reset(const base::Closure& closure) {
112 DVLOG(2) << "Reset() - state: " << state_; 112 DVLOG(2) << "Reset() - state: " << state_;
113 DCHECK(message_loop_->BelongsToCurrentThread()); 113 DCHECK(task_runner_->BelongsToCurrentThread());
114 DCHECK(state_ == kIdle || 114 DCHECK(state_ == kIdle ||
115 state_ == kPendingConfigChange || 115 state_ == kPendingConfigChange ||
116 state_ == kPendingDemuxerRead || 116 state_ == kPendingDemuxerRead ||
117 state_ == kPendingDecode || 117 state_ == kPendingDecode ||
118 state_ == kWaitingForKey || 118 state_ == kWaitingForKey ||
119 state_ == kDecodeFinished) << state_; 119 state_ == kDecodeFinished) << state_;
120 DCHECK(init_cb_.is_null()); // No Reset() during pending initialization. 120 DCHECK(init_cb_.is_null()); // No Reset() during pending initialization.
121 DCHECK(reset_cb_.is_null()); 121 DCHECK(reset_cb_.is_null());
122 122
123 reset_cb_ = closure; 123 reset_cb_ = closure;
(...skipping 15 matching lines...) Expand all
139 DCHECK(!read_cb_.is_null()); 139 DCHECK(!read_cb_.is_null());
140 pending_buffer_to_decode_ = NULL; 140 pending_buffer_to_decode_ = NULL;
141 base::ResetAndReturn(&read_cb_).Run(kAborted, NULL); 141 base::ResetAndReturn(&read_cb_).Run(kAborted, NULL);
142 } 142 }
143 143
144 DCHECK(read_cb_.is_null()); 144 DCHECK(read_cb_.is_null());
145 DoReset(); 145 DoReset();
146 } 146 }
147 147
148 int DecryptingAudioDecoder::bits_per_channel() { 148 int DecryptingAudioDecoder::bits_per_channel() {
149 DCHECK(message_loop_->BelongsToCurrentThread()); 149 DCHECK(task_runner_->BelongsToCurrentThread());
150 return bits_per_channel_; 150 return bits_per_channel_;
151 } 151 }
152 152
153 ChannelLayout DecryptingAudioDecoder::channel_layout() { 153 ChannelLayout DecryptingAudioDecoder::channel_layout() {
154 DCHECK(message_loop_->BelongsToCurrentThread()); 154 DCHECK(task_runner_->BelongsToCurrentThread());
155 return channel_layout_; 155 return channel_layout_;
156 } 156 }
157 157
158 int DecryptingAudioDecoder::samples_per_second() { 158 int DecryptingAudioDecoder::samples_per_second() {
159 DCHECK(message_loop_->BelongsToCurrentThread()); 159 DCHECK(task_runner_->BelongsToCurrentThread());
160 return samples_per_second_; 160 return samples_per_second_;
161 } 161 }
162 162
163 DecryptingAudioDecoder::~DecryptingAudioDecoder() { 163 DecryptingAudioDecoder::~DecryptingAudioDecoder() {
164 } 164 }
165 165
166 void DecryptingAudioDecoder::SetDecryptor(Decryptor* decryptor) { 166 void DecryptingAudioDecoder::SetDecryptor(Decryptor* decryptor) {
167 DVLOG(2) << "SetDecryptor()"; 167 DVLOG(2) << "SetDecryptor()";
168 DCHECK(message_loop_->BelongsToCurrentThread()); 168 DCHECK(task_runner_->BelongsToCurrentThread());
169 DCHECK_EQ(state_, kDecryptorRequested) << state_; 169 DCHECK_EQ(state_, kDecryptorRequested) << state_;
170 DCHECK(!init_cb_.is_null()); 170 DCHECK(!init_cb_.is_null());
171 DCHECK(!set_decryptor_ready_cb_.is_null()); 171 DCHECK(!set_decryptor_ready_cb_.is_null());
172 172
173 set_decryptor_ready_cb_.Reset(); 173 set_decryptor_ready_cb_.Reset();
174 174
175 if (!decryptor) { 175 if (!decryptor) {
176 base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); 176 base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED);
177 // TODO(xhwang): Add kError state. See http://crbug.com/251503 177 // TODO(xhwang): Add kError state. See http://crbug.com/251503
178 state_ = kDecodeFinished; 178 state_ = kDecodeFinished;
(...skipping 18 matching lines...) Expand all
197 197
198 state_ = kPendingDecoderInit; 198 state_ = kPendingDecoderInit;
199 decryptor_->InitializeAudioDecoder( 199 decryptor_->InitializeAudioDecoder(
200 config, 200 config,
201 BindToCurrentLoop(base::Bind( 201 BindToCurrentLoop(base::Bind(
202 &DecryptingAudioDecoder::FinishInitialization, weak_this_))); 202 &DecryptingAudioDecoder::FinishInitialization, weak_this_)));
203 } 203 }
204 204
205 void DecryptingAudioDecoder::FinishInitialization(bool success) { 205 void DecryptingAudioDecoder::FinishInitialization(bool success) {
206 DVLOG(2) << "FinishInitialization()"; 206 DVLOG(2) << "FinishInitialization()";
207 DCHECK(message_loop_->BelongsToCurrentThread()); 207 DCHECK(task_runner_->BelongsToCurrentThread());
208 DCHECK_EQ(state_, kPendingDecoderInit) << state_; 208 DCHECK_EQ(state_, kPendingDecoderInit) << state_;
209 DCHECK(!init_cb_.is_null()); 209 DCHECK(!init_cb_.is_null());
210 DCHECK(reset_cb_.is_null()); // No Reset() before initialization finished. 210 DCHECK(reset_cb_.is_null()); // No Reset() before initialization finished.
211 DCHECK(read_cb_.is_null()); // No Read() before initialization finished. 211 DCHECK(read_cb_.is_null()); // No Read() before initialization finished.
212 212
213 if (!success) { 213 if (!success) {
214 base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); 214 base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED);
215 state_ = kDecodeFinished; 215 state_ = kDecodeFinished;
216 return; 216 return;
217 } 217 }
218 218
219 // Success! 219 // Success!
220 UpdateDecoderConfig(); 220 UpdateDecoderConfig();
221 221
222 decryptor_->RegisterNewKeyCB( 222 decryptor_->RegisterNewKeyCB(
223 Decryptor::kAudio, BindToCurrentLoop(base::Bind( 223 Decryptor::kAudio, BindToCurrentLoop(base::Bind(
224 &DecryptingAudioDecoder::OnKeyAdded, weak_this_))); 224 &DecryptingAudioDecoder::OnKeyAdded, weak_this_)));
225 225
226 state_ = kIdle; 226 state_ = kIdle;
227 base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK); 227 base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK);
228 } 228 }
229 229
230 void DecryptingAudioDecoder::FinishConfigChange(bool success) { 230 void DecryptingAudioDecoder::FinishConfigChange(bool success) {
231 DVLOG(2) << "FinishConfigChange()"; 231 DVLOG(2) << "FinishConfigChange()";
232 DCHECK(message_loop_->BelongsToCurrentThread()); 232 DCHECK(task_runner_->BelongsToCurrentThread());
233 DCHECK_EQ(state_, kPendingConfigChange) << state_; 233 DCHECK_EQ(state_, kPendingConfigChange) << state_;
234 DCHECK(!read_cb_.is_null()); 234 DCHECK(!read_cb_.is_null());
235 235
236 if (!success) { 236 if (!success) {
237 base::ResetAndReturn(&read_cb_).Run(kDecodeError, NULL); 237 base::ResetAndReturn(&read_cb_).Run(kDecodeError, NULL);
238 state_ = kDecodeFinished; 238 state_ = kDecodeFinished;
239 if (!reset_cb_.is_null()) 239 if (!reset_cb_.is_null())
240 base::ResetAndReturn(&reset_cb_).Run(); 240 base::ResetAndReturn(&reset_cb_).Run();
241 return; 241 return;
242 } 242 }
(...skipping 16 matching lines...) Expand all
259 DCHECK(!read_cb_.is_null()); 259 DCHECK(!read_cb_.is_null());
260 260
261 demuxer_stream_->Read( 261 demuxer_stream_->Read(
262 base::Bind(&DecryptingAudioDecoder::DecryptAndDecodeBuffer, weak_this_)); 262 base::Bind(&DecryptingAudioDecoder::DecryptAndDecodeBuffer, weak_this_));
263 } 263 }
264 264
265 void DecryptingAudioDecoder::DecryptAndDecodeBuffer( 265 void DecryptingAudioDecoder::DecryptAndDecodeBuffer(
266 DemuxerStream::Status status, 266 DemuxerStream::Status status,
267 const scoped_refptr<DecoderBuffer>& buffer) { 267 const scoped_refptr<DecoderBuffer>& buffer) {
268 DVLOG(3) << "DecryptAndDecodeBuffer()"; 268 DVLOG(3) << "DecryptAndDecodeBuffer()";
269 DCHECK(message_loop_->BelongsToCurrentThread()); 269 DCHECK(task_runner_->BelongsToCurrentThread());
270 DCHECK_EQ(state_, kPendingDemuxerRead) << state_; 270 DCHECK_EQ(state_, kPendingDemuxerRead) << state_;
271 DCHECK(!read_cb_.is_null()); 271 DCHECK(!read_cb_.is_null());
272 DCHECK_EQ(buffer.get() != NULL, status == DemuxerStream::kOk) << status; 272 DCHECK_EQ(buffer.get() != NULL, status == DemuxerStream::kOk) << status;
273 273
274 if (status == DemuxerStream::kConfigChanged) { 274 if (status == DemuxerStream::kConfigChanged) {
275 DVLOG(2) << "DecryptAndDecodeBuffer() - kConfigChanged"; 275 DVLOG(2) << "DecryptAndDecodeBuffer() - kConfigChanged";
276 276
277 const AudioDecoderConfig& input_config = 277 const AudioDecoderConfig& input_config =
278 demuxer_stream_->audio_decoder_config(); 278 demuxer_stream_->audio_decoder_config();
279 AudioDecoderConfig config; 279 AudioDecoderConfig config;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 !buffer->end_of_stream()) { 317 !buffer->end_of_stream()) {
318 timestamp_helper_->SetBaseTimestamp(buffer->timestamp()); 318 timestamp_helper_->SetBaseTimestamp(buffer->timestamp());
319 } 319 }
320 320
321 pending_buffer_to_decode_ = buffer; 321 pending_buffer_to_decode_ = buffer;
322 state_ = kPendingDecode; 322 state_ = kPendingDecode;
323 DecodePendingBuffer(); 323 DecodePendingBuffer();
324 } 324 }
325 325
326 void DecryptingAudioDecoder::DecodePendingBuffer() { 326 void DecryptingAudioDecoder::DecodePendingBuffer() {
327 DCHECK(message_loop_->BelongsToCurrentThread()); 327 DCHECK(task_runner_->BelongsToCurrentThread());
328 DCHECK_EQ(state_, kPendingDecode) << state_; 328 DCHECK_EQ(state_, kPendingDecode) << state_;
329 329
330 int buffer_size = 0; 330 int buffer_size = 0;
331 if (!pending_buffer_to_decode_->end_of_stream()) { 331 if (!pending_buffer_to_decode_->end_of_stream()) {
332 buffer_size = pending_buffer_to_decode_->data_size(); 332 buffer_size = pending_buffer_to_decode_->data_size();
333 } 333 }
334 334
335 decryptor_->DecryptAndDecodeAudio( 335 decryptor_->DecryptAndDecodeAudio(
336 pending_buffer_to_decode_, 336 pending_buffer_to_decode_,
337 BindToCurrentLoop(base::Bind( 337 BindToCurrentLoop(base::Bind(
338 &DecryptingAudioDecoder::DeliverFrame, weak_this_, buffer_size))); 338 &DecryptingAudioDecoder::DeliverFrame, weak_this_, buffer_size)));
339 } 339 }
340 340
341 void DecryptingAudioDecoder::DeliverFrame( 341 void DecryptingAudioDecoder::DeliverFrame(
342 int buffer_size, 342 int buffer_size,
343 Decryptor::Status status, 343 Decryptor::Status status,
344 const Decryptor::AudioBuffers& frames) { 344 const Decryptor::AudioBuffers& frames) {
345 DVLOG(3) << "DeliverFrame() - status: " << status; 345 DVLOG(3) << "DeliverFrame() - status: " << status;
346 DCHECK(message_loop_->BelongsToCurrentThread()); 346 DCHECK(task_runner_->BelongsToCurrentThread());
347 DCHECK_EQ(state_, kPendingDecode) << state_; 347 DCHECK_EQ(state_, kPendingDecode) << state_;
348 DCHECK(!read_cb_.is_null()); 348 DCHECK(!read_cb_.is_null());
349 DCHECK(pending_buffer_to_decode_.get()); 349 DCHECK(pending_buffer_to_decode_.get());
350 DCHECK(queued_audio_frames_.empty()); 350 DCHECK(queued_audio_frames_.empty());
351 351
352 bool need_to_try_again_if_nokey_is_returned = key_added_while_decode_pending_; 352 bool need_to_try_again_if_nokey_is_returned = key_added_while_decode_pending_;
353 key_added_while_decode_pending_ = false; 353 key_added_while_decode_pending_ = false;
354 354
355 scoped_refptr<DecoderBuffer> scoped_pending_buffer_to_decode = 355 scoped_refptr<DecoderBuffer> scoped_pending_buffer_to_decode =
356 pending_buffer_to_decode_; 356 pending_buffer_to_decode_;
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 DCHECK_EQ(status, Decryptor::kSuccess); 410 DCHECK_EQ(status, Decryptor::kSuccess);
411 DCHECK(!frames.empty()); 411 DCHECK(!frames.empty());
412 EnqueueFrames(frames); 412 EnqueueFrames(frames);
413 413
414 state_ = kIdle; 414 state_ = kIdle;
415 base::ResetAndReturn(&read_cb_).Run(kOk, queued_audio_frames_.front()); 415 base::ResetAndReturn(&read_cb_).Run(kOk, queued_audio_frames_.front());
416 queued_audio_frames_.pop_front(); 416 queued_audio_frames_.pop_front();
417 } 417 }
418 418
419 void DecryptingAudioDecoder::OnKeyAdded() { 419 void DecryptingAudioDecoder::OnKeyAdded() {
420 DCHECK(message_loop_->BelongsToCurrentThread()); 420 DCHECK(task_runner_->BelongsToCurrentThread());
421 421
422 if (state_ == kPendingDecode) { 422 if (state_ == kPendingDecode) {
423 key_added_while_decode_pending_ = true; 423 key_added_while_decode_pending_ = true;
424 return; 424 return;
425 } 425 }
426 426
427 if (state_ == kWaitingForKey) { 427 if (state_ == kWaitingForKey) {
428 state_ = kPendingDecode; 428 state_ = kPendingDecode;
429 DecodePendingBuffer(); 429 DecodePendingBuffer();
430 } 430 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
467 } 467 }
468 468
469 frame->set_timestamp(current_time); 469 frame->set_timestamp(current_time);
470 frame->set_duration( 470 frame->set_duration(
471 timestamp_helper_->GetFrameDuration(frame->frame_count())); 471 timestamp_helper_->GetFrameDuration(frame->frame_count()));
472 timestamp_helper_->AddFrames(frame->frame_count()); 472 timestamp_helper_->AddFrames(frame->frame_count());
473 } 473 }
474 } 474 }
475 475
476 } // namespace media 476 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/decrypting_audio_decoder.h ('k') | media/filters/decrypting_demuxer_stream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698