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