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

Unified Diff: media/filters/decoder_base.h

Issue 2101022: refactoring decoder interface (Closed)
Patch Set: q Created 10 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
« no previous file with comments | « media/filters/audio_renderer_base_unittest.cc ('k') | media/filters/decoder_base_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/filters/decoder_base.h
diff --git a/media/filters/decoder_base.h b/media/filters/decoder_base.h
index 5642651d0c07fdca098cda786d19c3af3bee5c86..cc0e3cbb8e4cf29811f734ed888a61fdcbda0ba4 100644
--- a/media/filters/decoder_base.h
+++ b/media/filters/decoder_base.h
@@ -52,14 +52,15 @@ class DecoderBase : public Decoder {
virtual const MediaFormat& media_format() { return media_format_; }
// Audio or video decoder.
- virtual void Read(ReadCallback* read_callback) {
+ virtual void FillThisBuffer(scoped_refptr<Output> output) {
this->message_loop()->PostTask(FROM_HERE,
- NewRunnableMethod(this, &DecoderBase::ReadTask, read_callback));
+ NewRunnableMethod(this, &DecoderBase::ReadTask, output));
}
protected:
DecoderBase()
: pending_reads_(0),
+ pending_requests_(0),
expecting_discontinuous_(false),
state_(kUninitialized) {
}
@@ -67,7 +68,6 @@ class DecoderBase : public Decoder {
virtual ~DecoderBase() {
DCHECK(state_ == kUninitialized || state_ == kStopped);
DCHECK(result_queue_.empty());
- DCHECK(read_queue_.empty());
}
// This method is called by the derived class from within the OnDecode method.
@@ -124,9 +124,9 @@ class DecoderBase : public Decoder {
// Note that it's possible for us to decode but not produce a frame, in
// which case |pending_reads_| will remain less than |read_queue_| so we
// need to schedule an additional read.
- DCHECK_LE(pending_reads_, read_queue_.size());
+ DCHECK_LE(pending_reads_, pending_requests_);
if (!fulfilled) {
- DCHECK_LT(pending_reads_, read_queue_.size());
+ DCHECK_LT(pending_reads_, pending_requests_);
demuxer_stream_->Read(NewCallback(this, &DecoderBase::OnReadComplete));
++pending_reads_;
}
@@ -154,14 +154,13 @@ class DecoderBase : public Decoder {
// Throw away all buffers in all queues.
result_queue_.clear();
- STLDeleteElements(&read_queue_);
state_ = kStopped;
}
void SeekTask(base::TimeDelta time, FilterCallback* callback) {
DCHECK_EQ(MessageLoop::current(), this->message_loop());
DCHECK_EQ(0u, pending_reads_) << "Pending reads should have completed";
- DCHECK(read_queue_.empty()) << "Read requests should be empty";
+ DCHECK_EQ(0u, pending_requests_) << "Pending requests should be empty";
// Delegate to the subclass first.
//
@@ -215,17 +214,16 @@ class DecoderBase : public Decoder {
}
}
- void ReadTask(ReadCallback* read_callback) {
+ void ReadTask(scoped_refptr<Output> output) {
DCHECK_EQ(MessageLoop::current(), this->message_loop());
// TODO(scherkus): should reply with a null operation (empty buffer).
- if (IsStopped()) {
- delete read_callback;
+ if (IsStopped())
return;
- }
- // Enqueue the callback and attempt to fulfill it immediately.
- read_queue_.push_back(read_callback);
+ ++pending_requests_;
+
+ // Try to fulfill it immediately.
if (FulfillPendingRead())
return;
@@ -260,24 +258,25 @@ class DecoderBase : public Decoder {
// Return true if one read request is fulfilled.
bool FulfillPendingRead() {
DCHECK_EQ(MessageLoop::current(), this->message_loop());
- if (read_queue_.empty() || result_queue_.empty()) {
+ if (!pending_requests_ || result_queue_.empty()) {
return false;
}
// Dequeue a frame and read callback pair.
scoped_refptr<Output> output = result_queue_.front();
- scoped_ptr<ReadCallback> read_callback(read_queue_.front());
result_queue_.pop_front();
- read_queue_.pop_front();
// Execute the callback!
- read_callback->Run(output);
+ --pending_requests_;
+ Decoder::fill_buffer_done_callback()->Run(output);
return true;
}
// Tracks the number of asynchronous reads issued to |demuxer_stream_|.
// Using size_t since it is always compared against deque::size().
size_t pending_reads_;
+ // Tracks the number of asynchronous reads issued from renderer.
+ size_t pending_requests_;
// A flag used for debugging that we expect our next read to be discontinuous.
bool expecting_discontinuous_;
@@ -296,10 +295,6 @@ class DecoderBase : public Decoder {
typedef std::deque<scoped_refptr<Output> > ResultQueue;
ResultQueue result_queue_;
- // Queue of callbacks supplied by the renderer through the Read() method.
- typedef std::deque<ReadCallback*> ReadQueue;
- ReadQueue read_queue_;
-
// Pause callback.
scoped_ptr<FilterCallback> pause_callback_;
« no previous file with comments | « media/filters/audio_renderer_base_unittest.cc ('k') | media/filters/decoder_base_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698