OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/pipeline/av_pipeline_impl.h" | 5 #include "chromecast/media/cma/pipeline/av_pipeline_impl.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
(...skipping 23 matching lines...) Expand all Loading... |
34 const int kNoCallbackId = -1; | 34 const int kNoCallbackId = -1; |
35 | 35 |
36 } // namespace | 36 } // namespace |
37 | 37 |
38 AvPipelineImpl::AvPipelineImpl(MediaPipelineBackend::Decoder* decoder, | 38 AvPipelineImpl::AvPipelineImpl(MediaPipelineBackend::Decoder* decoder, |
39 const AvPipelineClient& client) | 39 const AvPipelineClient& client) |
40 : bytes_decoded_since_last_update_(0), | 40 : bytes_decoded_since_last_update_(0), |
41 decoder_(decoder), | 41 decoder_(decoder), |
42 client_(client), | 42 client_(client), |
43 state_(kUninitialized), | 43 state_(kUninitialized), |
44 buffered_time_(::media::kNoTimestamp()), | 44 buffered_time_(::media::kNoTimestamp), |
45 playable_buffered_time_(::media::kNoTimestamp()), | 45 playable_buffered_time_(::media::kNoTimestamp), |
46 enable_feeding_(false), | 46 enable_feeding_(false), |
47 pending_read_(false), | 47 pending_read_(false), |
48 cast_cdm_context_(NULL), | 48 cast_cdm_context_(NULL), |
49 player_tracker_callback_id_(kNoCallbackId), | 49 player_tracker_callback_id_(kNoCallbackId), |
50 weak_factory_(this) { | 50 weak_factory_(this) { |
51 DCHECK(decoder_); | 51 DCHECK(decoder_); |
52 decoder_->SetDelegate(this); | 52 decoder_->SetDelegate(this); |
53 weak_this_ = weak_factory_.GetWeakPtr(); | 53 weak_this_ = weak_factory_.GetWeakPtr(); |
54 thread_checker_.DetachFromThread(); | 54 thread_checker_.DetachFromThread(); |
55 } | 55 } |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
115 } | 115 } |
116 DCHECK_EQ(state_, kStopped); | 116 DCHECK_EQ(state_, kStopped); |
117 set_state(kFlushing); | 117 set_state(kFlushing); |
118 | 118 |
119 flush_cb_ = flush_cb; | 119 flush_cb_ = flush_cb; |
120 // Remove any pending buffer. | 120 // Remove any pending buffer. |
121 pending_buffer_ = nullptr; | 121 pending_buffer_ = nullptr; |
122 pushed_buffer_ = nullptr; | 122 pushed_buffer_ = nullptr; |
123 // Remove any frames left in the frame provider. | 123 // Remove any frames left in the frame provider. |
124 pending_read_ = false; | 124 pending_read_ = false; |
125 buffered_time_ = ::media::kNoTimestamp(); | 125 buffered_time_ = ::media::kNoTimestamp; |
126 playable_buffered_time_ = ::media::kNoTimestamp(); | 126 playable_buffered_time_ = ::media::kNoTimestamp; |
127 non_playable_frames_.clear(); | 127 non_playable_frames_.clear(); |
128 | 128 |
129 frame_provider_->Flush(base::Bind(&AvPipelineImpl::OnFlushDone, weak_this_)); | 129 frame_provider_->Flush(base::Bind(&AvPipelineImpl::OnFlushDone, weak_this_)); |
130 } | 130 } |
131 | 131 |
132 void AvPipelineImpl::OnFlushDone() { | 132 void AvPipelineImpl::OnFlushDone() { |
133 CMALOG(kLogControl) << __FUNCTION__; | 133 CMALOG(kLogControl) << __FUNCTION__; |
134 DCHECK(thread_checker_.CalledOnValidThread()); | 134 DCHECK(thread_checker_.CalledOnValidThread()); |
135 if (state_ == kError) { | 135 if (state_ == kError) { |
136 // Flush callback is reset on error. | 136 // Flush callback is reset on error. |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 PushPendingBuffer(); | 249 PushPendingBuffer(); |
250 } | 250 } |
251 | 251 |
252 void AvPipelineImpl::PushPendingBuffer() { | 252 void AvPipelineImpl::PushPendingBuffer() { |
253 DCHECK(pending_buffer_); | 253 DCHECK(pending_buffer_); |
254 DCHECK(!pushed_buffer_); | 254 DCHECK(!pushed_buffer_); |
255 | 255 |
256 if (!pending_buffer_->end_of_stream() && buffering_state_.get()) { | 256 if (!pending_buffer_->end_of_stream() && buffering_state_.get()) { |
257 base::TimeDelta timestamp = | 257 base::TimeDelta timestamp = |
258 base::TimeDelta::FromMicroseconds(pending_buffer_->timestamp()); | 258 base::TimeDelta::FromMicroseconds(pending_buffer_->timestamp()); |
259 if (timestamp != ::media::kNoTimestamp()) | 259 if (timestamp != ::media::kNoTimestamp) |
260 buffering_state_->SetMaxRenderingTime(timestamp); | 260 buffering_state_->SetMaxRenderingTime(timestamp); |
261 } | 261 } |
262 | 262 |
263 pushed_buffer_ = pending_buffer_; | 263 pushed_buffer_ = pending_buffer_; |
264 pending_buffer_ = nullptr; | 264 pending_buffer_ = nullptr; |
265 MediaPipelineBackend::BufferStatus status = | 265 MediaPipelineBackend::BufferStatus status = |
266 decoder_->PushBuffer(pushed_buffer_.get()); | 266 decoder_->PushBuffer(pushed_buffer_.get()); |
267 | 267 |
268 if (status != MediaPipelineBackend::kBufferPending) | 268 if (status != MediaPipelineBackend::kBufferPending) |
269 OnPushBufferComplete(status); | 269 OnPushBufferComplete(status); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 | 341 |
342 void AvPipelineImpl::OnDataBuffered( | 342 void AvPipelineImpl::OnDataBuffered( |
343 const scoped_refptr<DecoderBufferBase>& buffer, | 343 const scoped_refptr<DecoderBufferBase>& buffer, |
344 bool is_at_max_capacity) { | 344 bool is_at_max_capacity) { |
345 DCHECK(thread_checker_.CalledOnValidThread()); | 345 DCHECK(thread_checker_.CalledOnValidThread()); |
346 | 346 |
347 if (!buffering_state_.get()) | 347 if (!buffering_state_.get()) |
348 return; | 348 return; |
349 | 349 |
350 if (!buffer->end_of_stream() && | 350 if (!buffer->end_of_stream() && |
351 (buffered_time_ == ::media::kNoTimestamp() || | 351 (buffered_time_ == ::media::kNoTimestamp || |
352 buffered_time_ < | 352 buffered_time_ < |
353 base::TimeDelta::FromMicroseconds(buffer->timestamp()))) { | 353 base::TimeDelta::FromMicroseconds(buffer->timestamp()))) { |
354 buffered_time_ = base::TimeDelta::FromMicroseconds(buffer->timestamp()); | 354 buffered_time_ = base::TimeDelta::FromMicroseconds(buffer->timestamp()); |
355 } | 355 } |
356 | 356 |
357 if (is_at_max_capacity) | 357 if (is_at_max_capacity) |
358 buffering_state_->NotifyMaxCapacity(buffered_time_); | 358 buffering_state_->NotifyMaxCapacity(buffered_time_); |
359 | 359 |
360 // No need to update the list of playable frames, | 360 // No need to update the list of playable frames, |
361 // if we are already blocking on a frame. | 361 // if we are already blocking on a frame. |
(...skipping 15 matching lines...) Expand all Loading... |
377 non_playable_frame->decrypt_config(); | 377 non_playable_frame->decrypt_config(); |
378 if (decrypt_config && | 378 if (decrypt_config && |
379 !(cast_cdm_context_ && | 379 !(cast_cdm_context_ && |
380 cast_cdm_context_->GetDecryptContext(decrypt_config->key_id()) | 380 cast_cdm_context_->GetDecryptContext(decrypt_config->key_id()) |
381 .get())) { | 381 .get())) { |
382 // The frame is still not playable. All the following are thus not | 382 // The frame is still not playable. All the following are thus not |
383 // playable. | 383 // playable. |
384 break; | 384 break; |
385 } | 385 } |
386 | 386 |
387 if (playable_buffered_time_ == ::media::kNoTimestamp() || | 387 if (playable_buffered_time_ == ::media::kNoTimestamp || |
388 playable_buffered_time_ < base::TimeDelta::FromMicroseconds( | 388 playable_buffered_time_ < base::TimeDelta::FromMicroseconds( |
389 non_playable_frame->timestamp())) { | 389 non_playable_frame->timestamp())) { |
390 playable_buffered_time_ = | 390 playable_buffered_time_ = |
391 base::TimeDelta::FromMicroseconds(non_playable_frame->timestamp()); | 391 base::TimeDelta::FromMicroseconds(non_playable_frame->timestamp()); |
392 buffering_state_->SetBufferedTime(playable_buffered_time_); | 392 buffering_state_->SetBufferedTime(playable_buffered_time_); |
393 } | 393 } |
394 } | 394 } |
395 | 395 |
396 // The frame is playable: remove it from the list of non playable frames. | 396 // The frame is playable: remove it from the list of non playable frames. |
397 non_playable_frames_.pop_front(); | 397 non_playable_frames_.pop_front(); |
398 } | 398 } |
399 } | 399 } |
400 | 400 |
401 } // namespace media | 401 } // namespace media |
402 } // namespace chromecast | 402 } // namespace chromecast |
OLD | NEW |