Commit 460e571b authored by acolwell@chromium.org's avatar acolwell@chromium.org

Migrate Pipeline & PipelineImpl to PipelineStatusCB.

BUG=90214
TEST=PipelineImplTest.*

Review URL: http://codereview.chromium.org/7484054

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@96096 0039d316-1c4b-4281-b951-d872f2087c98
parent 6e0b1444
...@@ -173,10 +173,8 @@ void RunFilterStatusCB(::testing::Unused, const FilterStatusCB& cb) { ...@@ -173,10 +173,8 @@ void RunFilterStatusCB(::testing::Unused, const FilterStatusCB& cb) {
cb.Run(PIPELINE_OK); cb.Run(PIPELINE_OK);
} }
void RunPipelineStatusCallback( void RunPipelineStatusCB(PipelineStatus status, const PipelineStatusCB& cb) {
PipelineStatus status, PipelineStatusCallback* callback) { cb.Run(status);
callback->Run(status);
delete callback;
} }
void RunFilterCallback3(::testing::Unused, FilterCallback* callback, void RunFilterCallback3(::testing::Unused, FilterCallback* callback,
......
...@@ -312,8 +312,7 @@ class MockFilterCollection { ...@@ -312,8 +312,7 @@ class MockFilterCollection {
// the Initialize() and Seek() methods. // the Initialize() and Seek() methods.
void RunFilterCallback(::testing::Unused, FilterCallback* callback); void RunFilterCallback(::testing::Unused, FilterCallback* callback);
void RunFilterStatusCB(::testing::Unused, const FilterStatusCB& cb); void RunFilterStatusCB(::testing::Unused, const FilterStatusCB& cb);
void RunPipelineStatusCallback(PipelineStatus status, void RunPipelineStatusCB(PipelineStatus status, const PipelineStatusCB& cb);
PipelineStatusCallback* callback);
void RunFilterCallback3(::testing::Unused, FilterCallback* callback, void RunFilterCallback3(::testing::Unused, FilterCallback* callback,
::testing::Unused); ::testing::Unused);
......
...@@ -11,7 +11,6 @@ ...@@ -11,7 +11,6 @@
#include <string> #include <string>
#include "base/callback.h"
#include "media/base/filters.h" #include "media/base/filters.h"
#include "media/base/pipeline_status.h" #include "media/base/pipeline_status.h"
...@@ -46,9 +45,9 @@ class Pipeline : public base::RefCountedThreadSafe<Pipeline> { ...@@ -46,9 +45,9 @@ class Pipeline : public base::RefCountedThreadSafe<Pipeline> {
// |ended_callback| will be executed when the media reaches the end. // |ended_callback| will be executed when the media reaches the end.
// |error_callback_| will be executed upon an error in the pipeline. // |error_callback_| will be executed upon an error in the pipeline.
// |network_callback_| will be executed when there's a network event. // |network_callback_| will be executed when there's a network event.
virtual void Init(PipelineStatusCallback* ended_callback, virtual void Init(const PipelineStatusCB& ended_callback,
PipelineStatusCallback* error_callback, const PipelineStatusCB& error_callback,
PipelineStatusCallback* network_callback) = 0; const PipelineStatusCB& network_callback) = 0;
// Build a pipeline to render the given URL using the given filter collection // Build a pipeline to render the given URL using the given filter collection
// to construct a filter chain. Returns true if successful, false otherwise // to construct a filter chain. Returns true if successful, false otherwise
...@@ -63,7 +62,7 @@ class Pipeline : public base::RefCountedThreadSafe<Pipeline> { ...@@ -63,7 +62,7 @@ class Pipeline : public base::RefCountedThreadSafe<Pipeline> {
// pipeline initialization completes. // pipeline initialization completes.
virtual bool Start(FilterCollection* filter_collection, virtual bool Start(FilterCollection* filter_collection,
const std::string& url, const std::string& url,
PipelineStatusCallback* start_callback) = 0; const PipelineStatusCB& start_callback) = 0;
// Asynchronously stops the pipeline and resets it to an uninitialized state. // Asynchronously stops the pipeline and resets it to an uninitialized state.
// If provided, |stop_callback| will be executed when the pipeline has been // If provided, |stop_callback| will be executed when the pipeline has been
...@@ -75,7 +74,7 @@ class Pipeline : public base::RefCountedThreadSafe<Pipeline> { ...@@ -75,7 +74,7 @@ class Pipeline : public base::RefCountedThreadSafe<Pipeline> {
// //
// TODO(scherkus): ideally clients would destroy the pipeline after calling // TODO(scherkus): ideally clients would destroy the pipeline after calling
// Stop() and create a new pipeline as needed. // Stop() and create a new pipeline as needed.
virtual void Stop(PipelineStatusCallback* stop_callback) = 0; virtual void Stop(const PipelineStatusCB& stop_callback) = 0;
// Attempt to seek to the position specified by time. |seek_callback| will be // Attempt to seek to the position specified by time. |seek_callback| will be
// executed when the all filters in the pipeline have processed the seek. // executed when the all filters in the pipeline have processed the seek.
...@@ -83,7 +82,7 @@ class Pipeline : public base::RefCountedThreadSafe<Pipeline> { ...@@ -83,7 +82,7 @@ class Pipeline : public base::RefCountedThreadSafe<Pipeline> {
// Clients are expected to call GetCurrentTime() to check whether the seek // Clients are expected to call GetCurrentTime() to check whether the seek
// succeeded. // succeeded.
virtual void Seek(base::TimeDelta time, virtual void Seek(base::TimeDelta time,
PipelineStatusCallback* seek_callback) = 0; const PipelineStatusCB& seek_callback) = 0;
// Returns true if the pipeline has been started via Start(). If IsRunning() // Returns true if the pipeline has been started via Start(). If IsRunning()
// returns true, it is expected that Stop() will be called before destroying // returns true, it is expected that Stop() will be called before destroying
......
...@@ -25,15 +25,15 @@ const char kRawMediaScheme[] = "x-raw-media"; ...@@ -25,15 +25,15 @@ const char kRawMediaScheme[] = "x-raw-media";
PipelineStatusNotification::PipelineStatusNotification() PipelineStatusNotification::PipelineStatusNotification()
: cv_(&lock_), status_(PIPELINE_OK), notified_(false) { : cv_(&lock_), status_(PIPELINE_OK), notified_(false) {
callback_.reset(NewCallback(this, &PipelineStatusNotification::Notify));
} }
PipelineStatusNotification::~PipelineStatusNotification() { PipelineStatusNotification::~PipelineStatusNotification() {
DCHECK(notified_); DCHECK(notified_);
} }
media::PipelineStatusCallback* PipelineStatusNotification::Callback() { PipelineStatusCB PipelineStatusNotification::Callback() {
return callback_.release(); return base::Bind(&PipelineStatusNotification::Notify,
base::Unretained(this));
} }
void PipelineStatusNotification::Notify(media::PipelineStatus status) { void PipelineStatusNotification::Notify(media::PipelineStatus status) {
...@@ -86,22 +86,21 @@ PipelineImpl::~PipelineImpl() { ...@@ -86,22 +86,21 @@ PipelineImpl::~PipelineImpl() {
media_log_->CreateEvent(MediaLogEvent::PIPELINE_DESTROYED)); media_log_->CreateEvent(MediaLogEvent::PIPELINE_DESTROYED));
} }
void PipelineImpl::Init(PipelineStatusCallback* ended_callback, void PipelineImpl::Init(const PipelineStatusCB& ended_callback,
PipelineStatusCallback* error_callback, const PipelineStatusCB& error_callback,
PipelineStatusCallback* network_callback) { const PipelineStatusCB& network_callback) {
DCHECK(!IsRunning()) DCHECK(!IsRunning())
<< "Init() should be called before the pipeline has started"; << "Init() should be called before the pipeline has started";
ended_callback_.reset(ended_callback); ended_callback_ = ended_callback;
error_callback_.reset(error_callback); error_callback_ = error_callback;
network_callback_.reset(network_callback); network_callback_ = network_callback;
} }
// Creates the PipelineInternal and calls it's start method. // Creates the PipelineInternal and calls it's start method.
bool PipelineImpl::Start(FilterCollection* collection, bool PipelineImpl::Start(FilterCollection* collection,
const std::string& url, const std::string& url,
PipelineStatusCallback* start_callback) { const PipelineStatusCB& start_callback) {
base::AutoLock auto_lock(lock_); base::AutoLock auto_lock(lock_);
scoped_ptr<PipelineStatusCallback> callback(start_callback);
scoped_ptr<FilterCollection> filter_collection(collection); scoped_ptr<FilterCollection> filter_collection(collection);
if (running_) { if (running_) {
...@@ -121,13 +120,12 @@ bool PipelineImpl::Start(FilterCollection* collection, ...@@ -121,13 +120,12 @@ bool PipelineImpl::Start(FilterCollection* collection,
&PipelineImpl::StartTask, &PipelineImpl::StartTask,
filter_collection.release(), filter_collection.release(),
url, url,
callback.release())); start_callback));
return true; return true;
} }
void PipelineImpl::Stop(PipelineStatusCallback* stop_callback) { void PipelineImpl::Stop(const PipelineStatusCB& stop_callback) {
base::AutoLock auto_lock(lock_); base::AutoLock auto_lock(lock_);
scoped_ptr<PipelineStatusCallback> callback(stop_callback);
if (!running_) { if (!running_) {
VLOG(1) << "Media pipeline has already stopped"; VLOG(1) << "Media pipeline has already stopped";
return; return;
...@@ -135,21 +133,19 @@ void PipelineImpl::Stop(PipelineStatusCallback* stop_callback) { ...@@ -135,21 +133,19 @@ void PipelineImpl::Stop(PipelineStatusCallback* stop_callback) {
// Stop the pipeline, which will set |running_| to false on behalf. // Stop the pipeline, which will set |running_| to false on behalf.
message_loop_->PostTask(FROM_HERE, message_loop_->PostTask(FROM_HERE,
NewRunnableMethod(this, &PipelineImpl::StopTask, callback.release())); NewRunnableMethod(this, &PipelineImpl::StopTask, stop_callback));
} }
void PipelineImpl::Seek(base::TimeDelta time, void PipelineImpl::Seek(base::TimeDelta time,
PipelineStatusCallback* seek_callback) { const PipelineStatusCB& seek_callback) {
base::AutoLock auto_lock(lock_); base::AutoLock auto_lock(lock_);
scoped_ptr<PipelineStatusCallback> callback(seek_callback);
if (!running_) { if (!running_) {
VLOG(1) << "Media pipeline must be running"; VLOG(1) << "Media pipeline must be running";
return; return;
} }
message_loop_->PostTask(FROM_HERE, message_loop_->PostTask(FROM_HERE,
NewRunnableMethod(this, &PipelineImpl::SeekTask, time, NewRunnableMethod(this, &PipelineImpl::SeekTask, time, seek_callback));
callback.release()));
} }
bool PipelineImpl::IsRunning() const { bool PipelineImpl::IsRunning() const {
...@@ -428,9 +424,9 @@ void PipelineImpl::FinishInitialization() { ...@@ -428,9 +424,9 @@ void PipelineImpl::FinishInitialization() {
DCHECK_EQ(MessageLoop::current(), message_loop_); DCHECK_EQ(MessageLoop::current(), message_loop_);
// Execute the seek callback, if present. Note that this might be the // Execute the seek callback, if present. Note that this might be the
// initial callback passed into Start(). // initial callback passed into Start().
if (seek_callback_.get()) { if (!seek_callback_.is_null()) {
seek_callback_->Run(status_); seek_callback_.Run(status_);
seek_callback_.reset(); seek_callback_.Reset();
} }
} }
...@@ -615,12 +611,12 @@ void PipelineImpl::OnUpdateStatistics(const PipelineStatistics& stats) { ...@@ -615,12 +611,12 @@ void PipelineImpl::OnUpdateStatistics(const PipelineStatistics& stats) {
void PipelineImpl::StartTask(FilterCollection* filter_collection, void PipelineImpl::StartTask(FilterCollection* filter_collection,
const std::string& url, const std::string& url,
PipelineStatusCallback* start_callback) { const PipelineStatusCB& start_callback) {
DCHECK_EQ(MessageLoop::current(), message_loop_); DCHECK_EQ(MessageLoop::current(), message_loop_);
DCHECK_EQ(kCreated, state_); DCHECK_EQ(kCreated, state_);
filter_collection_.reset(filter_collection); filter_collection_.reset(filter_collection);
url_ = url; url_ = url;
seek_callback_.reset(start_callback); seek_callback_ = start_callback;
// Kick off initialization. // Kick off initialization.
pipeline_init_state_.reset(new PipelineInitState()); pipeline_init_state_.reset(new PipelineInitState());
...@@ -754,15 +750,14 @@ void PipelineImpl::InitializeTask() { ...@@ -754,15 +750,14 @@ void PipelineImpl::InitializeTask() {
// TODO(scherkus): beware! this can get posted multiple times since we post // TODO(scherkus): beware! this can get posted multiple times since we post
// Stop() tasks even if we've already stopped. Perhaps this should no-op for // Stop() tasks even if we've already stopped. Perhaps this should no-op for
// additional calls, however most of this logic will be changing. // additional calls, however most of this logic will be changing.
void PipelineImpl::StopTask(PipelineStatusCallback* stop_callback) { void PipelineImpl::StopTask(const PipelineStatusCB& stop_callback) {
DCHECK_EQ(MessageLoop::current(), message_loop_); DCHECK_EQ(MessageLoop::current(), message_loop_);
DCHECK(!IsPipelineStopPending()); DCHECK(!IsPipelineStopPending());
DCHECK_NE(state_, kStopped); DCHECK_NE(state_, kStopped);
if (state_ == kStopped) { if (state_ == kStopped) {
// Already stopped so just run callback. // Already stopped so just run callback.
stop_callback->Run(status_); stop_callback.Run(status_);
delete stop_callback;
return; return;
} }
...@@ -776,7 +771,7 @@ void PipelineImpl::StopTask(PipelineStatusCallback* stop_callback) { ...@@ -776,7 +771,7 @@ void PipelineImpl::StopTask(PipelineStatusCallback* stop_callback) {
error_caused_teardown_ = false; error_caused_teardown_ = false;
} }
stop_callback_.reset(stop_callback); stop_callback_ = stop_callback;
stop_pending_ = true; stop_pending_ = true;
if (!IsPipelineSeeking() && !IsPipelineTearingDown()) { if (!IsPipelineSeeking() && !IsPipelineTearingDown()) {
...@@ -850,7 +845,7 @@ void PipelineImpl::PreloadChangedTask(Preload preload) { ...@@ -850,7 +845,7 @@ void PipelineImpl::PreloadChangedTask(Preload preload) {
} }
void PipelineImpl::SeekTask(base::TimeDelta time, void PipelineImpl::SeekTask(base::TimeDelta time,
PipelineStatusCallback* seek_callback) { const PipelineStatusCB& seek_callback) {
DCHECK_EQ(MessageLoop::current(), message_loop_); DCHECK_EQ(MessageLoop::current(), message_loop_);
DCHECK(!IsPipelineStopPending()); DCHECK(!IsPipelineStopPending());
...@@ -860,7 +855,6 @@ void PipelineImpl::SeekTask(base::TimeDelta time, ...@@ -860,7 +855,6 @@ void PipelineImpl::SeekTask(base::TimeDelta time,
// will only execute the first Seek() request. // will only execute the first Seek() request.
VLOG(1) << "Media pipeline has not started, ignoring seek to " VLOG(1) << "Media pipeline has not started, ignoring seek to "
<< time.InMicroseconds(); << time.InMicroseconds();
delete seek_callback;
return; return;
} }
...@@ -876,7 +870,7 @@ void PipelineImpl::SeekTask(base::TimeDelta time, ...@@ -876,7 +870,7 @@ void PipelineImpl::SeekTask(base::TimeDelta time,
// kStarted // kStarted
SetState(kPausing); SetState(kPausing);
seek_timestamp_ = time; seek_timestamp_ = time;
seek_callback_.reset(seek_callback); seek_callback_ = seek_callback;
// Kick off seeking! // Kick off seeking!
{ {
...@@ -919,15 +913,15 @@ void PipelineImpl::NotifyEndedTask() { ...@@ -919,15 +913,15 @@ void PipelineImpl::NotifyEndedTask() {
// Transition to ended, executing the callback if present. // Transition to ended, executing the callback if present.
SetState(kEnded); SetState(kEnded);
if (ended_callback_.get()) { if (!ended_callback_.is_null()) {
ended_callback_->Run(status_); ended_callback_.Run(status_);
} }
} }
void PipelineImpl::NotifyNetworkEventTask() { void PipelineImpl::NotifyNetworkEventTask() {
DCHECK_EQ(MessageLoop::current(), message_loop_); DCHECK_EQ(MessageLoop::current(), message_loop_);
if (network_callback_.get()) { if (!network_callback_.is_null()) {
network_callback_->Run(status_); network_callback_.Run(status_);
} }
} }
...@@ -1072,16 +1066,17 @@ void PipelineImpl::FinishDestroyingFiltersTask() { ...@@ -1072,16 +1066,17 @@ void PipelineImpl::FinishDestroyingFiltersTask() {
pipeline_filter_ = NULL; pipeline_filter_ = NULL;
if (error_caused_teardown_ && !IsPipelineOk() && error_callback_.get()) if (error_caused_teardown_ && !IsPipelineOk() && !error_callback_.is_null())
error_callback_->Run(status_); error_callback_.Run(status_);
if (stop_pending_) { if (stop_pending_) {
stop_pending_ = false; stop_pending_ = false;
ResetState(); ResetState();
scoped_ptr<PipelineStatusCallback> stop_callback(stop_callback_.release()); PipelineStatusCB stop_cb;
std::swap(stop_cb, stop_callback_);
// Notify the client that stopping has finished. // Notify the client that stopping has finished.
if (stop_callback.get()) { if (!stop_cb.is_null()) {
stop_callback->Run(status_); stop_cb.Run(status_);
} }
} }
......
...@@ -41,17 +41,17 @@ class PipelineStatusNotification { ...@@ -41,17 +41,17 @@ class PipelineStatusNotification {
~PipelineStatusNotification(); ~PipelineStatusNotification();
// See class-level comment for usage. // See class-level comment for usage.
media::PipelineStatusCallback* Callback(); PipelineStatusCB Callback();
void Notify(media::PipelineStatus status);
void Wait(); void Wait();
media::PipelineStatus status(); PipelineStatus status();
private: private:
void Notify(media::PipelineStatus status);
base::Lock lock_; base::Lock lock_;
base::ConditionVariable cv_; base::ConditionVariable cv_;
media::PipelineStatus status_; media::PipelineStatus status_;
bool notified_; bool notified_;
scoped_ptr<media::PipelineStatusCallback> callback_;
DISALLOW_COPY_AND_ASSIGN(PipelineStatusNotification); DISALLOW_COPY_AND_ASSIGN(PipelineStatusNotification);
}; };
...@@ -98,15 +98,15 @@ class PipelineImpl : public Pipeline, public FilterHost { ...@@ -98,15 +98,15 @@ class PipelineImpl : public Pipeline, public FilterHost {
explicit PipelineImpl(MessageLoop* message_loop, MediaLog* media_log); explicit PipelineImpl(MessageLoop* message_loop, MediaLog* media_log);
// Pipeline implementation. // Pipeline implementation.
virtual void Init(PipelineStatusCallback* ended_callback, virtual void Init(const PipelineStatusCB& ended_callback,
PipelineStatusCallback* error_callback, const PipelineStatusCB& error_callback,
PipelineStatusCallback* network_callback); const PipelineStatusCB& network_callback);
virtual bool Start(FilterCollection* filter_collection, virtual bool Start(FilterCollection* filter_collection,
const std::string& uri, const std::string& uri,
PipelineStatusCallback* start_callback); const PipelineStatusCB& start_callback);
virtual void Stop(PipelineStatusCallback* stop_callback); virtual void Stop(const PipelineStatusCB& stop_callback);
virtual void Seek(base::TimeDelta time, virtual void Seek(base::TimeDelta time,
PipelineStatusCallback* seek_callback); const PipelineStatusCB& seek_callback);
virtual bool IsRunning() const; virtual bool IsRunning() const;
virtual bool IsInitialized() const; virtual bool IsInitialized() const;
virtual bool IsNetworkActive() const; virtual bool IsNetworkActive() const;
...@@ -226,7 +226,7 @@ class PipelineImpl : public Pipeline, public FilterHost { ...@@ -226,7 +226,7 @@ class PipelineImpl : public Pipeline, public FilterHost {
// message loop. // message loop.
void StartTask(FilterCollection* filter_collection, void StartTask(FilterCollection* filter_collection,
const std::string& url, const std::string& url,
PipelineStatusCallback* start_callback); const PipelineStatusCB& start_callback);
// InitializeTask() performs initialization in multiple passes. It is executed // InitializeTask() performs initialization in multiple passes. It is executed
// as a result of calling Start() or InitializationComplete() that advances // as a result of calling Start() or InitializationComplete() that advances
...@@ -235,7 +235,7 @@ class PipelineImpl : public Pipeline, public FilterHost { ...@@ -235,7 +235,7 @@ class PipelineImpl : public Pipeline, public FilterHost {
void InitializeTask(); void InitializeTask();
// Stops and destroys all filters, placing the pipeline in the kStopped state. // Stops and destroys all filters, placing the pipeline in the kStopped state.
void StopTask(PipelineStatusCallback* stop_callback); void StopTask(const PipelineStatusCB& stop_callback);
// Carries out stopping and destroying all filters, placing the pipeline in // Carries out stopping and destroying all filters, placing the pipeline in
// the kError state. // the kError state.
...@@ -254,7 +254,7 @@ class PipelineImpl : public Pipeline, public FilterHost { ...@@ -254,7 +254,7 @@ class PipelineImpl : public Pipeline, public FilterHost {
void PreloadChangedTask(Preload preload); void PreloadChangedTask(Preload preload);
// Carries out notifying filters that we are seeking to a new timestamp. // Carries out notifying filters that we are seeking to a new timestamp.
void SeekTask(base::TimeDelta time, PipelineStatusCallback* seek_callback); void SeekTask(base::TimeDelta time, const PipelineStatusCB& seek_callback);
// Carries out handling a notification from a filter that it has ended. // Carries out handling a notification from a filter that it has ended.
void NotifyEndedTask(); void NotifyEndedTask();
...@@ -436,11 +436,11 @@ class PipelineImpl : public Pipeline, public FilterHost { ...@@ -436,11 +436,11 @@ class PipelineImpl : public Pipeline, public FilterHost {
std::string url_; std::string url_;
// Callbacks for various pipeline operations. // Callbacks for various pipeline operations.
scoped_ptr<PipelineStatusCallback> seek_callback_; PipelineStatusCB seek_callback_;
scoped_ptr<PipelineStatusCallback> stop_callback_; PipelineStatusCB stop_callback_;
scoped_ptr<PipelineStatusCallback> ended_callback_; PipelineStatusCB ended_callback_;
scoped_ptr<PipelineStatusCallback> error_callback_; PipelineStatusCB error_callback_;
scoped_ptr<PipelineStatusCallback> network_callback_; PipelineStatusCB network_callback_;
// Reference to the filter(s) that constitute the pipeline. // Reference to the filter(s) that constitute the pipeline.
scoped_refptr<Filter> pipeline_filter_; scoped_refptr<Filter> pipeline_filter_;
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include <string> #include <string>
#include "base/bind.h"
#include "base/callback.h" #include "base/callback.h"
#include "base/stl_util.h" #include "base/stl_util.h"
#include "base/threading/simple_thread.h" #include "base/threading/simple_thread.h"
...@@ -64,11 +65,9 @@ class PipelineImplTest : public ::testing::Test { ...@@ -64,11 +65,9 @@ class PipelineImplTest : public ::testing::Test {
PipelineImplTest() PipelineImplTest()
: pipeline_(new PipelineImpl(&message_loop_, new MediaLog())) { : pipeline_(new PipelineImpl(&message_loop_, new MediaLog())) {
pipeline_->Init( pipeline_->Init(
NewCallback(reinterpret_cast<CallbackHelper*>(&callbacks_), base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)),
&CallbackHelper::OnEnded), base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)),
NewCallback(reinterpret_cast<CallbackHelper*>(&callbacks_), PipelineStatusCB());
&CallbackHelper::OnError),
static_cast<PipelineStatusCallback*>(NULL));
mocks_.reset(new MockFilterCollection()); mocks_.reset(new MockFilterCollection());
// InitializeDemuxer adds overriding expectations for expected non-NULL // InitializeDemuxer adds overriding expectations for expected non-NULL
...@@ -88,8 +87,8 @@ class PipelineImplTest : public ::testing::Test { ...@@ -88,8 +87,8 @@ class PipelineImplTest : public ::testing::Test {
// Expect a stop callback if we were started. // Expect a stop callback if we were started.
EXPECT_CALL(callbacks_, OnStop(PIPELINE_OK)); EXPECT_CALL(callbacks_, OnStop(PIPELINE_OK));
pipeline_->Stop(NewCallback(reinterpret_cast<CallbackHelper*>(&callbacks_), pipeline_->Stop(base::Bind(&CallbackHelper::OnStop,
&CallbackHelper::OnStop)); base::Unretained(&callbacks_)));
message_loop_.RunAllPending(); message_loop_.RunAllPending();
mocks_.reset(); mocks_.reset();
...@@ -214,8 +213,8 @@ class PipelineImplTest : public ::testing::Test { ...@@ -214,8 +213,8 @@ class PipelineImplTest : public ::testing::Test {
run_build, run_build,
build_status), build_status),
url, url,
NewCallback(reinterpret_cast<CallbackHelper*>(&callbacks_), base::Bind(&CallbackHelper::OnStart,
&CallbackHelper::OnStart)); base::Unretained(&callbacks_)));
message_loop_.RunAllPending(); message_loop_.RunAllPending();
} }
...@@ -261,8 +260,8 @@ class PipelineImplTest : public ::testing::Test { ...@@ -261,8 +260,8 @@ class PipelineImplTest : public ::testing::Test {
void DoSeek(const base::TimeDelta& seek_time) { void DoSeek(const base::TimeDelta& seek_time) {
pipeline_->Seek(seek_time, pipeline_->Seek(seek_time,
NewCallback(reinterpret_cast<CallbackHelper*>(&callbacks_), base::Bind(&CallbackHelper::OnSeek,
&CallbackHelper::OnSeek)); base::Unretained(&callbacks_)));
// We expect the time to be updated only after the seek has completed. // We expect the time to be updated only after the seek has completed.
EXPECT_NE(seek_time, pipeline_->GetCurrentTime()); EXPECT_NE(seek_time, pipeline_->GetCurrentTime());
...@@ -289,11 +288,11 @@ TEST_F(PipelineImplTest, NotStarted) { ...@@ -289,11 +288,11 @@ TEST_F(PipelineImplTest, NotStarted) {
// StrictMock<> will ensure these never get called, and valgrind/purify will // StrictMock<> will ensure these never get called, and valgrind/purify will
// make sure the callbacks are instantly deleted. // make sure the callbacks are instantly deleted.
pipeline_->Stop(NewCallback(reinterpret_cast<CallbackHelper*>(&callbacks_), pipeline_->Stop(base::Bind(&CallbackHelper::OnStop,
&CallbackHelper::OnStop)); base::Unretained(&callbacks_)));
pipeline_->Seek(kZero, pipeline_->Seek(kZero,
NewCallback(reinterpret_cast<CallbackHelper*>(&callbacks_), base::Bind(&CallbackHelper::OnSeek,
&CallbackHelper::OnSeek)); base::Unretained(&callbacks_)));
EXPECT_FALSE(pipeline_->IsRunning()); EXPECT_FALSE(pipeline_->IsRunning());
EXPECT_FALSE(pipeline_->IsInitialized()); EXPECT_FALSE(pipeline_->IsInitialized());
...@@ -338,8 +337,8 @@ TEST_F(PipelineImplTest, NeverInitializes) { ...@@ -338,8 +337,8 @@ TEST_F(PipelineImplTest, NeverInitializes) {
true, true,
PIPELINE_OK), PIPELINE_OK),
"", "",
NewCallback(reinterpret_cast<CallbackHelper*>(&callbacks_), base::Bind(&CallbackHelper::OnStart,
&CallbackHelper::OnStart)); base::Unretained(&callbacks_)));
message_loop_.RunAllPending(); message_loop_.RunAllPending();
EXPECT_FALSE(pipeline_->IsInitialized()); EXPECT_FALSE(pipeline_->IsInitialized());
...@@ -366,8 +365,8 @@ TEST_F(PipelineImplTest, RequiredFilterMissing) { ...@@ -366,8 +365,8 @@ TEST_F(PipelineImplTest, RequiredFilterMissing) {
true, true,
PIPELINE_ERROR_REQUIRED_FILTER_MISSING); PIPELINE_ERROR_REQUIRED_FILTER_MISSING);
pipeline_->Start(collection, "", pipeline_->Start(collection, "",
NewCallback(reinterpret_cast<CallbackHelper*>(&callbacks_), base::Bind(&CallbackHelper::OnStart,
&CallbackHelper::OnStart)); base::Unretained(&callbacks_)));
message_loop_.RunAllPending(); message_loop_.RunAllPending();
EXPECT_FALSE(pipeline_->IsInitialized()); EXPECT_FALSE(pipeline_->IsInitialized());
...@@ -800,8 +799,8 @@ TEST_F(PipelineImplTest, ErrorDuringSeek) { ...@@ -800,8 +799,8 @@ TEST_F(PipelineImplTest, ErrorDuringSeek) {
EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _)) EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _))
.WillOnce(Invoke(&SendReadErrorToCB)); .WillOnce(Invoke(&SendReadErrorToCB));
pipeline_->Seek(seek_time, NewCallback( pipeline_->Seek(seek_time,base::Bind(&CallbackHelper::OnSeek,
reinterpret_cast<CallbackHelper*>(&callbacks_), &CallbackHelper::OnSeek)); base::Unretained(&callbacks_)));
EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ));
EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ)); EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ));
message_loop_.RunAllPending(); message_loop_.RunAllPending();
...@@ -851,23 +850,23 @@ TEST_F(PipelineImplTest, StartTimeIsNonZero) { ...@@ -851,23 +850,23 @@ TEST_F(PipelineImplTest, StartTimeIsNonZero) {
class FlexibleCallbackRunner : public base::DelegateSimpleThread::Delegate { class FlexibleCallbackRunner : public base::DelegateSimpleThread::Delegate {
public: public:
FlexibleCallbackRunner(int delayInMs, PipelineStatus status, FlexibleCallbackRunner(int delayInMs, PipelineStatus status,
PipelineStatusCallback* callback) const PipelineStatusCB& callback)
: delayInMs_(delayInMs), status_(status), callback_(callback) { : delayInMs_(delayInMs), status_(status), callback_(callback) {
if (delayInMs_ < 0) { if (delayInMs_ < 0) {
callback_->Run(status_); callback_.Run(status_);
return; return;
} }
} }
virtual void Run() { virtual void Run() {
if (delayInMs_ < 0) return; if (delayInMs_ < 0) return;
base::PlatformThread::Sleep(delayInMs_); base::PlatformThread::Sleep(delayInMs_);
callback_->Run(status_); callback_.Run(status_);
} }
private: private:
int delayInMs_; int delayInMs_;
PipelineStatus status_; PipelineStatus status_;
scoped_ptr<PipelineStatusCallback> callback_; PipelineStatusCB callback_;
}; };
void TestPipelineStatusNotification(int delayInMs) { void TestPipelineStatusNotification(int delayInMs) {
......
...@@ -34,7 +34,6 @@ enum PipelineStatus { ...@@ -34,7 +34,6 @@ enum PipelineStatus {
DATASOURCE_ERROR_URL_NOT_SUPPORTED, DATASOURCE_ERROR_URL_NOT_SUPPORTED,
}; };
typedef Callback1<media::PipelineStatus>::Type PipelineStatusCallback;
typedef base::Callback<void(PipelineStatus)> PipelineStatusCB; typedef base::Callback<void(PipelineStatus)> PipelineStatusCB;
} // namespace media } // namespace media
......
...@@ -331,7 +331,7 @@ void FFmpegDemuxer::set_host(FilterHost* filter_host) { ...@@ -331,7 +331,7 @@ void FFmpegDemuxer::set_host(FilterHost* filter_host) {
} }
void FFmpegDemuxer::Initialize(DataSource* data_source, void FFmpegDemuxer::Initialize(DataSource* data_source,
PipelineStatusCallback* callback) { const PipelineStatusCB& callback) {
message_loop_->PostTask( message_loop_->PostTask(
FROM_HERE, FROM_HERE,
NewRunnableMethod(this, NewRunnableMethod(this,
...@@ -426,9 +426,8 @@ MessageLoop* FFmpegDemuxer::message_loop() { ...@@ -426,9 +426,8 @@ MessageLoop* FFmpegDemuxer::message_loop() {
} }
void FFmpegDemuxer::InitializeTask(DataSource* data_source, void FFmpegDemuxer::InitializeTask(DataSource* data_source,
PipelineStatusCallback* callback) { const PipelineStatusCB& callback) {
DCHECK_EQ(MessageLoop::current(), message_loop_); DCHECK_EQ(MessageLoop::current(), message_loop_);
scoped_ptr<PipelineStatusCallback> callback_deleter(callback);
data_source_ = data_source; data_source_ = data_source;
if (host()) if (host())
...@@ -446,7 +445,7 @@ void FFmpegDemuxer::InitializeTask(DataSource* data_source, ...@@ -446,7 +445,7 @@ void FFmpegDemuxer::InitializeTask(DataSource* data_source,
FFmpegGlue::GetInstance()->RemoveProtocol(this); FFmpegGlue::GetInstance()->RemoveProtocol(this);
if (result < 0) { if (result < 0) {
callback->Run(DEMUXER_ERROR_COULD_NOT_OPEN); callback.Run(DEMUXER_ERROR_COULD_NOT_OPEN);
return; return;
} }
...@@ -456,7 +455,7 @@ void FFmpegDemuxer::InitializeTask(DataSource* data_source, ...@@ -456,7 +455,7 @@ void FFmpegDemuxer::InitializeTask(DataSource* data_source,
// Fully initialize AVFormatContext by parsing the stream a little. // Fully initialize AVFormatContext by parsing the stream a little.
result = av_find_stream_info(format_context_); result = av_find_stream_info(format_context_);
if (result < 0) { if (result < 0) {
callback->Run(DEMUXER_ERROR_COULD_NOT_PARSE); callback.Run(DEMUXER_ERROR_COULD_NOT_PARSE);
return; return;
} }
...@@ -497,7 +496,7 @@ void FFmpegDemuxer::InitializeTask(DataSource* data_source, ...@@ -497,7 +496,7 @@ void FFmpegDemuxer::InitializeTask(DataSource* data_source,
} }
} }
if (no_supported_streams) { if (no_supported_streams) {
callback->Run(DEMUXER_ERROR_NO_SUPPORTED_STREAMS); callback.Run(DEMUXER_ERROR_NO_SUPPORTED_STREAMS);
return; return;
} }
if (format_context_->duration != static_cast<int64_t>(AV_NOPTS_VALUE)) { if (format_context_->duration != static_cast<int64_t>(AV_NOPTS_VALUE)) {
...@@ -523,7 +522,7 @@ void FFmpegDemuxer::InitializeTask(DataSource* data_source, ...@@ -523,7 +522,7 @@ void FFmpegDemuxer::InitializeTask(DataSource* data_source,
if (host()) if (host())
host()->SetDuration(max_duration); host()->SetDuration(max_duration);
max_duration_ = max_duration; max_duration_ = max_duration;
callback->Run(PIPELINE_OK); callback.Run(PIPELINE_OK);
} }
void FFmpegDemuxer::SeekTask(base::TimeDelta time, const FilterStatusCB& cb) { void FFmpegDemuxer::SeekTask(base::TimeDelta time, const FilterStatusCB& cb) {
......
...@@ -134,7 +134,7 @@ class FFmpegDemuxer : public Demuxer, public FFmpegURLProtocol { ...@@ -134,7 +134,7 @@ class FFmpegDemuxer : public Demuxer, public FFmpegURLProtocol {
virtual void PostDemuxTask(); virtual void PostDemuxTask();
void Initialize( void Initialize(
DataSource* data_source, PipelineStatusCallback* callback); DataSource* data_source, const PipelineStatusCB& callback);
// Filter implementation. // Filter implementation.
virtual void Stop(FilterCallback* callback); virtual void Stop(FilterCallback* callback);
...@@ -168,7 +168,7 @@ class FFmpegDemuxer : public Demuxer, public FFmpegURLProtocol { ...@@ -168,7 +168,7 @@ class FFmpegDemuxer : public Demuxer, public FFmpegURLProtocol {
// Carries out initialization on the demuxer thread. // Carries out initialization on the demuxer thread.
void InitializeTask( void InitializeTask(
DataSource* data_source, PipelineStatusCallback* callback); DataSource* data_source, const PipelineStatusCB& callback);
// Carries out a seek on the demuxer thread. // Carries out a seek on the demuxer thread.
void SeekTask(base::TimeDelta time, const FilterStatusCB& cb); void SeekTask(base::TimeDelta time, const FilterStatusCB& cb);
......
...@@ -2,12 +2,26 @@ ...@@ -2,12 +2,26 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "base/bind.h"
#include "base/message_loop.h" #include "base/message_loop.h"
#include "media/filters/ffmpeg_demuxer.h" #include "media/filters/ffmpeg_demuxer.h"
#include "media/filters/ffmpeg_demuxer_factory.h" #include "media/filters/ffmpeg_demuxer_factory.h"
namespace media { namespace media {
static void DemuxerInitDone(DemuxerFactory::BuildCallback* cb,
const scoped_refptr<FFmpegDemuxer>& demuxer,
PipelineStatus status) {
scoped_ptr<DemuxerFactory::BuildCallback> callback(cb);
if (status != PIPELINE_OK) {
callback->Run(status, static_cast<Demuxer*>(NULL));
return;
}
callback->Run(PIPELINE_OK, demuxer.get());
}
FFmpegDemuxerFactory::FFmpegDemuxerFactory( FFmpegDemuxerFactory::FFmpegDemuxerFactory(
DataSourceFactory* data_source_factory, DataSourceFactory* data_source_factory,
MessageLoop* loop) MessageLoop* loop)
...@@ -15,34 +29,11 @@ FFmpegDemuxerFactory::FFmpegDemuxerFactory( ...@@ -15,34 +29,11 @@ FFmpegDemuxerFactory::FFmpegDemuxerFactory(
FFmpegDemuxerFactory::~FFmpegDemuxerFactory() {} FFmpegDemuxerFactory::~FFmpegDemuxerFactory() {}
// This and the next class are one-offs whose raison d'etre is the lack of // This class is a one-off whose raison d'etre is the lack of
// currying functionality in base/callback_old.h's machinery. Once media/ // currying functionality in base/callback_old.h's machinery. Once
// PipelineStatusCallback and {DataSource,Demuxer}Factory::BuildCallback are // {DataSource,Demuxer}Factory::BuildCallback are migrated to the new
// migrated to the new base/callback.h machinery these should be removed and // base/callback.h machinery these should be removed and replaced
// replaced with currying calls to base::Bind(). // with currying calls to base::Bind().
class DemuxerCallbackAsPipelineStatusCallback : public PipelineStatusCallback {
public:
DemuxerCallbackAsPipelineStatusCallback(
DemuxerFactory::BuildCallback* cb,
Demuxer* demuxer)
: cb_(cb), demuxer_(demuxer) {
DCHECK(cb_.get() && demuxer_);
}
virtual ~DemuxerCallbackAsPipelineStatusCallback() {}
virtual void RunWithParams(const Tuple1<PipelineStatus>& params) {
cb_->Run(params.a, demuxer_);
}
private:
scoped_ptr<DemuxerFactory::BuildCallback> cb_;
scoped_refptr<Demuxer> demuxer_;
DISALLOW_IMPLICIT_CONSTRUCTORS(DemuxerCallbackAsPipelineStatusCallback);
};
// See comments on DemuxerCallbackAsPipelineStatusCallback above.
class DemuxerCallbackAsDataSourceCallback class DemuxerCallbackAsDataSourceCallback
: public DataSourceFactory::BuildCallback { : public DataSourceFactory::BuildCallback {
public: public:
...@@ -66,7 +57,7 @@ class DemuxerCallbackAsDataSourceCallback ...@@ -66,7 +57,7 @@ class DemuxerCallbackAsDataSourceCallback
scoped_refptr<FFmpegDemuxer> demuxer = new FFmpegDemuxer(loop_); scoped_refptr<FFmpegDemuxer> demuxer = new FFmpegDemuxer(loop_);
demuxer->Initialize( demuxer->Initialize(
data_source, data_source,
new DemuxerCallbackAsPipelineStatusCallback(cb_.release(), demuxer)); base::Bind(&DemuxerInitDone, cb_.release(), demuxer));
} }
private: private:
......
...@@ -147,7 +147,7 @@ class FFmpegDemuxerTest : public testing::Test { ...@@ -147,7 +147,7 @@ class FFmpegDemuxerTest : public testing::Test {
EXPECT_CALL(host_, SetDuration(expected_duration)); EXPECT_CALL(host_, SetDuration(expected_duration));
demuxer_->Initialize(data_source_.get(), demuxer_->Initialize(data_source_.get(),
NewExpectedStatusCallback(PIPELINE_OK)); NewExpectedStatusCB(PIPELINE_OK));
message_loop_.RunAllPending(); message_loop_.RunAllPending();
} }
...@@ -187,7 +187,7 @@ TEST_F(FFmpegDemuxerTest, Initialize_OpenFails) { ...@@ -187,7 +187,7 @@ TEST_F(FFmpegDemuxerTest, Initialize_OpenFails) {
.WillOnce(Return(-1)); .WillOnce(Return(-1));
demuxer_->Initialize(data_source_.get(), demuxer_->Initialize(data_source_.get(),
NewExpectedStatusCallback(DEMUXER_ERROR_COULD_NOT_OPEN)); NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN));
message_loop_.RunAllPending(); message_loop_.RunAllPending();
} }
...@@ -201,7 +201,7 @@ TEST_F(FFmpegDemuxerTest, Initialize_ParseFails) { ...@@ -201,7 +201,7 @@ TEST_F(FFmpegDemuxerTest, Initialize_ParseFails) {
demuxer_->Initialize( demuxer_->Initialize(
data_source_.get(), data_source_.get(),
NewExpectedStatusCallback(DEMUXER_ERROR_COULD_NOT_PARSE)); NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_PARSE));
message_loop_.RunAllPending(); message_loop_.RunAllPending();
} }
...@@ -215,7 +215,7 @@ TEST_F(FFmpegDemuxerTest, Initialize_NoStreams) { ...@@ -215,7 +215,7 @@ TEST_F(FFmpegDemuxerTest, Initialize_NoStreams) {
demuxer_->Initialize( demuxer_->Initialize(
data_source_.get(), data_source_.get(),
NewExpectedStatusCallback(DEMUXER_ERROR_NO_SUPPORTED_STREAMS)); NewExpectedStatusCB(DEMUXER_ERROR_NO_SUPPORTED_STREAMS));
message_loop_.RunAllPending(); message_loop_.RunAllPending();
} }
...@@ -230,7 +230,7 @@ TEST_F(FFmpegDemuxerTest, Initialize_DataStreamOnly) { ...@@ -230,7 +230,7 @@ TEST_F(FFmpegDemuxerTest, Initialize_DataStreamOnly) {
demuxer_->Initialize( demuxer_->Initialize(
data_source_.get(), data_source_.get(),
NewExpectedStatusCallback(DEMUXER_ERROR_NO_SUPPORTED_STREAMS)); NewExpectedStatusCB(DEMUXER_ERROR_NO_SUPPORTED_STREAMS));
message_loop_.RunAllPending(); message_loop_.RunAllPending();
} }
......
...@@ -132,7 +132,7 @@ void Movie::SetPosition(float position) { ...@@ -132,7 +132,7 @@ void Movie::SetPosition(float position) {
int64 us = static_cast<int64>(position * 1000000); int64 us = static_cast<int64>(position * 1000000);
base::TimeDelta time = base::TimeDelta::FromMicroseconds(us); base::TimeDelta time = base::TimeDelta::FromMicroseconds(us);
if (pipeline_) if (pipeline_)
pipeline_->Seek(time, NULL); pipeline_->Seek(time, media::PipelineStatusCB());
} }
...@@ -174,7 +174,7 @@ bool Movie::GetDumpYuvFileEnable() { ...@@ -174,7 +174,7 @@ bool Movie::GetDumpYuvFileEnable() {
// Teardown. // Teardown.
void Movie::Close() { void Movie::Close() {
if (pipeline_) { if (pipeline_) {
pipeline_->Stop(NULL); pipeline_->Stop(media::PipelineStatusCB());
pipeline_ = NULL; pipeline_ = NULL;
} }
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include "base/at_exit.h" #include "base/at_exit.h"
#include "base/bind.h"
#include "base/command_line.h" #include "base/command_line.h"
#include "base/file_path.h" #include "base/file_path.h"
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
...@@ -117,7 +118,7 @@ bool InitPipeline(MessageLoop* message_loop, ...@@ -117,7 +118,7 @@ bool InitPipeline(MessageLoop* message_loop,
note.Wait(); note.Wait();
if (note.status() != media::PIPELINE_OK) { if (note.status() != media::PIPELINE_OK) {
std::cout << "InitPipeline: " << note.status() << std::endl; std::cout << "InitPipeline: " << note.status() << std::endl;
(*pipeline)->Stop(NULL); (*pipeline)->Stop(media::PipelineStatusCB());
return false; return false;
} }
...@@ -138,7 +139,8 @@ void PeriodicalUpdate( ...@@ -138,7 +139,8 @@ void PeriodicalUpdate(
// interrupt signal was received during last time period. // interrupt signal was received during last time period.
// Quit message_loop only when pipeline is fully stopped. // Quit message_loop only when pipeline is fully stopped.
MessageLoopQuitter* quitter = new MessageLoopQuitter(message_loop); MessageLoopQuitter* quitter = new MessageLoopQuitter(message_loop);
pipeline->Stop(NewCallback(quitter, &MessageLoopQuitter::Quit)); pipeline->Stop(base::Bind(&MessageLoopQuitter::Quit,
base::Unretained(quitter)));
return; return;
} }
...@@ -162,7 +164,7 @@ void PeriodicalUpdate( ...@@ -162,7 +164,7 @@ void PeriodicalUpdate(
&border_width, &border_width,
&depth); &depth);
base::TimeDelta time = pipeline->GetMediaDuration(); base::TimeDelta time = pipeline->GetMediaDuration();
pipeline->Seek(time*e.xbutton.x/width, NULL); pipeline->Seek(time*e.xbutton.x/width, media::PipelineStatusCB());
} }
break; break;
case KeyPress: case KeyPress:
...@@ -172,7 +174,8 @@ void PeriodicalUpdate( ...@@ -172,7 +174,8 @@ void PeriodicalUpdate(
g_running = false; g_running = false;
// Quit message_loop only when pipeline is fully stopped. // Quit message_loop only when pipeline is fully stopped.
MessageLoopQuitter* quitter = new MessageLoopQuitter(message_loop); MessageLoopQuitter* quitter = new MessageLoopQuitter(message_loop);
pipeline->Stop(NewCallback(quitter, &MessageLoopQuitter::Quit)); pipeline->Stop(base::Bind(&MessageLoopQuitter::Quit,
base::Unretained(quitter)));
return; return;
} else if (key == XK_space) { } else if (key == XK_space) {
if (pipeline->GetPlaybackRate() < 0.01f) // paused if (pipeline->GetPlaybackRate() < 0.01f) // paused
......
...@@ -50,7 +50,6 @@ BufferedDataSource::BufferedDataSource( ...@@ -50,7 +50,6 @@ BufferedDataSource::BufferedDataSource(
frame_(frame), frame_(frame),
loader_(NULL), loader_(NULL),
network_activity_(false), network_activity_(false),
initialize_callback_(NULL),
read_callback_(NULL), read_callback_(NULL),
read_position_(0), read_position_(0),
read_size_(0), read_size_(0),
...@@ -91,23 +90,21 @@ void BufferedDataSource::set_host(media::FilterHost* host) { ...@@ -91,23 +90,21 @@ void BufferedDataSource::set_host(media::FilterHost* host) {
} }
void BufferedDataSource::Initialize(const std::string& url, void BufferedDataSource::Initialize(const std::string& url,
media::PipelineStatusCallback* callback) { const media::PipelineStatusCB& callback) {
// Saves the url. // Saves the url.
url_ = GURL(url); url_ = GURL(url);
// This data source doesn't support data:// protocol so reject it. // This data source doesn't support data:// protocol so reject it.
if (url_.SchemeIs(kDataScheme)) { if (url_.SchemeIs(kDataScheme)) {
callback->Run(media::DATASOURCE_ERROR_URL_NOT_SUPPORTED); callback.Run(media::DATASOURCE_ERROR_URL_NOT_SUPPORTED);
delete callback;
return; return;
} else if (!IsProtocolSupportedForMedia(url_)) { } else if (!IsProtocolSupportedForMedia(url_)) {
callback->Run(media::PIPELINE_ERROR_NETWORK); callback.Run(media::PIPELINE_ERROR_NETWORK);
delete callback;
return; return;
} }
DCHECK(callback); DCHECK(!callback.is_null());
initialize_callback_.reset(callback); initialize_cb_ = callback;
// Post a task to complete the initialization task. // Post a task to complete the initialization task.
render_loop_->PostTask(FROM_HERE, render_loop_->PostTask(FROM_HERE,
...@@ -116,9 +113,9 @@ void BufferedDataSource::Initialize(const std::string& url, ...@@ -116,9 +113,9 @@ void BufferedDataSource::Initialize(const std::string& url,
void BufferedDataSource::CancelInitialize() { void BufferedDataSource::CancelInitialize() {
base::AutoLock auto_lock(lock_); base::AutoLock auto_lock(lock_);
DCHECK(initialize_callback_.get()); DCHECK(!initialize_cb_.is_null());
initialize_callback_.reset(); initialize_cb_.Reset();
render_loop_->PostTask( render_loop_->PostTask(
FROM_HERE, NewRunnableMethod(this, &BufferedDataSource::CleanupTask)); FROM_HERE, NewRunnableMethod(this, &BufferedDataSource::CleanupTask));
...@@ -208,7 +205,7 @@ void BufferedDataSource::Abort() { ...@@ -208,7 +205,7 @@ void BufferedDataSource::Abort() {
void BufferedDataSource::InitializeTask() { void BufferedDataSource::InitializeTask() {
DCHECK(MessageLoop::current() == render_loop_); DCHECK(MessageLoop::current() == render_loop_);
DCHECK(!loader_.get()); DCHECK(!loader_.get());
if (stopped_on_render_loop_ || !initialize_callback_.get()) if (stopped_on_render_loop_ || initialize_cb_.is_null())
return; return;
if (url_.SchemeIs(kHttpScheme) || url_.SchemeIs(kHttpsScheme)) { if (url_.SchemeIs(kHttpScheme) || url_.SchemeIs(kHttpsScheme)) {
...@@ -385,12 +382,11 @@ void BufferedDataSource::DoneRead_Locked(int error) { ...@@ -385,12 +382,11 @@ void BufferedDataSource::DoneRead_Locked(int error) {
void BufferedDataSource::DoneInitialization_Locked( void BufferedDataSource::DoneInitialization_Locked(
media::PipelineStatus status) { media::PipelineStatus status) {
DCHECK(MessageLoop::current() == render_loop_); DCHECK(MessageLoop::current() == render_loop_);
DCHECK(initialize_callback_.get()); DCHECK(!initialize_cb_.is_null());
lock_.AssertAcquired(); lock_.AssertAcquired();
scoped_ptr<media::PipelineStatusCallback> initialize_callback( initialize_cb_.Run(status);
initialize_callback_.release()); initialize_cb_.Reset();
initialize_callback->Run(status);
} }
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
...@@ -402,7 +398,7 @@ void BufferedDataSource::HttpInitialStartCallback(int error) { ...@@ -402,7 +398,7 @@ void BufferedDataSource::HttpInitialStartCallback(int error) {
int64 instance_size = loader_->instance_size(); int64 instance_size = loader_->instance_size();
bool success = error == net::OK; bool success = error == net::OK;
if (!initialize_callback_.get()) { if (initialize_cb_.is_null()) {
loader_->Stop(); loader_->Stop();
return; return;
} }
...@@ -432,7 +428,7 @@ void BufferedDataSource::HttpInitialStartCallback(int error) { ...@@ -432,7 +428,7 @@ void BufferedDataSource::HttpInitialStartCallback(int error) {
return; return;
} }
// Reference to prevent destruction while inside the |initialize_callback_| // Reference to prevent destruction while inside the |initialize_cb_|
// call. This is a temporary fix to prevent crashes caused by holding the // call. This is a temporary fix to prevent crashes caused by holding the
// lock and running the destructor. // lock and running the destructor.
// TODO: Review locking in this class and figure out a way to run the callback // TODO: Review locking in this class and figure out a way to run the callback
...@@ -465,7 +461,7 @@ void BufferedDataSource::NonHttpInitialStartCallback(int error) { ...@@ -465,7 +461,7 @@ void BufferedDataSource::NonHttpInitialStartCallback(int error) {
DCHECK(MessageLoop::current() == render_loop_); DCHECK(MessageLoop::current() == render_loop_);
DCHECK(loader_.get()); DCHECK(loader_.get());
if (!initialize_callback_.get()) { if (initialize_cb_.is_null()) {
loader_->Stop(); loader_->Stop();
return; return;
} }
...@@ -481,7 +477,7 @@ void BufferedDataSource::NonHttpInitialStartCallback(int error) { ...@@ -481,7 +477,7 @@ void BufferedDataSource::NonHttpInitialStartCallback(int error) {
loader_->Stop(); loader_->Stop();
} }
// Reference to prevent destruction while inside the |initialize_callback_| // Reference to prevent destruction while inside the |initialize_cb_|
// call. This is a temporary fix to prevent crashes caused by holding the // call. This is a temporary fix to prevent crashes caused by holding the
// lock and running the destructor. // lock and running the destructor.
// TODO: Review locking in this class and figure out a way to run the callback // TODO: Review locking in this class and figure out a way to run the callback
...@@ -497,7 +493,7 @@ void BufferedDataSource::NonHttpInitialStartCallback(int error) { ...@@ -497,7 +493,7 @@ void BufferedDataSource::NonHttpInitialStartCallback(int error) {
// this object when Stop() method is ever called. Locking this method is // this object when Stop() method is ever called. Locking this method is
// safe because |lock_| is only acquired in tasks on render thread. // safe because |lock_| is only acquired in tasks on render thread.
base::AutoLock auto_lock(lock_); base::AutoLock auto_lock(lock_);
if (stop_signal_received_ || !initialize_callback_.get()) if (stop_signal_received_ || initialize_cb_.is_null())
return; return;
if (!success) { if (!success) {
......
...@@ -51,7 +51,7 @@ class BufferedDataSource : public WebDataSource { ...@@ -51,7 +51,7 @@ class BufferedDataSource : public WebDataSource {
// webkit_glue::WebDataSource implementation. // webkit_glue::WebDataSource implementation.
virtual void Initialize(const std::string& url, virtual void Initialize(const std::string& url,
media::PipelineStatusCallback* callback); const media::PipelineStatusCB& callback);
virtual void CancelInitialize(); virtual void CancelInitialize();
virtual bool HasSingleOrigin(); virtual bool HasSingleOrigin();
virtual void Abort(); virtual void Abort();
...@@ -98,7 +98,7 @@ class BufferedDataSource : public WebDataSource { ...@@ -98,7 +98,7 @@ class BufferedDataSource : public WebDataSource {
// Calls |read_callback_| and reset all read parameters. // Calls |read_callback_| and reset all read parameters.
void DoneRead_Locked(int error); void DoneRead_Locked(int error);
// Calls |initialize_callback_| and reset it. // Calls |initialize_cb_| and reset it.
void DoneInitialization_Locked(media::PipelineStatus status); void DoneInitialization_Locked(media::PipelineStatus status);
// Callback method for |loader_| if URL for the resource requested is using // Callback method for |loader_| if URL for the resource requested is using
...@@ -154,7 +154,7 @@ class BufferedDataSource : public WebDataSource { ...@@ -154,7 +154,7 @@ class BufferedDataSource : public WebDataSource {
bool network_activity_; bool network_activity_;
// Callback method from the pipeline for initialization. // Callback method from the pipeline for initialization.
scoped_ptr<media::PipelineStatusCallback> initialize_callback_; media::PipelineStatusCB initialize_cb_;
// Read parameters received from the Read() method call. // Read parameters received from the Read() method call.
scoped_ptr<media::DataSource::ReadCallback> read_callback_; scoped_ptr<media::DataSource::ReadCallback> read_callback_;
......
...@@ -198,7 +198,7 @@ class BufferedDataSourceTest : public testing::Test { ...@@ -198,7 +198,7 @@ class BufferedDataSourceTest : public testing::Test {
// Actual initialization of the data source. // Actual initialization of the data source.
data_source_->Initialize(url, data_source_->Initialize(url,
media::NewExpectedStatusCallback(expected_init_status)); media::NewExpectedStatusCB(expected_init_status));
message_loop_->RunAllPending(); message_loop_->RunAllPending();
if (initialized_ok) { if (initialized_ok) {
......
...@@ -83,17 +83,17 @@ void SimpleDataSource::Stop(media::FilterCallback* callback) { ...@@ -83,17 +83,17 @@ void SimpleDataSource::Stop(media::FilterCallback* callback) {
void SimpleDataSource::Initialize( void SimpleDataSource::Initialize(
const std::string& url, const std::string& url,
media::PipelineStatusCallback* callback) { const media::PipelineStatusCB& callback) {
// Reference to prevent destruction while inside the |initialize_callback_| // Reference to prevent destruction while inside the |initialize_cb_|
// call. This is a temporary fix to prevent crashes caused by holding the // call. This is a temporary fix to prevent crashes caused by holding the
// lock and running the destructor. // lock and running the destructor.
scoped_refptr<SimpleDataSource> destruction_guard(this); scoped_refptr<SimpleDataSource> destruction_guard(this);
{ {
base::AutoLock auto_lock(lock_); base::AutoLock auto_lock(lock_);
DCHECK_EQ(state_, UNINITIALIZED); DCHECK_EQ(state_, UNINITIALIZED);
DCHECK(callback); DCHECK(!callback.is_null());
state_ = INITIALIZING; state_ = INITIALIZING;
initialize_callback_.reset(callback); initialize_cb_ = callback;
// Validate the URL. // Validate the URL.
url_ = GURL(url); url_ = GURL(url);
...@@ -110,9 +110,9 @@ void SimpleDataSource::Initialize( ...@@ -110,9 +110,9 @@ void SimpleDataSource::Initialize(
void SimpleDataSource::CancelInitialize() { void SimpleDataSource::CancelInitialize() {
base::AutoLock auto_lock(lock_); base::AutoLock auto_lock(lock_);
DCHECK(initialize_callback_.get()); DCHECK(!initialize_cb_.is_null());
state_ = STOPPED; state_ = STOPPED;
initialize_callback_.reset(); initialize_cb_.Reset();
// Post a task to the render thread to cancel loading the resource. // Post a task to the render thread to cancel loading the resource.
render_loop_->PostTask(FROM_HERE, render_loop_->PostTask(FROM_HERE,
...@@ -205,7 +205,7 @@ void SimpleDataSource::didFinishLoading( ...@@ -205,7 +205,7 @@ void SimpleDataSource::didFinishLoading(
WebKit::WebURLLoader* loader, WebKit::WebURLLoader* loader,
double finishTime) { double finishTime) {
DCHECK(MessageLoop::current() == render_loop_); DCHECK(MessageLoop::current() == render_loop_);
// Reference to prevent destruction while inside the |initialize_callback_| // Reference to prevent destruction while inside the |initialize_cb_|
// call. This is a temporary fix to prevent crashes caused by holding the // call. This is a temporary fix to prevent crashes caused by holding the
// lock and running the destructor. // lock and running the destructor.
scoped_refptr<SimpleDataSource> destruction_guard(this); scoped_refptr<SimpleDataSource> destruction_guard(this);
...@@ -233,7 +233,7 @@ void SimpleDataSource::didFail( ...@@ -233,7 +233,7 @@ void SimpleDataSource::didFail(
WebKit::WebURLLoader* loader, WebKit::WebURLLoader* loader,
const WebKit::WebURLError& error) { const WebKit::WebURLError& error) {
DCHECK(MessageLoop::current() == render_loop_); DCHECK(MessageLoop::current() == render_loop_);
// Reference to prevent destruction while inside the |initialize_callback_| // Reference to prevent destruction while inside the |initialize_cb_|
// call. This is a temporary fix to prevent crashes caused by holding the // call. This is a temporary fix to prevent crashes caused by holding the
// lock and running the destructor. // lock and running the destructor.
scoped_refptr<SimpleDataSource> destruction_guard(this); scoped_refptr<SimpleDataSource> destruction_guard(this);
...@@ -269,7 +269,7 @@ void SimpleDataSource::Abort() { ...@@ -269,7 +269,7 @@ void SimpleDataSource::Abort() {
void SimpleDataSource::StartTask() { void SimpleDataSource::StartTask() {
DCHECK(MessageLoop::current() == render_loop_); DCHECK(MessageLoop::current() == render_loop_);
// Reference to prevent destruction while inside the |initialize_callback_| // Reference to prevent destruction while inside the |initialize_cb_|
// call. This is a temporary fix to prevent crashes caused by holding the // call. This is a temporary fix to prevent crashes caused by holding the
// lock and running the destructor. // lock and running the destructor.
scoped_refptr<SimpleDataSource> destruction_guard(this); scoped_refptr<SimpleDataSource> destruction_guard(this);
...@@ -344,9 +344,8 @@ void SimpleDataSource::DoneInitialization_Locked(bool success) { ...@@ -344,9 +344,8 @@ void SimpleDataSource::DoneInitialization_Locked(bool success) {
url_loader_.reset(); url_loader_.reset();
} }
scoped_ptr<media::PipelineStatusCallback> initialize_callback( initialize_cb_.Run(status);
initialize_callback_.release()); initialize_cb_.Reset();
initialize_callback->Run(status);
} }
void SimpleDataSource::UpdateHostState() { void SimpleDataSource::UpdateHostState() {
......
...@@ -93,7 +93,7 @@ class SimpleDataSource ...@@ -93,7 +93,7 @@ class SimpleDataSource
// webkit_glue::WebDataSource implementation. // webkit_glue::WebDataSource implementation.
virtual void Initialize(const std::string& url, virtual void Initialize(const std::string& url,
media::PipelineStatusCallback* callback); const media::PipelineStatusCB& callback);
virtual void CancelInitialize(); virtual void CancelInitialize();
virtual bool HasSingleOrigin(); virtual bool HasSingleOrigin();
virtual void Abort(); virtual void Abort();
...@@ -138,7 +138,7 @@ class SimpleDataSource ...@@ -138,7 +138,7 @@ class SimpleDataSource
base::Lock lock_; base::Lock lock_;
// Filter callbacks. // Filter callbacks.
scoped_ptr<media::PipelineStatusCallback> initialize_callback_; media::PipelineStatusCB initialize_cb_;
// Used to ensure mocks for unittests are used instead of reset in Start(). // Used to ensure mocks for unittests are used instead of reset in Start().
bool keep_test_loader_; bool keep_test_loader_;
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "base/bind.h"
#include "media/base/filters.h" #include "media/base/filters.h"
#include "media/base/mock_callback.h" #include "media/base/mock_callback.h"
#include "media/base/mock_filter_host.h" #include "media/base/mock_filter_host.h"
...@@ -64,7 +65,7 @@ class SimpleDataSourceTest : public testing::Test { ...@@ -64,7 +65,7 @@ class SimpleDataSourceTest : public testing::Test {
} }
void InitializeDataSource(const char* url, void InitializeDataSource(const char* url,
media::MockStatusCallback* callback) { const media::PipelineStatusCB& callback) {
gurl_ = GURL(url); gurl_ = GURL(url);
url_loader_ = new NiceMock<MockWebURLLoader>(); url_loader_ = new NiceMock<MockWebURLLoader>();
...@@ -164,21 +165,21 @@ class SimpleDataSourceTest : public testing::Test { ...@@ -164,21 +165,21 @@ class SimpleDataSourceTest : public testing::Test {
TEST_F(SimpleDataSourceTest, InitializeHTTP) { TEST_F(SimpleDataSourceTest, InitializeHTTP) {
InitializeDataSource(kHttpUrl, InitializeDataSource(kHttpUrl,
media::NewExpectedStatusCallback(media::PIPELINE_OK)); media::NewExpectedStatusCB(media::PIPELINE_OK));
RequestSucceeded(false); RequestSucceeded(false);
DestroyDataSource(); DestroyDataSource();
} }
TEST_F(SimpleDataSourceTest, InitializeHTTPS) { TEST_F(SimpleDataSourceTest, InitializeHTTPS) {
InitializeDataSource(kHttpsUrl, InitializeDataSource(kHttpsUrl,
media::NewExpectedStatusCallback(media::PIPELINE_OK)); media::NewExpectedStatusCB(media::PIPELINE_OK));
RequestSucceeded(false); RequestSucceeded(false);
DestroyDataSource(); DestroyDataSource();
} }
TEST_F(SimpleDataSourceTest, InitializeFile) { TEST_F(SimpleDataSourceTest, InitializeFile) {
InitializeDataSource(kFileUrl, InitializeDataSource(kFileUrl,
media::NewExpectedStatusCallback(media::PIPELINE_OK)); media::NewExpectedStatusCB(media::PIPELINE_OK));
RequestSucceeded(true); RequestSucceeded(true);
DestroyDataSource(); DestroyDataSource();
} }
...@@ -197,7 +198,7 @@ TEST_F(SimpleDataSourceTest, InitializeData) { ...@@ -197,7 +198,7 @@ TEST_F(SimpleDataSourceTest, InitializeData) {
EXPECT_CALL(host_, SetBufferedBytes(sizeof(kDataUrlDecoded))); EXPECT_CALL(host_, SetBufferedBytes(sizeof(kDataUrlDecoded)));
data_source_->Initialize(kDataUrl, data_source_->Initialize(kDataUrl,
media::NewExpectedStatusCallback(media::PIPELINE_OK)); media::NewExpectedStatusCB(media::PIPELINE_OK));
MessageLoop::current()->RunAllPending(); MessageLoop::current()->RunAllPending();
DestroyDataSource(); DestroyDataSource();
...@@ -205,27 +206,29 @@ TEST_F(SimpleDataSourceTest, InitializeData) { ...@@ -205,27 +206,29 @@ TEST_F(SimpleDataSourceTest, InitializeData) {
TEST_F(SimpleDataSourceTest, RequestFailed) { TEST_F(SimpleDataSourceTest, RequestFailed) {
InitializeDataSource(kHttpUrl, InitializeDataSource(kHttpUrl,
media::NewExpectedStatusCallback(media::PIPELINE_ERROR_NETWORK)); media::NewExpectedStatusCB(media::PIPELINE_ERROR_NETWORK));
RequestFailed(); RequestFailed();
DestroyDataSource(); DestroyDataSource();
} }
static void OnStatusCB(bool* called, media::PipelineStatus status) {
*called = true;
}
TEST_F(SimpleDataSourceTest, StopWhenDownloading) { TEST_F(SimpleDataSourceTest, StopWhenDownloading) {
// The callback should be deleted, but not executed. // The callback should be deleted, but not executed.
// TODO(scherkus): should this really be the behaviour? Seems strange... // TODO(scherkus): should this really be the behaviour? Seems strange...
StrictMock<media::MockStatusCallback>* callback = bool was_called = false;
new StrictMock<media::MockStatusCallback>(); InitializeDataSource(kHttpUrl, base::Bind(&OnStatusCB, &was_called));
EXPECT_CALL(*callback, Destructor());
InitializeDataSource(kHttpUrl, callback);
EXPECT_CALL(*url_loader_, cancel()); EXPECT_CALL(*url_loader_, cancel());
DestroyDataSource(); DestroyDataSource();
EXPECT_FALSE(was_called);
} }
TEST_F(SimpleDataSourceTest, AsyncRead) { TEST_F(SimpleDataSourceTest, AsyncRead) {
InitializeDataSource(kFileUrl, InitializeDataSource(kFileUrl,
media::NewExpectedStatusCallback(media::PIPELINE_OK)); media::NewExpectedStatusCB(media::PIPELINE_OK));
RequestSucceeded(true); RequestSucceeded(true);
AsyncRead(); AsyncRead();
DestroyDataSource(); DestroyDataSource();
...@@ -237,14 +240,14 @@ TEST_F(SimpleDataSourceTest, AsyncRead) { ...@@ -237,14 +240,14 @@ TEST_F(SimpleDataSourceTest, AsyncRead) {
TEST_F(SimpleDataSourceTest, HasSingleOrigin) { TEST_F(SimpleDataSourceTest, HasSingleOrigin) {
// Make sure no redirect case works as expected. // Make sure no redirect case works as expected.
InitializeDataSource(kHttpUrl, InitializeDataSource(kHttpUrl,
media::NewExpectedStatusCallback(media::PIPELINE_OK)); media::NewExpectedStatusCB(media::PIPELINE_OK));
RequestSucceeded(false); RequestSucceeded(false);
EXPECT_TRUE(data_source_->HasSingleOrigin()); EXPECT_TRUE(data_source_->HasSingleOrigin());
DestroyDataSource(); DestroyDataSource();
// Test redirect to the same domain. // Test redirect to the same domain.
InitializeDataSource(kHttpUrl, InitializeDataSource(kHttpUrl,
media::NewExpectedStatusCallback(media::PIPELINE_OK)); media::NewExpectedStatusCB(media::PIPELINE_OK));
Redirect(kHttpRedirectToSameDomainUrl1); Redirect(kHttpRedirectToSameDomainUrl1);
RequestSucceeded(false); RequestSucceeded(false);
EXPECT_TRUE(data_source_->HasSingleOrigin()); EXPECT_TRUE(data_source_->HasSingleOrigin());
...@@ -252,7 +255,7 @@ TEST_F(SimpleDataSourceTest, HasSingleOrigin) { ...@@ -252,7 +255,7 @@ TEST_F(SimpleDataSourceTest, HasSingleOrigin) {
// Test redirect twice to the same domain. // Test redirect twice to the same domain.
InitializeDataSource(kHttpUrl, InitializeDataSource(kHttpUrl,
media::NewExpectedStatusCallback(media::PIPELINE_OK)); media::NewExpectedStatusCB(media::PIPELINE_OK));
Redirect(kHttpRedirectToSameDomainUrl1); Redirect(kHttpRedirectToSameDomainUrl1);
Redirect(kHttpRedirectToSameDomainUrl2); Redirect(kHttpRedirectToSameDomainUrl2);
RequestSucceeded(false); RequestSucceeded(false);
...@@ -261,7 +264,7 @@ TEST_F(SimpleDataSourceTest, HasSingleOrigin) { ...@@ -261,7 +264,7 @@ TEST_F(SimpleDataSourceTest, HasSingleOrigin) {
// Test redirect to a different domain. // Test redirect to a different domain.
InitializeDataSource(kHttpUrl, InitializeDataSource(kHttpUrl,
media::NewExpectedStatusCallback(media::PIPELINE_OK)); media::NewExpectedStatusCB(media::PIPELINE_OK));
Redirect(kHttpRedirectToDifferentDomainUrl1); Redirect(kHttpRedirectToDifferentDomainUrl1);
RequestSucceeded(false); RequestSucceeded(false);
EXPECT_FALSE(data_source_->HasSingleOrigin()); EXPECT_FALSE(data_source_->HasSingleOrigin());
...@@ -269,7 +272,7 @@ TEST_F(SimpleDataSourceTest, HasSingleOrigin) { ...@@ -269,7 +272,7 @@ TEST_F(SimpleDataSourceTest, HasSingleOrigin) {
// Test redirect to the same domain and then to a different domain. // Test redirect to the same domain and then to a different domain.
InitializeDataSource(kHttpUrl, InitializeDataSource(kHttpUrl,
media::NewExpectedStatusCallback(media::PIPELINE_OK)); media::NewExpectedStatusCB(media::PIPELINE_OK));
Redirect(kHttpRedirectToSameDomainUrl1); Redirect(kHttpRedirectToSameDomainUrl1);
Redirect(kHttpRedirectToDifferentDomainUrl1); Redirect(kHttpRedirectToDifferentDomainUrl1);
RequestSucceeded(false); RequestSucceeded(false);
......
...@@ -21,7 +21,7 @@ class WebDataSource : public media::DataSource { ...@@ -21,7 +21,7 @@ class WebDataSource : public media::DataSource {
// Initialize this object using |url|. This object calls |callback| when // Initialize this object using |url|. This object calls |callback| when
// initialization has completed. // initialization has completed.
virtual void Initialize(const std::string& url, virtual void Initialize(const std::string& url,
media::PipelineStatusCallback* callback) = 0; const media::PipelineStatusCB& callback) = 0;
// Called to cancel initialization. The callback passed in Initialize() will // Called to cancel initialization. The callback passed in Initialize() will
// be destroyed and will not be called after this method returns. Once this // be destroyed and will not be called after this method returns. Once this
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "webkit/glue/media/web_data_source_factory.h" #include "webkit/glue/media/web_data_source_factory.h"
#include "base/bind.h"
#include "base/logging.h" #include "base/logging.h"
#include "media/base/media_log.h" #include "media/base/media_log.h"
...@@ -86,7 +87,8 @@ WebDataSourceFactory::BuildRequest::~BuildRequest() { ...@@ -86,7 +87,8 @@ WebDataSourceFactory::BuildRequest::~BuildRequest() {
} }
void WebDataSourceFactory::BuildRequest::DoStart() { void WebDataSourceFactory::BuildRequest::DoStart() {
data_source_->Initialize(url(), NewCallback(this, &BuildRequest::InitDone)); data_source_->Initialize(url(), base::Bind(&BuildRequest::InitDone,
base::Unretained(this)));
} }
void WebDataSourceFactory::BuildRequest::InitDone( void WebDataSourceFactory::BuildRequest::InitDone(
......
...@@ -132,12 +132,12 @@ bool WebMediaPlayerImpl::Initialize( ...@@ -132,12 +132,12 @@ bool WebMediaPlayerImpl::Initialize(
// Set our pipeline callbacks. // Set our pipeline callbacks.
pipeline_->Init( pipeline_->Init(
NewCallback(proxy_.get(), base::Bind(&WebMediaPlayerProxy::PipelineEndedCallback,
&WebMediaPlayerProxy::PipelineEndedCallback), proxy_.get()),
NewCallback(proxy_.get(), base::Bind(&WebMediaPlayerProxy::PipelineErrorCallback,
&WebMediaPlayerProxy::PipelineErrorCallback), proxy_.get()),
NewCallback(proxy_.get(), base::Bind(&WebMediaPlayerProxy::NetworkEventCallback,
&WebMediaPlayerProxy::NetworkEventCallback)); proxy_.get()));
// A simple data source that keeps all data in memory. // A simple data source that keeps all data in memory.
scoped_ptr<media::DataSourceFactory> simple_data_source_factory( scoped_ptr<media::DataSourceFactory> simple_data_source_factory(
...@@ -232,8 +232,9 @@ void WebMediaPlayerImpl::load(const WebKit::WebURL& url) { ...@@ -232,8 +232,9 @@ void WebMediaPlayerImpl::load(const WebKit::WebURL& url) {
pipeline_->Start( pipeline_->Start(
filter_collection_.release(), filter_collection_.release(),
url.spec(), url.spec(),
NewCallback(proxy_.get(), base::Bind(&WebMediaPlayerProxy::PipelineInitializationCallback,
&WebMediaPlayerProxy::PipelineInitializationCallback)); proxy_.get()));
media_log_->AddEvent(media_log_->CreateLoadEvent(url.spec())); media_log_->AddEvent(media_log_->CreateLoadEvent(url.spec()));
} }
...@@ -301,8 +302,8 @@ void WebMediaPlayerImpl::seek(float seconds) { ...@@ -301,8 +302,8 @@ void WebMediaPlayerImpl::seek(float seconds) {
// Kick off the asynchronous seek! // Kick off the asynchronous seek!
pipeline_->Seek( pipeline_->Seek(
seek_time, seek_time,
NewCallback(proxy_.get(), base::Bind(&WebMediaPlayerProxy::PipelineSeekCallback,
&WebMediaPlayerProxy::PipelineSeekCallback)); proxy_.get()));
} }
void WebMediaPlayerImpl::setEndTime(float seconds) { void WebMediaPlayerImpl::setEndTime(float seconds) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment