forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfilter_collection.cc
103 lines (79 loc) · 2.57 KB
/
filter_collection.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
// Copyright (c) 2010 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.
#include "media/base/filter_collection.h"
namespace media {
FilterCollection::FilterCollection() {}
FilterCollection::~FilterCollection() {}
void FilterCollection::AddDataSource(DataSource* filter) {
AddFilter(DATA_SOURCE, filter);
}
void FilterCollection::AddDemuxer(Demuxer* filter) {
AddFilter(DEMUXER, filter);
}
void FilterCollection::AddVideoDecoder(VideoDecoder* filter) {
AddFilter(VIDEO_DECODER, filter);
}
void FilterCollection::AddAudioDecoder(AudioDecoder* filter) {
AddFilter(AUDIO_DECODER, filter);
}
void FilterCollection::AddVideoRenderer(VideoRenderer* filter) {
AddFilter(VIDEO_RENDERER, filter);
}
void FilterCollection::AddAudioRenderer(AudioRenderer* filter) {
AddFilter(AUDIO_RENDERER, filter);
}
bool FilterCollection::IsEmpty() const {
return filters_.empty();
}
void FilterCollection::Clear() {
filters_.clear();
}
void FilterCollection::SelectDataSource(
scoped_refptr<DataSource>* filter_out) {
SelectFilter<DATA_SOURCE>(filter_out);
}
void FilterCollection::SelectDemuxer(scoped_refptr<Demuxer>* filter_out) {
SelectFilter<DEMUXER>(filter_out);
}
void FilterCollection::SelectVideoDecoder(
scoped_refptr<VideoDecoder>* filter_out) {
SelectFilter<VIDEO_DECODER>(filter_out);
}
void FilterCollection::SelectAudioDecoder(
scoped_refptr<AudioDecoder>* filter_out) {
SelectFilter<AUDIO_DECODER>(filter_out);
}
void FilterCollection::SelectVideoRenderer(
scoped_refptr<VideoRenderer>* filter_out) {
SelectFilter<VIDEO_RENDERER>(filter_out);
}
void FilterCollection::SelectAudioRenderer(
scoped_refptr<AudioRenderer>* filter_out) {
SelectFilter<AUDIO_RENDERER>(filter_out);
}
void FilterCollection::AddFilter(FilterType filter_type,
Filter* filter) {
filters_.push_back(FilterListElement(filter_type, filter));
}
template<FilterCollection::FilterType filter_type, typename F>
void FilterCollection::SelectFilter(scoped_refptr<F>* filter_out) {
scoped_refptr<Filter> filter;
SelectFilter(filter_type, &filter);
*filter_out = reinterpret_cast<F*>(filter.get());
}
void FilterCollection::SelectFilter(
FilterType filter_type,
scoped_refptr<Filter>* filter_out) {
FilterList::iterator it = filters_.begin();
while (it != filters_.end()) {
if (it->first == filter_type)
break;
++it;
}
if (it != filters_.end()) {
*filter_out = it->second.get();
filters_.erase(it);
}
}
} // namespace media