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

Unified Diff: chromecast/media/cma/pipeline/av_pipeline_impl.cc

Issue 1372393007: [Chromecast] Upgrade to new CMA backend API (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Fix GN build Created 5 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: chromecast/media/cma/pipeline/av_pipeline_impl.cc
diff --git a/chromecast/media/cma/pipeline/av_pipeline_impl.cc b/chromecast/media/cma/pipeline/av_pipeline_impl.cc
index ae31b3a37923872bd6bfc372167e8fc8bff0e17b..b64b9be3970d5d120fa484ebcbe0d2e368bfcc82 100644
--- a/chromecast/media/cma/pipeline/av_pipeline_impl.cc
+++ b/chromecast/media/cma/pipeline/av_pipeline_impl.cc
@@ -18,11 +18,7 @@
#include "chromecast/media/cma/base/coded_frame_provider.h"
#include "chromecast/media/cma/base/decoder_buffer_base.h"
#include "chromecast/media/cma/pipeline/decrypt_util.h"
-#include "chromecast/media/cma/pipeline/frame_status_cb_impl.h"
-#include "chromecast/media/cma/pipeline/media_component_device_client_impl.h"
#include "chromecast/public/media/cast_decrypt_config.h"
-#include "chromecast/public/media/media_clock_device.h"
-#include "chromecast/public/media/media_component_device.h"
#include "media/base/audio_decoder_config.h"
#include "media/base/bind_to_current_loop.h"
#include "media/base/decrypt_config.h"
@@ -37,29 +33,27 @@ const int kNoCallbackId = -1;
} // namespace
-AvPipelineImpl::AvPipelineImpl(MediaComponentDevice* media_component_device,
+AvPipelineImpl::AvPipelineImpl(MediaPipelineBackend::Decoder* decoder,
const UpdateConfigCB& update_config_cb)
: update_config_cb_(update_config_cb),
- media_component_device_(media_component_device),
+ decoder_(decoder),
state_(kUninitialized),
buffered_time_(::media::kNoTimestamp()),
playable_buffered_time_(::media::kNoTimestamp()),
enable_feeding_(false),
pending_read_(false),
- pending_push_(false),
enable_time_update_(false),
pending_time_update_task_(false),
media_keys_(NULL),
media_keys_callback_id_(kNoCallbackId),
weak_factory_(this) {
- DCHECK(media_component_device);
+ DCHECK(decoder_);
weak_this_ = weak_factory_.GetWeakPtr();
thread_checker_.DetachFromThread();
}
AvPipelineImpl::~AvPipelineImpl() {
DCHECK(thread_checker_.CalledOnValidThread());
- media_component_device_->SetClient(nullptr);
if (media_keys_ && media_keys_callback_id_ != kNoCallbackId)
media_keys_->UnregisterPlayer(media_keys_callback_id_);
@@ -86,46 +80,18 @@ void AvPipelineImpl::SetCodedFrameProvider(
base::Bind(&AvPipelineImpl::OnFrameBuffered, weak_this_)));
}
-void AvPipelineImpl::SetClient(const AvPipelineClient& client) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK_EQ(state_, kUninitialized);
- client_ = client;
-}
-
-bool AvPipelineImpl::Initialize() {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK_EQ(state_, kUninitialized);
-
- media_component_device_->SetClient(new MediaComponentDeviceClientImpl(
- base::Bind(&AvPipelineImpl::OnEos, weak_this_)));
- if (!media_component_device_->SetState(MediaComponentDevice::kStateIdle))
- return false;
-
- return true;
-}
-
bool AvPipelineImpl::StartPlayingFrom(
base::TimeDelta time,
const scoped_refptr<BufferingState>& buffering_state) {
DCHECK(thread_checker_.CalledOnValidThread());
DCHECK_EQ(state_, kFlushed);
- // Media time where rendering should start
- // and switch to a state where the audio device accepts incoming buffers.
- if (!media_component_device_->SetStartPts(time.InMicroseconds()) ||
- !media_component_device_->SetState(MediaComponentDevice::kStatePaused)) {
- return false;
- }
-
// Buffering related initialization.
DCHECK(frame_provider_);
buffering_state_ = buffering_state;
if (buffering_state_.get())
buffering_state_->SetMediaTime(time);
- if (!media_component_device_->SetState(MediaComponentDevice::kStateRunning))
- return false;
-
// Start feeding the pipeline.
enable_feeding_ = true;
base::ThreadTaskRunnerHandle::Get()->PostTask(
@@ -137,11 +103,9 @@ bool AvPipelineImpl::StartPlayingFrom(
void AvPipelineImpl::Flush(const base::Closure& done_cb) {
DCHECK(thread_checker_.CalledOnValidThread());
DCHECK_EQ(state_, kFlushing);
- DCHECK_EQ(
- media_component_device_->GetState(), MediaComponentDevice::kStateRunning);
+
// Note: returning to idle state aborts any pending frame push.
- media_component_device_->SetState(MediaComponentDevice::kStateIdle);
- pending_push_ = false;
+ pushed_buffer_.reset();
// Break the feeding loop.
enable_feeding_ = false;
@@ -166,18 +130,6 @@ void AvPipelineImpl::Stop() {
// Stop feeding the pipeline.
enable_feeding_ = false;
-
- // Release hardware resources on Stop.
- if (media_component_device_->GetState() ==
- MediaComponentDevice::kStatePaused ||
- media_component_device_->GetState() ==
- MediaComponentDevice::kStateRunning) {
- media_component_device_->SetState(MediaComponentDevice::kStateIdle);
- }
- if (media_component_device_->GetState() == MediaComponentDevice::kStateIdle) {
- media_component_device_->SetState(
- MediaComponentDevice::kStateUninitialized);
- }
}
void AvPipelineImpl::SetCdm(BrowserCdmCast* media_keys) {
@@ -193,16 +145,6 @@ void AvPipelineImpl::SetCdm(BrowserCdmCast* media_keys) {
base::Bind(&AvPipelineImpl::OnCdmDestroyed, weak_this_));
}
-void AvPipelineImpl::OnEos() {
- DCHECK(thread_checker_.CalledOnValidThread());
- CMALOG(kLogControl) << __FUNCTION__;
- if (state_ != kPlaying)
- return;
-
- if (!client_.eos_cb.is_null())
- client_.eos_cb.Run();
-}
-
void AvPipelineImpl::FetchBufferIfNeeded() {
DCHECK(thread_checker_.CalledOnValidThread());
if (!enable_feeding_)
@@ -245,7 +187,7 @@ void AvPipelineImpl::ProcessPendingBuffer() {
return;
}
- if (!pending_buffer_.get() || pending_push_)
+ if (!pending_buffer_.get() || pushed_buffer_)
return;
// Break the feeding loop when the end of stream is reached.
@@ -289,21 +231,20 @@ void AvPipelineImpl::ProcessPendingBuffer() {
buffering_state_->SetMaxRenderingTime(timestamp);
}
- MediaComponentDevice::FrameStatus status = media_component_device_->PushFrame(
- decrypt_context.release(), new CastDecoderBufferImpl(pending_buffer_),
- new FrameStatusCBImpl(
- base::Bind(&AvPipelineImpl::OnFramePushed, weak_this_)));
+ DCHECK(!pushed_buffer_);
+ pushed_buffer_.reset(new CastDecoderBufferImpl(pending_buffer_));
+ MediaPipelineBackend::BufferStatus status =
+ decoder_->PushBuffer(decrypt_context.release(), pushed_buffer_.get());
pending_buffer_ = scoped_refptr<DecoderBufferBase>();
- pending_push_ = (status == MediaComponentDevice::kFramePending);
- if (!pending_push_)
- OnFramePushed(status);
+ if (status != MediaPipelineBackend::kBufferPending)
+ OnBufferPushed(status);
}
-void AvPipelineImpl::OnFramePushed(MediaComponentDevice::FrameStatus status) {
+void AvPipelineImpl::OnBufferPushed(MediaPipelineBackend::BufferStatus status) {
DCHECK(thread_checker_.CalledOnValidThread());
- pending_push_ = false;
- if (status == MediaComponentDevice::kFrameFailed) {
+ pushed_buffer_.reset();
+ if (status == MediaPipelineBackend::kBufferFailed) {
LOG(WARNING) << "AvPipelineImpl: PushFrame failed";
enable_feeding_ = false;
state_ = kError;

Powered by Google App Engine
This is Rietveld 408576698