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

Unified Diff: media/base/composite_filter.cc

Issue 6969026: Convert Filter::Seek() to use new callback system. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add files in content/renderer/media Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/base/composite_filter.cc
diff --git a/media/base/composite_filter.cc b/media/base/composite_filter.cc
index 537d26231bd39d1f236b41b0fb082c44af09e6cf..381c9444fa97e5060c95f8d579afd8f63de2d8cb 100644
--- a/media/base/composite_filter.cc
+++ b/media/base/composite_filter.cc
@@ -4,6 +4,7 @@
#include "media/base/composite_filter.h"
+#include "base/bind.h"
#include "base/message_loop.h"
#include "base/stl_util-inl.h"
#include "media/base/callback.h"
@@ -83,7 +84,7 @@ FilterHost* CompositeFilter::host() {
void CompositeFilter::Play(FilterCallback* play_callback) {
DCHECK_EQ(message_loop_, MessageLoop::current());
scoped_ptr<FilterCallback> callback(play_callback);
- if (callback_.get()) {
+ if (IsOperationPending()) {
SendErrorToHost(PIPELINE_ERROR_OPERATION_PENDING);
callback->Run();
return;
@@ -104,7 +105,7 @@ void CompositeFilter::Play(FilterCallback* play_callback) {
void CompositeFilter::Pause(FilterCallback* pause_callback) {
DCHECK_EQ(message_loop_, MessageLoop::current());
scoped_ptr<FilterCallback> callback(pause_callback);
- if (callback_.get()) {
+ if (IsOperationPending()) {
SendErrorToHost(PIPELINE_ERROR_OPERATION_PENDING);
callback->Run();
return;
@@ -125,7 +126,7 @@ void CompositeFilter::Pause(FilterCallback* pause_callback) {
void CompositeFilter::Flush(FilterCallback* flush_callback) {
DCHECK_EQ(message_loop_, MessageLoop::current());
scoped_ptr<FilterCallback> callback(flush_callback);
- if (callback_.get()) {
+ if (IsOperationPending()) {
SendErrorToHost(PIPELINE_ERROR_OPERATION_PENDING);
callback->Run();
return;
@@ -193,21 +194,19 @@ void CompositeFilter::SetPlaybackRate(float playback_rate) {
}
void CompositeFilter::Seek(base::TimeDelta time,
- FilterCallback* seek_callback) {
+ const FilterStatusCB& seek_cb) {
DCHECK_EQ(message_loop_, MessageLoop::current());
- scoped_ptr<FilterCallback> callback(seek_callback);
- if (callback_.get()) {
- SendErrorToHost(PIPELINE_ERROR_OPERATION_PENDING);
- callback->Run();
+
+ if (IsOperationPending()) {
+ seek_cb.Run(PIPELINE_ERROR_OPERATION_PENDING);
return;
} else if (!host() || (state_ != kPaused && state_ != kCreated)) {
- SendErrorToHost(PIPELINE_ERROR_INVALID_STATE);
- callback->Run();
+ seek_cb.Run(PIPELINE_ERROR_INVALID_STATE);
return;
}
ChangeState(kSeekPending);
- callback_.reset(callback.release());
+ status_cb_ = seek_cb;
pending_seek_time_ = time;
StartSerialCallSequence();
}
@@ -229,13 +228,12 @@ void CompositeFilter::ChangeState(State new_state) {
void CompositeFilter::StartSerialCallSequence() {
DCHECK_EQ(message_loop_, MessageLoop::current());
status_ = PIPELINE_OK;
+ sequence_index_ = 0;
if (!filters_.empty()) {
- sequence_index_ = 0;
CallFilter(filters_[sequence_index_],
NewThreadSafeCallback(&CompositeFilter::SerialCallback));
} else {
- sequence_index_ = 0;
SerialCallback();
}
}
@@ -243,15 +241,14 @@ void CompositeFilter::StartSerialCallSequence() {
void CompositeFilter::StartParallelCallSequence() {
DCHECK_EQ(message_loop_, MessageLoop::current());
status_ = PIPELINE_OK;
+ sequence_index_ = 0;
if (!filters_.empty()) {
- sequence_index_ = 0;
for (size_t i = 0; i < filters_.size(); i++) {
CallFilter(filters_[i],
NewThreadSafeCallback(&CompositeFilter::ParallelCallback));
}
} else {
- sequence_index_ = 0;
ParallelCallback();
}
}
@@ -272,7 +269,8 @@ void CompositeFilter::CallFilter(scoped_refptr<Filter>& filter,
filter->Stop(callback);
break;
case kSeekPending:
- filter->Seek(pending_seek_time_, callback);
+ filter->Seek(pending_seek_time_,
+ base::Bind(&CompositeFilter::OnStatusCB, this, callback));
break;
default:
delete callback;
@@ -282,6 +280,11 @@ void CompositeFilter::CallFilter(scoped_refptr<Filter>& filter,
}
void CompositeFilter::DispatchPendingCallback() {
+ if (!status_cb_.is_null()) {
Ami GONE FROM CHROMIUM 2011/05/12 20:42:16 DCHECK not both fields are set?
acolwell GONE FROM CHROMIUM 2011/05/12 22:30:40 Done.
+ CopyAndResetCB(status_cb_).Run(PIPELINE_OK);
+ return;
+ }
+
if (callback_.get()) {
scoped_ptr<FilterCallback> callback(callback_.release());
callback->Run();
@@ -397,6 +400,12 @@ void CompositeFilter::SendErrorToHost(PipelineStatus error) {
void CompositeFilter::HandleError(PipelineStatus error) {
DCHECK_NE(error, PIPELINE_OK);
+
+ if (!status_cb_.is_null()) {
Ami GONE FROM CHROMIUM 2011/05/12 20:42:16 This duplicates code in DispatchPendingCallback. C
acolwell GONE FROM CHROMIUM 2011/05/12 22:30:40 Done. Merge functionality into DispatchPendingCall
+ CopyAndResetCB(status_cb_).Run(error);
+ return;
+ }
+
SendErrorToHost(error);
DispatchPendingCallback();
}
@@ -432,6 +441,19 @@ bool CompositeFilter::CanForwardError() {
return (state_ == kCreated) || (state_ == kPlaying) || (state_ == kPaused);
}
+bool CompositeFilter::IsOperationPending() const {
+ return callback_.get() || !status_cb_.is_null();
Ami GONE FROM CHROMIUM 2011/05/12 20:42:16 DCHECK !&& ?
acolwell GONE FROM CHROMIUM 2011/05/12 22:30:40 Done.
+}
+
+void CompositeFilter::OnStatusCB(FilterCallback* callback,
+ PipelineStatus status) {
+ if (status != PIPELINE_OK)
+ SetError(status);
+
+ callback->Run();
+ delete callback;
+}
+
void CompositeFilter::SetError(PipelineStatus error) {
// TODO(acolwell): Temporary hack to handle errors that occur
// during filter initialization. In this case we just forward

Powered by Google App Engine
This is Rietveld 408576698