blob: 5c6f08c211e3e71b2d356abce5cf778d82629d45 [file] [log] [blame]
// 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.
// 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.
#ifndef MEDIA_BASE_FILTERS_H_
#define MEDIA_BASE_FILTERS_H_
#include <limits>
#include <string>
#include "base/ref_counted.h"
namespace media {
template <class TBuffer> class Assignable;
class Buffer;
class Decoder;
class DemuxerStream;
class FilterHost;
class MediaFormat;
class VideoFrame;
class WritableBuffer;
// 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
};
class MediaFilter : public base::RefCountedThreadSafe<MediaFilter> {
public:
virtual void SetFilterHost(FilterHost* filter_host) = 0;
protected:
friend class base::RefCountedThreadSafe<MediaFilter>;
virtual ~MediaFilter() {}
};
class DataSource : public MediaFilter {
public:
static const FilterType kFilterType = FILTER_DATA_SOURCE;
static const size_t kReadError = static_cast<size_t>(-1);
// Initializes this filter, returns true if successful, false otherwise.
virtual bool Initialize(const std::string& 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 Demuxer : public MediaFilter {
public:
static const FilterType kFilterType = FILTER_DEMUXER;
// Initializes this filter, returns true if successful, false otherwise.
virtual bool Initialize(DataSource* data_source) = 0;
// Returns the number of streams available
virtual size_t GetNumberOfStreams() = 0;
// Returns the stream for the given index, NULL otherwise
virtual DemuxerStream* GetStream(int stream_id) = 0;
};
class DemuxerStream {
public:
// Returns the MediaFormat for this filter.
virtual const MediaFormat* GetMediaFormat() = 0;
// Schedules a read and takes ownership of the given buffer.
virtual void Read(Assignable<Buffer>* buffer) = 0;
};
class VideoDecoder : public MediaFilter {
public:
static const FilterType kFilterType = FILTER_VIDEO_DECODER;
// Initializes this filter, returns true if successful, false otherwise.
virtual bool Initialize(DemuxerStream* 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(Assignable<VideoFrame>* video_frame) = 0;
};
class AudioDecoder : public MediaFilter {
public:
static const FilterType kFilterType = FILTER_AUDIO_DECODER;
// Initializes this filter, returns true if successful, false otherwise.
virtual bool Initialize(DemuxerStream* 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(Assignable<Buffer>* buffer) = 0;
};
class VideoRenderer : public MediaFilter {
public:
static const FilterType kFilterType = FILTER_VIDEO_RENDERER;
// Initializes this filter, returns true if successful, false otherwise.
virtual bool Initialize(VideoDecoder* decoder) = 0;
};
class AudioRenderer : public MediaFilter {
public:
static const FilterType kFilterType = FILTER_AUDIO_RENDERER;
// Initializes this filter, returns true if successful, false otherwise.
virtual bool Initialize(AudioDecoder* decoder) = 0;
};
} // namespace media
#endif // MEDIA_BASE_FILTERS_H_