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

Unified Diff: media/base/filters.h

Issue 13116: Adding media filters interface definitions. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 12 years 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/base/media.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/base/filters.h
===================================================================
--- media/base/filters.h (revision 0)
+++ media/base/filters.h (revision 0)
@@ -0,0 +1,180 @@
+// Copyright (c) 2006-2008 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_BASE_FILTERS_H_
+#define MEDIA_BASE_FILTERS_H_
+
+#include <limits>
+#include <string>
+#include "base/basictypes.h"
+#include "base/ref_counted.h"
+
+namespace media {
+
+template <class BufferType> class AssignableInterface;
+class BufferInterface;
+class DecoderInterface;
+class DemuxerStreamInterface;
+class MediaFormat;
+class SchedulerFilterInterface;
+class VideoFrameInterface;
+class WritableBufferInterface;
+
+// Identifies the type of filter implementation. Used in conjunction with some
+// template wizardry to enforce strongly typed operations. More or less a
+// knock off of MSVC's __uuidof() operator.
+enum FilterType {
+ FILTER_DATA_SOURCE,
+ FILTER_DEMUXER,
+ FILTER_AUDIO_DECODER,
+ FILTER_VIDEO_DECODER,
+ FILTER_AUDIO_RENDERER,
+ FILTER_VIDEO_RENDERER,
+ FILTER_MAX
+};
+
+// Filters are connected in a strongly typed manner, with downstream filters
+// always reading data from upstream filters. Upstream filters have no clue
+// who is actually reading from them, and return the results via OnAssignment
+// using the AssignableInterface<SomeBufferType> interface:
+//
+// DemuxerStream(Video) <- VideoDecoder <- VideoRenderer
+// DataSource <- Demuxer <
+// DemuxerStream(Audio) <- AudioDecoder <- AudioRenderer
+//
+// Upstream -------------------------------------------------------> Downstream
+// <- Reads flow this way
+// Buffer assignments flow this way ->
+//
+// Every filter maintains a reference to the scheduler, who maintains data
+// shared between filters (i.e., reference clock value, playback state). The
+// scheduler is also responsible for scheduling filter tasks (i.e., a read on
+// a VideoDecoder would result in scheduling a Decode task). Filters can also
+// use the scheduler to signal errors and shutdown playback.
+
+
+// NOTE: this isn't a true interface since RefCountedThreadSafe has non-virtual
+// members, therefore implementors should NOT subclass RefCountedThreadSafe.
+//
+// If you do, AddRef/Release will have different outcomes depending on the
+// current type of the pointer (StreamSampleInterface vs. SomeImplementation)
+class MediaFilterInterface :
+ public base::RefCountedThreadSafe<MediaFilterInterface> {
+ public:
+ virtual ~MediaFilterInterface() {}
+
+ virtual void SetScheduler(SchedulerFilterInterface* scheduler) = 0;
+};
+
+class DataSourceInterface : public MediaFilterInterface {
+ public:
+ static const FilterType kFilterType = FILTER_DATA_SOURCE;
+ static const size_t kReadError = static_cast<size_t>(-1);
+ virtual ~DataSourceInterface() {}
+
+ // Initializes this filter, returns true if successful, false otherwise.
+ virtual bool Initialize(const std::wstring& uri) = 0;
+
+ // Returns the MediaFormat for this filter.
+ virtual const MediaFormat* GetMediaFormat() = 0;
+
+ // Read the given amount of bytes into data, returns the number of bytes read
+ // if successful, kReadError otherwise.
+ virtual size_t Read(char* data, size_t size) = 0;
+
+ // Returns true and the current file position for this file, false if the
+ // file position could not be retrieved.
+ virtual bool GetPosition(int64* position_out) = 0;
+
+ // Returns true if the file position could be set, false otherwise.
+ virtual bool SetPosition(int64 position) = 0;
+
+ // Returns true and the file size, false if the file size could not be
+ // retrieved.
+ virtual bool GetSize(int64* size_out) = 0;
+};
+
+
+class DemuxerInterface : public MediaFilterInterface {
+ public:
+ static const FilterType kFilterType = FILTER_DEMUXER;
+ virtual ~DemuxerInterface() {}
+
+ // Initializes this filter, returns true if successful, false otherwise.
+ virtual bool Initialize(DataSourceInterface* data_source) = 0;
+
+ // Returns the number of streams available
+ virtual size_t GetNumberOfStreams() = 0;
+
+ // Returns the stream for the given index, NULL otherwise
+ virtual DemuxerStreamInterface* GetStream(int stream_id) = 0;
+};
+
+
+class DemuxerStreamInterface {
+ public:
+ virtual ~DemuxerStreamInterface() {}
+
+ // Returns the MediaFormat for this filter.
+ virtual const MediaFormat* GetMediaFormat() = 0;
+
+ // Schedules a read and takes ownership of the given buffer.
+ virtual void Read(AssignableInterface<BufferInterface>* buffer) = 0;
+};
+
+
+class VideoDecoderInterface : public MediaFilterInterface {
+ public:
+ static const FilterType kFilterType = FILTER_VIDEO_DECODER;
+ virtual ~VideoDecoderInterface() {}
+
+ // Initializes this filter, returns true if successful, false otherwise.
+ virtual bool Initialize(DemuxerStreamInterface* demuxer_stream) = 0;
+
+ // Returns the MediaFormat for this filter.
+ virtual const MediaFormat* GetMediaFormat() = 0;
+
+ // Schedules a read and takes ownership of the given buffer.
+ virtual void Read(AssignableInterface<VideoFrameInterface>* video_frame) = 0;
+};
+
+
+class AudioDecoderInterface : public MediaFilterInterface {
+ public:
+ static const FilterType kFilterType = FILTER_AUDIO_DECODER;
+ virtual ~AudioDecoderInterface() {}
+
+ // Initializes this filter, returns true if successful, false otherwise.
+ virtual bool Initialize(DemuxerStreamInterface* demuxer_stream) = 0;
+
+ // Returns the MediaFormat for this filter.
+ virtual const MediaFormat* GetMediaFormat() = 0;
+
+ // Schedules a read and takes ownership of the given buffer.
+ virtual void Read(AssignableInterface<BufferInterface>* buffer) = 0;
+};
+
+
+class VideoRendererInterface : public MediaFilterInterface {
+ public:
+ static const FilterType kFilterType = FILTER_VIDEO_RENDERER;
+ virtual ~VideoRendererInterface() {}
+
+ // Initializes this filter, returns true if successful, false otherwise.
+ virtual bool Initialize(VideoDecoderInterface* decoder) = 0;
+};
+
+
+class AudioRendererInterface : public MediaFilterInterface {
+ public:
+ static const FilterType kFilterType = FILTER_AUDIO_RENDERER;
+ virtual ~AudioRendererInterface() {}
+
+ // Initializes this filter, returns true if successful, false otherwise.
+ virtual bool Initialize(AudioDecoderInterface* decoder) = 0;
+};
+
+} // namespace media
+
+#endif // MEDIA_BASE_FILTERS_H_
Property changes on: media\base\filters.h
___________________________________________________________________
Added: svn:eol-style
+ LF
« no previous file with comments | « no previous file | media/base/media.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698