OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this |
2 // source code is governed by a BSD-style license that can be found in the | 2 // source code is governed by a BSD-style license that can be found in the |
3 // LICENSE file. | 3 // LICENSE file. |
4 | 4 |
5 #ifndef MEDIA_BASE_MOCK_MEDIA_FILTERS_H_ | 5 #ifndef MEDIA_BASE_MOCK_MEDIA_FILTERS_H_ |
6 #define MEDIA_BASE_MOCK_MEDIA_FILTERS_H_ | 6 #define MEDIA_BASE_MOCK_MEDIA_FILTERS_H_ |
7 | 7 |
8 #include <string> | 8 #include <string> |
9 | 9 |
| 10 #include "base/waitable_event.h" |
| 11 #include "media/base/buffers.h" |
10 #include "media/base/factory.h" | 12 #include "media/base/factory.h" |
11 #include "media/base/filter_host.h" | 13 #include "media/base/filter_host.h" |
12 #include "media/base/filters.h" | 14 #include "media/base/filters.h" |
13 #include "media/base/media_format.h" | 15 #include "media/base/media_format.h" |
14 #include "media/base/pipeline.h" | 16 #include "media/base/pipeline.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
16 | 18 |
17 namespace media { | 19 namespace media { |
18 | 20 |
19 // Behaviors for MockDataSource filter. | 21 // Behaviors for MockDataSource filter. |
20 enum MockBehavior { | 22 enum MockDataSourceBehavior { |
21 MOCK_FILTER_NORMAL_INIT, | 23 MOCK_DATA_SOURCE_NORMAL_INIT, |
22 MOCK_FILTER_NEVER_INIT, | 24 MOCK_DATA_SOURCE_NEVER_INIT, |
23 MOCK_FILTER_TASK_INIT, | 25 MOCK_DATA_SOURCE_TASK_INIT, |
24 MOCK_FILTER_ERROR_IN_INIT, | 26 MOCK_DATA_SOURCE_ERROR_IN_INIT, |
25 MOCK_FILTER_INIT_RETURN_FALSE, | 27 MOCK_DATA_SOURCE_INIT_RETURN_FALSE, |
26 MOCK_FILTER_TASK_ERROR_PRE_INIT, | 28 MOCK_DATA_SOURCE_TASK_ERROR_PRE_INIT, |
27 MOCK_FILTER_TASK_ERROR_POST_INIT | 29 MOCK_DATA_SOURCE_TASK_ERROR_POST_INIT |
28 }; | 30 }; |
29 | 31 |
| 32 |
| 33 // This class is used by all of the mock filters to change the configuration |
| 34 // of the desired pipeline. The test using this must ensure that the lifetime |
| 35 // of the object is at least as long as the lifetime of the filters, as this |
| 36 // is typically allocated on the stack. |
| 37 struct MockFilterConfig { |
| 38 MockFilterConfig() |
| 39 : data_source_behavior(MOCK_DATA_SOURCE_NORMAL_INIT), |
| 40 video_width(1280u), |
| 41 video_height(720u), |
| 42 video_surface_format(VideoSurface::YV12), |
| 43 compressed_audio_mime_type(mime_type::kAACAudio), |
| 44 uncompressed_audio_mime_type(mime_type::kUncompressedAudio), |
| 45 compressed_video_mime_type(mime_type::kH264AnnexB), |
| 46 uncompressed_video_mime_type(mime_type::kUncompressedVideo), |
| 47 frame_duration(base::TimeDelta::FromMicroseconds(33333)) { |
| 48 } |
| 49 |
| 50 void set_no_video() { |
| 51 video_width = 0; |
| 52 video_height = 0; |
| 53 } |
| 54 |
| 55 bool has_video() const { |
| 56 return video_width > 0; |
| 57 } |
| 58 |
| 59 MockDataSourceBehavior data_source_behavior; |
| 60 size_t video_width; |
| 61 size_t video_height; |
| 62 VideoSurface::Format video_surface_format; |
| 63 std::string compressed_audio_mime_type; |
| 64 std::string uncompressed_audio_mime_type; |
| 65 std::string compressed_video_mime_type; |
| 66 std::string uncompressed_video_mime_type; |
| 67 base::TimeDelta frame_duration; |
| 68 }; |
| 69 |
| 70 |
30 class MockDataSource : public media::DataSource { | 71 class MockDataSource : public media::DataSource { |
31 public: | 72 public: |
32 static FilterFactory* CreateFactory(MockBehavior behavior) { | 73 static FilterFactory* CreateFactory(const MockFilterConfig* config) { |
33 return new FilterFactoryImpl1<MockDataSource, MockBehavior>(behavior); | 74 return new FilterFactoryImpl1<MockDataSource, |
| 75 const MockFilterConfig*>(config); |
34 } | 76 } |
35 | 77 |
36 // Implementation of MediaFilter. | 78 // Implementation of MediaFilter. |
37 virtual void Stop() {} | 79 virtual void Stop() {} |
38 | 80 |
39 // Implementation of DataSource. | 81 // Implementation of DataSource. |
40 virtual bool Initialize(const std::string& url) { | 82 virtual bool Initialize(const std::string& url) { |
41 media_format_.SetAsString(MediaFormat::kMimeType, | 83 media_format_.SetAsString(MediaFormat::kMimeType, |
42 mime_type::kApplicationOctetStream); | 84 mime_type::kApplicationOctetStream); |
43 media_format_.SetAsString(MediaFormat::kURL, url); | 85 media_format_.SetAsString(MediaFormat::kURL, url); |
44 switch (behavior_) { | 86 switch (behavior_) { |
45 case MOCK_FILTER_NORMAL_INIT: | 87 case MOCK_DATA_SOURCE_NORMAL_INIT: |
46 host_->InitializationComplete(); | 88 host_->InitializationComplete(); |
47 return true; | 89 return true; |
48 case MOCK_FILTER_NEVER_INIT: | 90 case MOCK_DATA_SOURCE_NEVER_INIT: |
49 return true; | 91 return true; |
50 case MOCK_FILTER_TASK_ERROR_POST_INIT: | 92 case MOCK_DATA_SOURCE_TASK_ERROR_POST_INIT: |
51 host_->InitializationComplete(); | 93 host_->InitializationComplete(); |
52 // Yes, we want to fall through to schedule the task... | 94 // Yes, we want to fall through to schedule the task... |
53 case MOCK_FILTER_TASK_ERROR_PRE_INIT: | 95 case MOCK_DATA_SOURCE_TASK_ERROR_PRE_INIT: |
54 case MOCK_FILTER_TASK_INIT: | 96 case MOCK_DATA_SOURCE_TASK_INIT: |
55 host_->PostTask(NewRunnableMethod(this, &MockDataSource::TaskBehavior)); | 97 host_->PostTask(NewRunnableMethod(this, &MockDataSource::TaskBehavior)); |
56 return true; | 98 return true; |
57 case MOCK_FILTER_ERROR_IN_INIT: | 99 case MOCK_DATA_SOURCE_ERROR_IN_INIT: |
58 host_->Error(PIPELINE_ERROR_NETWORK); | 100 host_->Error(PIPELINE_ERROR_NETWORK); |
59 return false; | 101 return false; |
60 case MOCK_FILTER_INIT_RETURN_FALSE: | 102 case MOCK_DATA_SOURCE_INIT_RETURN_FALSE: |
61 return false; | 103 return false; |
62 default: | 104 default: |
63 NOTREACHED(); | 105 NOTREACHED(); |
64 return false; | 106 return false; |
65 } | 107 } |
66 } | 108 } |
67 | 109 |
68 virtual const MediaFormat* GetMediaFormat() { | 110 virtual const MediaFormat* GetMediaFormat() { |
69 return &media_format_; | 111 return &media_format_; |
70 } | 112 } |
(...skipping 10 matching lines...) Expand all Loading... |
81 virtual bool SetPosition(int64 position) { | 123 virtual bool SetPosition(int64 position) { |
82 return true; | 124 return true; |
83 } | 125 } |
84 | 126 |
85 virtual bool GetSize(int64* size_out) { | 127 virtual bool GetSize(int64* size_out) { |
86 *size_out = 0; | 128 *size_out = 0; |
87 return false; | 129 return false; |
88 } | 130 } |
89 | 131 |
90 private: | 132 private: |
91 friend class media::FilterFactoryImpl1<MockDataSource, MockBehavior>; | 133 friend class media::FilterFactoryImpl1<MockDataSource, |
| 134 const MockFilterConfig*>; |
92 | 135 |
93 explicit MockDataSource(MockBehavior behavior) : behavior_(behavior) {} | 136 explicit MockDataSource(const MockFilterConfig* config) |
| 137 : behavior_(config->data_source_behavior) { |
| 138 } |
94 | 139 |
95 virtual ~MockDataSource() {} | 140 virtual ~MockDataSource() {} |
96 | 141 |
97 void TaskBehavior() { | 142 void TaskBehavior() { |
98 switch (behavior_) { | 143 switch (behavior_) { |
99 case MOCK_FILTER_TASK_ERROR_POST_INIT: | 144 case MOCK_DATA_SOURCE_TASK_ERROR_POST_INIT: |
100 case MOCK_FILTER_TASK_ERROR_PRE_INIT: | 145 case MOCK_DATA_SOURCE_TASK_ERROR_PRE_INIT: |
101 host_->Error(PIPELINE_ERROR_NETWORK); | 146 host_->Error(PIPELINE_ERROR_NETWORK); |
102 break; | 147 break; |
103 case MOCK_FILTER_TASK_INIT: | 148 case MOCK_DATA_SOURCE_TASK_INIT: |
104 host_->InitializationComplete(); | 149 host_->InitializationComplete(); |
105 break; | 150 break; |
106 default: | 151 default: |
107 NOTREACHED(); | 152 NOTREACHED(); |
108 } | 153 } |
109 } | 154 } |
110 | 155 |
111 MockBehavior behavior_; | 156 MockDataSourceBehavior behavior_; |
112 MediaFormat media_format_; | 157 MediaFormat media_format_; |
113 | 158 |
114 DISALLOW_COPY_AND_ASSIGN(MockDataSource); | 159 DISALLOW_COPY_AND_ASSIGN(MockDataSource); |
115 }; | 160 }; |
116 | 161 |
117 //------------------------------------------------------------------------------ | 162 //------------------------------------------------------------------------------ |
118 | 163 |
119 class MockDemuxer : public Demuxer { | 164 class MockDemuxer : public Demuxer { |
120 public: | 165 public: |
121 static FilterFactory* CreateFactory() { | 166 static FilterFactory* CreateFactory(const MockFilterConfig* config) { |
122 return new FilterFactoryImpl0<MockDemuxer>(); | 167 return new FilterFactoryImpl1<MockDemuxer, |
| 168 const MockFilterConfig*>(config); |
123 } | 169 } |
124 | 170 |
125 // Implementation of MediaFilter. | 171 // Implementation of MediaFilter. |
126 virtual void Stop() {} | 172 virtual void Stop() {} |
127 | 173 |
128 // Implementation of Demuxer. | 174 // Implementation of Demuxer. |
129 virtual bool Initialize(media::DataSource* data_source) { | 175 virtual bool Initialize(media::DataSource* data_source) { |
130 host_->InitializationComplete(); | 176 host_->InitializationComplete(); |
131 return true; | 177 return true; |
132 } | 178 } |
133 | 179 |
134 virtual size_t GetNumberOfStreams() { | 180 virtual size_t GetNumberOfStreams() { |
| 181 if (config_->has_video()) { |
| 182 return 2; |
| 183 } |
135 return 1; | 184 return 1; |
136 } | 185 } |
137 | 186 |
138 virtual media::DemuxerStream* GetStream(int stream_id) { | 187 virtual media::DemuxerStream* GetStream(int stream_id) { |
139 EXPECT_EQ(stream_id, 0); | 188 switch (stream_id) { |
140 return &mock_demuxer_stream_; | 189 case 0: |
| 190 return &mock_audio_stream_; |
| 191 case 1: |
| 192 if (config_->has_video()) { |
| 193 return &mock_video_stream_; |
| 194 } |
| 195 // Fall-through is correct if no video. |
| 196 default: |
| 197 ADD_FAILURE(); |
| 198 return NULL; |
| 199 } |
141 } | 200 } |
142 | 201 |
143 private: | 202 private: |
144 friend class media::FilterFactoryImpl0<MockDemuxer>; | 203 friend class media::FilterFactoryImpl1<MockDemuxer, const MockFilterConfig*>; |
145 | 204 |
146 MockDemuxer() {} | 205 explicit MockDemuxer(const MockFilterConfig* config) |
| 206 : config_(config), |
| 207 mock_audio_stream_(config->compressed_audio_mime_type), |
| 208 mock_video_stream_(config->compressed_video_mime_type) { |
| 209 } |
147 | 210 |
148 virtual ~MockDemuxer() {} | 211 virtual ~MockDemuxer() {} |
149 | 212 |
150 // Internal class implements DemuxerStream interface. | 213 // Internal class implements DemuxerStream interface. |
151 class MockDemuxerStream : public DemuxerStream { | 214 class MockDemuxerStream : public DemuxerStream { |
152 public: | 215 public: |
153 MockDemuxerStream() { | 216 explicit MockDemuxerStream(const std::string& mime_type) { |
154 media_format_.SetAsString(MediaFormat::kMimeType, | 217 media_format_.SetAsString(MediaFormat::kMimeType, mime_type); |
155 media::mime_type::kUncompressedAudio); | |
156 } | 218 } |
157 | 219 |
158 virtual ~MockDemuxerStream() {} | 220 virtual ~MockDemuxerStream() {} |
159 | 221 |
160 // Implementation of DemuxerStream. | 222 // Implementation of DemuxerStream. |
161 virtual const MediaFormat* GetMediaFormat() { | 223 virtual const MediaFormat* GetMediaFormat() { |
162 return &media_format_; // TODO(ralphl): implement | 224 return &media_format_; // TODO(ralphl): implement |
163 } | 225 } |
164 | 226 |
165 virtual void Read(Assignable<Buffer>* buffer) { | 227 virtual void Read(Assignable<Buffer>* buffer) { |
166 NOTREACHED(); // TODO(ralphl): fix me!! | 228 NOTREACHED(); // TODO(ralphl): fix me!! |
167 } | 229 } |
168 | 230 |
169 private: | 231 private: |
170 MediaFormat media_format_; | 232 MediaFormat media_format_; |
171 | 233 |
172 DISALLOW_COPY_AND_ASSIGN(MockDemuxerStream); | 234 DISALLOW_COPY_AND_ASSIGN(MockDemuxerStream); |
173 }; | 235 }; |
174 | 236 |
175 MockDemuxerStream mock_demuxer_stream_; | 237 const MockFilterConfig* config_; |
| 238 MockDemuxerStream mock_audio_stream_; |
| 239 MockDemuxerStream mock_video_stream_; |
176 | 240 |
177 DISALLOW_COPY_AND_ASSIGN(MockDemuxer); | 241 DISALLOW_COPY_AND_ASSIGN(MockDemuxer); |
178 }; | 242 }; |
179 | 243 |
180 //------------------------------------------------------------------------------ | 244 //------------------------------------------------------------------------------ |
181 | 245 |
182 class MockAudioDecoder : public AudioDecoder { | 246 class MockAudioDecoder : public AudioDecoder { |
183 public: | 247 public: |
184 static FilterFactory* CreateFactory() { | 248 static FilterFactory* CreateFactory(const MockFilterConfig* config) { |
185 return new FilterFactoryImpl0<MockAudioDecoder>(); | 249 return new FilterFactoryImpl1<MockAudioDecoder, |
| 250 const MockFilterConfig*>(config); |
186 } | 251 } |
187 | 252 |
188 static bool IsMediaFormatSupported(const MediaFormat* media_format) { | 253 static bool IsMediaFormatSupported(const MediaFormat* media_format) { |
189 return true; // TODO(ralphl): check for a supported format. | 254 return true; // TODO(ralphl): check for a supported format. |
190 } | 255 } |
191 | 256 |
192 // Implementation of MediaFilter. | 257 // Implementation of MediaFilter. |
193 virtual void Stop() {} | 258 virtual void Stop() {} |
194 | 259 |
195 // Implementation of AudioDecoder. | 260 // Implementation of AudioDecoder. |
196 virtual bool Initialize(DemuxerStream* stream) { | 261 virtual bool Initialize(DemuxerStream* stream) { |
197 host_->InitializationComplete(); | 262 host_->InitializationComplete(); |
198 return true; | 263 return true; |
199 } | 264 } |
200 | 265 |
201 virtual const MediaFormat* GetMediaFormat() { | 266 virtual const MediaFormat* GetMediaFormat() { |
202 return &media_format_; | 267 return &media_format_; |
203 } | 268 } |
204 | 269 |
205 virtual void Read(Assignable<Buffer>* buffer) { | 270 virtual void Read(Assignable<Buffer>* buffer) { |
206 // TODO(ralphl): implement mock read. | 271 // TODO(ralphl): implement mock read. |
207 NOTREACHED(); | 272 NOTREACHED(); |
208 } | 273 } |
209 | 274 |
210 private: | 275 private: |
211 friend class media::FilterFactoryImpl0<MockAudioDecoder>; | 276 friend class media::FilterFactoryImpl1<MockAudioDecoder, |
| 277 const MockFilterConfig*>; |
212 | 278 |
213 MockAudioDecoder() { | 279 explicit MockAudioDecoder(const MockFilterConfig* config) { |
214 media_format_.SetAsString(MediaFormat::kMimeType, | 280 media_format_.SetAsString(MediaFormat::kMimeType, |
215 media::mime_type::kUncompressedAudio); | 281 config->uncompressed_audio_mime_type); |
216 } | 282 } |
217 | 283 |
218 virtual ~MockAudioDecoder() {} | 284 virtual ~MockAudioDecoder() {} |
219 | 285 |
220 MediaFormat media_format_; | 286 MediaFormat media_format_; |
221 | 287 |
222 DISALLOW_COPY_AND_ASSIGN(MockAudioDecoder); | 288 DISALLOW_COPY_AND_ASSIGN(MockAudioDecoder); |
223 }; | 289 }; |
224 | 290 |
225 //------------------------------------------------------------------------------ | 291 //------------------------------------------------------------------------------ |
226 | 292 |
227 class MockAudioRenderer : public AudioRenderer { | 293 class MockAudioRenderer : public AudioRenderer { |
228 public: | 294 public: |
229 static FilterFactory* CreateFactory() { | 295 static FilterFactory* CreateFactory(const MockFilterConfig* config) { |
230 return new FilterFactoryImpl0<MockAudioRenderer>(); | 296 return new FilterFactoryImpl1<MockAudioRenderer, |
| 297 const MockFilterConfig*>(config); |
231 } | 298 } |
232 | 299 |
233 static bool IsMediaFormatSupported(const MediaFormat* media_format) { | 300 static bool IsMediaFormatSupported(const MediaFormat* media_format) { |
234 return true; // TODO(ralphl): check for a supported format | 301 return true; // TODO(ralphl): check for a supported format |
235 } | 302 } |
236 | 303 |
237 // Implementation of MediaFilter. | 304 // Implementation of MediaFilter. |
238 virtual void Stop() {} | 305 virtual void Stop() {} |
239 | 306 |
240 // Implementation of AudioRenderer. | 307 // Implementation of AudioRenderer. |
241 virtual bool Initialize(AudioDecoder* decoder) { | 308 virtual bool Initialize(AudioDecoder* decoder) { |
242 host_->InitializationComplete(); | 309 host_->InitializationComplete(); |
243 return true; | 310 return true; |
244 } | 311 } |
245 | 312 |
246 virtual void SetVolume(float volume) {} | 313 virtual void SetVolume(float volume) {} |
247 | 314 |
248 private: | 315 private: |
249 friend class media::FilterFactoryImpl0<MockAudioRenderer>; | 316 friend class media::FilterFactoryImpl1<MockAudioRenderer, |
| 317 const MockFilterConfig*>; |
250 | 318 |
251 MockAudioRenderer() {} | 319 explicit MockAudioRenderer(const MockFilterConfig* config) {} |
252 | 320 |
253 virtual ~MockAudioRenderer() {} | 321 virtual ~MockAudioRenderer() {} |
254 | 322 |
255 DISALLOW_COPY_AND_ASSIGN(MockAudioRenderer); | 323 DISALLOW_COPY_AND_ASSIGN(MockAudioRenderer); |
256 }; | 324 }; |
257 | 325 |
258 //------------------------------------------------------------------------------ | 326 //------------------------------------------------------------------------------ |
| 327 |
| 328 class MockVideoFrame : public VideoFrame { |
| 329 public: |
| 330 explicit MockVideoFrame(const MockFilterConfig* config, |
| 331 base::TimeDelta timestamp) |
| 332 : config_(config), |
| 333 surface_locked_(false), |
| 334 timestamp_(timestamp), |
| 335 duration_(config->frame_duration) { |
| 336 } |
| 337 |
| 338 virtual ~MockVideoFrame() {} |
| 339 |
| 340 virtual base::TimeDelta GetTimestamp() const { |
| 341 return timestamp_; |
| 342 } |
| 343 |
| 344 virtual base::TimeDelta GetDuration() const { |
| 345 return duration_; |
| 346 } |
| 347 |
| 348 virtual void SetTimestamp(const base::TimeDelta& timestamp) { |
| 349 timestamp_ = timestamp; |
| 350 } |
| 351 |
| 352 virtual void SetDuration(const base::TimeDelta& duration) { |
| 353 duration_ = duration; |
| 354 } |
| 355 |
| 356 virtual bool Lock(VideoSurface* surface) { |
| 357 EXPECT_FALSE(surface_locked_); |
| 358 surface_locked_ = true; |
| 359 surface->format = config_->video_surface_format; |
| 360 surface->width = config_->video_width; |
| 361 surface->height = config_->video_height; |
| 362 // TODO(ralphl): mock the data for video surfaces too. |
| 363 surface->planes = 3; |
| 364 surface->data[0] = NULL; |
| 365 surface->data[1] = NULL; |
| 366 surface->data[2] = NULL; |
| 367 surface->strides[0] = 0; |
| 368 surface->strides[1] = 0; |
| 369 surface->strides[2] = 0; |
| 370 return false; |
| 371 } |
| 372 |
| 373 virtual void Unlock() { |
| 374 EXPECT_TRUE(surface_locked_); |
| 375 surface_locked_ = false; |
| 376 } |
| 377 |
| 378 private: |
| 379 const MockFilterConfig* config_; |
| 380 bool surface_locked_; |
| 381 base::TimeDelta timestamp_; |
| 382 base::TimeDelta duration_; |
| 383 |
| 384 DISALLOW_COPY_AND_ASSIGN(MockVideoFrame); |
| 385 }; |
| 386 |
| 387 class MockVideoDecoder : public VideoDecoder { |
| 388 public: |
| 389 static FilterFactory* CreateFactory(const MockFilterConfig* config) { |
| 390 return new FilterFactoryImpl1<MockVideoDecoder, |
| 391 const MockFilterConfig*>(config); |
| 392 } |
| 393 |
| 394 static bool IsMediaFormatSupported(const MediaFormat* media_format) { |
| 395 return true; // TODO(ralphl): check for a supported format. |
| 396 } |
| 397 |
| 398 // Implementation of MediaFilter. |
| 399 virtual void Stop() {} |
| 400 |
| 401 // Implementation of VideoDecoder. |
| 402 virtual bool Initialize(DemuxerStream* stream) { |
| 403 host_->InitializationComplete(); |
| 404 return true; |
| 405 } |
| 406 |
| 407 virtual const MediaFormat* GetMediaFormat() { |
| 408 return &media_format_; |
| 409 } |
| 410 |
| 411 virtual void Read(Assignable<VideoFrame>* buffer) { |
| 412 buffer->AddRef(); |
| 413 host_->PostTask(NewRunnableMethod(this, &MockVideoDecoder::DoRead, buffer)); |
| 414 } |
| 415 |
| 416 private: |
| 417 friend class media::FilterFactoryImpl1<MockVideoDecoder, |
| 418 const MockFilterConfig*>; |
| 419 |
| 420 explicit MockVideoDecoder(const MockFilterConfig* config) |
| 421 : config_(config) { |
| 422 media_format_.SetAsString(MediaFormat::kMimeType, |
| 423 config->uncompressed_video_mime_type); |
| 424 media_format_.SetAsInteger(MediaFormat::kWidth, config->video_width); |
| 425 media_format_.SetAsInteger(MediaFormat::kHeight, config->video_height); |
| 426 } |
| 427 |
| 428 void DoRead(Assignable<VideoFrame>* buffer) { |
| 429 VideoFrame* frame = new MockVideoFrame(config_, mock_frame_time_); |
| 430 mock_frame_time_ += config_->frame_duration; |
| 431 buffer->SetBuffer(frame); |
| 432 buffer->OnAssignment(); |
| 433 buffer->Release(); |
| 434 } |
| 435 |
| 436 virtual ~MockVideoDecoder() {} |
| 437 |
| 438 MediaFormat media_format_; |
| 439 base::TimeDelta mock_frame_time_; |
| 440 const MockFilterConfig* config_; |
| 441 |
| 442 DISALLOW_COPY_AND_ASSIGN(MockVideoDecoder); |
| 443 }; |
| 444 |
| 445 //------------------------------------------------------------------------------ |
| 446 |
| 447 class MockVideoRenderer : public VideoRenderer { |
| 448 public: |
| 449 static FilterFactory* CreateFactory(const MockFilterConfig* config) { |
| 450 return new FilterFactoryImpl1<MockVideoRenderer, |
| 451 const MockFilterConfig*>(config); |
| 452 } |
| 453 |
| 454 static bool IsMediaFormatSupported(const MediaFormat* media_format) { |
| 455 return true; // TODO(ralphl): check for a supported format |
| 456 } |
| 457 |
| 458 // Implementation of MediaFilter. |
| 459 virtual void Stop() {} |
| 460 |
| 461 // Implementation of VideoRenderer. |
| 462 virtual bool Initialize(VideoDecoder* decoder) { |
| 463 host_->SetVideoSize(config_->video_width, config_->video_height); |
| 464 host_->InitializationComplete(); |
| 465 return true; |
| 466 } |
| 467 |
| 468 private: |
| 469 friend class media::FilterFactoryImpl1<MockVideoRenderer, |
| 470 const MockFilterConfig*>; |
| 471 |
| 472 explicit MockVideoRenderer(const MockFilterConfig* config) |
| 473 : config_(config) { |
| 474 } |
| 475 |
| 476 virtual ~MockVideoRenderer() {} |
| 477 |
| 478 const MockFilterConfig* config_; |
| 479 |
| 480 DISALLOW_COPY_AND_ASSIGN(MockVideoRenderer); |
| 481 }; |
| 482 |
| 483 |
| 484 |
| 485 //------------------------------------------------------------------------------ |
259 // Simple class that derives from the WaitableEvent class. The event remains | 486 // Simple class that derives from the WaitableEvent class. The event remains |
260 // in the reset state until the initialization complete callback is called from | 487 // in the reset state until the initialization complete callback is called from |
261 // a media pipeline. The normal use of this object looks like: | 488 // a media pipeline. The normal use of this object looks like: |
262 // Pipeline p; | 489 // Pipeline p; |
263 // FilterFactoryCollection f; | 490 // FilterFactoryCollection f; |
264 // f->AddFactory(a); | 491 // f->AddFactory(a); |
265 // f->AddFactory(b); | 492 // f->AddFactory(b); |
266 // ... | 493 // ... |
267 // InitializationHelper h; | 494 // InitializationHelper h; |
268 // h.Start(&p, f, uri); | 495 // h.Start(&p, f, uri); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 | 542 |
316 bool callback_success_status_; | 543 bool callback_success_status_; |
317 bool waiting_for_callback_; | 544 bool waiting_for_callback_; |
318 | 545 |
319 DISALLOW_COPY_AND_ASSIGN(InitializationHelper); | 546 DISALLOW_COPY_AND_ASSIGN(InitializationHelper); |
320 }; | 547 }; |
321 | 548 |
322 } // namespace media | 549 } // namespace media |
323 | 550 |
324 #endif // MEDIA_BASE_MOCK_MEDIA_FILTERS_H_ | 551 #endif // MEDIA_BASE_MOCK_MEDIA_FILTERS_H_ |
OLD | NEW |