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

Unified Diff: media/filters/blocking_url_protocol.h

Issue 11410052: Refactor FFmpegURLProtocol code from FFmpegDemuxer into BlockingUrlProtocol. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix android Created 8 years, 1 month 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 | « no previous file | media/filters/blocking_url_protocol.cc » ('j') | media/filters/blocking_url_protocol.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/filters/blocking_url_protocol.h
diff --git a/media/filters/blocking_url_protocol.h b/media/filters/blocking_url_protocol.h
new file mode 100644
index 0000000000000000000000000000000000000000..dbffbbc3953e6ff92e8a1e909dff37e2609d8590
--- /dev/null
+++ b/media/filters/blocking_url_protocol.h
@@ -0,0 +1,73 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MEDIA_FILTERS_BLOCKING_URL_PROTOCOL_H_
+#define MEDIA_FILTERS_BLOCKING_URL_PROTOCOL_H_
+
+#include "base/basictypes.h"
+#include "base/callback.h"
+#include "base/synchronization/waitable_event.h"
+#include "media/filters/ffmpeg_glue.h"
+
+namespace media {
+
+class DataSource;
+
+// An implementation of FFmpegURLProtocol that blocks until the underlying
+// asynchronous DataSource::Read() operation completes.
+//
+// TODO(scherkus): Should be more thread-safe as |last_read_bytes_| is updated
+// from multiple threads without any protection.
+class MEDIA_EXPORT BlockingUrlProtocol : public FFmpegURLProtocol {
+ public:
+ // Implements FFmpegURLProtocol using the given |data_source|. |error_cb| is
+ // fired any time DataSource::Read() returns an error.
+ //
+ // TODO(scherkus): After all blocking operations are isolated on a separate
+ // thread we should be able to eliminate |error_cb|.
+ BlockingUrlProtocol(const scoped_refptr<DataSource>& data_source,
+ const base::Closure& error_cb);
+ virtual ~BlockingUrlProtocol();
+
+ // Aborts any pending reads by returning a read error. After this method
+ // returns all subsequent calls to Read() will immediately fail.
+ //
+ // TODO(scherkus): Currently this will cause |error_cb| to fire. Fix.
+ void Abort();
+
+ // FFmpegURLProtocol implementation.
+ virtual int Read(int size, uint8* data) OVERRIDE;
+ virtual bool GetPosition(int64* position_out) OVERRIDE;
+ virtual bool SetPosition(int64 position) OVERRIDE;
+ virtual bool GetSize(int64* size_out) OVERRIDE;
+ virtual bool IsStreaming() OVERRIDE;
+
+ private:
+ // Sets |last_read_bytes_| and signals the blocked thread that the read
+ // has completed.
+ void SignalReadCompleted(int size);
+
+ scoped_refptr<DataSource> data_source_;
+ base::Closure error_cb_;
+
+ // Used to convert an asynchronous DataSource::Read() into a blocking
+ // FFmpegUrlProtocol::Read().
+ base::WaitableEvent read_event_;
+
+ // Read errors and aborts are unrecoverable. Any subsequent reads will
+ // immediately fail when this is set to true.
+ bool read_has_failed_;
+
+ // Cached number of bytes last read from the data source.
+ int last_read_bytes_;
+
+ // Cached position within the data source.
+ int64 read_position_;
+
+ DISALLOW_IMPLICIT_CONSTRUCTORS(BlockingUrlProtocol);
+};
+
+} // namespace media
+
+#endif // MEDIA_FILTERS_BLOCKING_URL_PROTOCOL_H_
« no previous file with comments | « no previous file | media/filters/blocking_url_protocol.cc » ('j') | media/filters/blocking_url_protocol.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698