blob: 97e723297880e28cd3901cd3fee8a833c8d4ea96 [file] [log] [blame]
// Copyright (c) 2011 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_FILTER_COLLECTION_H_
#define MEDIA_BASE_FILTER_COLLECTION_H_
#include <list>
#include "base/memory/ref_counted.h"
#include "media/base/filters.h"
#include "media/base/filter_factories.h"
namespace media {
// This is a collection of Filter objects used to form a media playback
// pipeline. See src/media/base/pipeline.h for more information.
class MEDIA_EXPORT FilterCollection {
public:
FilterCollection();
~FilterCollection();
// DemuxerFactory accessor methods.
// FilterCollection takes ownership of the factory here.
void SetDemuxerFactory(DemuxerFactory* factory);
DemuxerFactory* GetDemuxerFactory();
// Adds a filter to the collection.
void AddVideoDecoder(VideoDecoder* filter);
void AddAudioDecoder(AudioDecoder* filter);
void AddVideoRenderer(VideoRenderer* filter);
void AddAudioRenderer(AudioRenderer* filter);
// Is the collection empty?
bool IsEmpty() const;
// Remove remaining filters.
void Clear();
// Selects a filter of the specified type from the collection.
// If the required filter cannot be found, NULL is returned.
// If a filter is returned it is removed from the collection.
void SelectVideoDecoder(scoped_refptr<VideoDecoder>* filter_out);
void SelectAudioDecoder(scoped_refptr<AudioDecoder>* filter_out);
void SelectVideoRenderer(scoped_refptr<VideoRenderer>* filter_out);
void SelectAudioRenderer(scoped_refptr<AudioRenderer>* filter_out);
private:
// Identifies the type of filter implementation. Each filter has to be one of
// the following types. This is used to mark, identify, and support
// downcasting of different filter types stored in the filters_ list.
enum FilterType {
AUDIO_DECODER,
VIDEO_DECODER,
AUDIO_RENDERER,
VIDEO_RENDERER,
};
// List of filters managed by this collection.
typedef std::pair<FilterType, scoped_refptr<Filter> > FilterListElement;
typedef std::list<FilterListElement> FilterList;
FilterList filters_;
scoped_ptr<DemuxerFactory> demuxer_factory_;
// Helper function that adds a filter to the filter list.
void AddFilter(FilterType filter_type, Filter* filter);
// Helper function for SelectXXX() methods. It manages the
// downcasting and mapping between FilterType and Filter class.
template<FilterType filter_type, typename F>
void SelectFilter(scoped_refptr<F>* filter_out);
// Helper function that searches the filters list for a specific filter type.
void SelectFilter(FilterType filter_type, scoped_refptr<Filter>* filter_out);
DISALLOW_COPY_AND_ASSIGN(FilterCollection);
};
} // namespace media
#endif // MEDIA_BASE_FILTER_COLLECTION_H_