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" | 10 #include "base/waitable_event.h" |
(...skipping 27 matching lines...) Expand all Loading... |
38 MockFilterConfig() | 38 MockFilterConfig() |
39 : data_source_behavior(MOCK_DATA_SOURCE_NORMAL_INIT), | 39 : data_source_behavior(MOCK_DATA_SOURCE_NORMAL_INIT), |
40 has_video(true), | 40 has_video(true), |
41 video_width(1280u), | 41 video_width(1280u), |
42 video_height(720u), | 42 video_height(720u), |
43 video_surface_format(VideoSurface::YV12), | 43 video_surface_format(VideoSurface::YV12), |
44 compressed_audio_mime_type(mime_type::kAACAudio), | 44 compressed_audio_mime_type(mime_type::kAACAudio), |
45 uncompressed_audio_mime_type(mime_type::kUncompressedAudio), | 45 uncompressed_audio_mime_type(mime_type::kUncompressedAudio), |
46 compressed_video_mime_type(mime_type::kH264AnnexB), | 46 compressed_video_mime_type(mime_type::kH264AnnexB), |
47 uncompressed_video_mime_type(mime_type::kUncompressedVideo), | 47 uncompressed_video_mime_type(mime_type::kUncompressedVideo), |
48 frame_duration(base::TimeDelta::FromMicroseconds(33333)) { | 48 frame_duration(base::TimeDelta::FromMicroseconds(33333)), |
| 49 media_duration(base::TimeDelta::FromSeconds(5)) { |
49 } | 50 } |
50 | 51 |
51 MockDataSourceBehavior data_source_behavior; | 52 MockDataSourceBehavior data_source_behavior; |
52 bool has_video; | 53 bool has_video; |
53 size_t video_width; | 54 size_t video_width; |
54 size_t video_height; | 55 size_t video_height; |
55 VideoSurface::Format video_surface_format; | 56 VideoSurface::Format video_surface_format; |
56 std::string compressed_audio_mime_type; | 57 std::string compressed_audio_mime_type; |
57 std::string uncompressed_audio_mime_type; | 58 std::string uncompressed_audio_mime_type; |
58 std::string compressed_video_mime_type; | 59 std::string compressed_video_mime_type; |
59 std::string uncompressed_video_mime_type; | 60 std::string uncompressed_video_mime_type; |
60 base::TimeDelta frame_duration; | 61 base::TimeDelta frame_duration; |
| 62 base::TimeDelta media_duration; |
61 }; | 63 }; |
62 | 64 |
63 | 65 |
64 class MockDataSource : public media::DataSource { | 66 class MockDataSource : public DataSource { |
65 public: | 67 public: |
66 static FilterFactory* CreateFactory(const MockFilterConfig* config) { | 68 static FilterFactory* CreateFactory(const MockFilterConfig* config) { |
67 return new FilterFactoryImpl1<MockDataSource, | 69 return new FilterFactoryImpl1<MockDataSource, |
68 const MockFilterConfig*>(config); | 70 const MockFilterConfig*>(config); |
69 } | 71 } |
70 | 72 |
71 // Implementation of MediaFilter. | 73 // Implementation of MediaFilter. |
72 virtual void Stop() {} | 74 virtual void Stop() {} |
73 | 75 |
74 // Implementation of DataSource. | 76 // Implementation of DataSource. |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 virtual bool SetPosition(int64 position) { | 118 virtual bool SetPosition(int64 position) { |
117 return true; | 119 return true; |
118 } | 120 } |
119 | 121 |
120 virtual bool GetSize(int64* size_out) { | 122 virtual bool GetSize(int64* size_out) { |
121 *size_out = 0; | 123 *size_out = 0; |
122 return false; | 124 return false; |
123 } | 125 } |
124 | 126 |
125 private: | 127 private: |
126 friend class media::FilterFactoryImpl1<MockDataSource, | 128 friend class FilterFactoryImpl1<MockDataSource, |
127 const MockFilterConfig*>; | 129 const MockFilterConfig*>; |
128 | 130 |
129 explicit MockDataSource(const MockFilterConfig* config) | 131 explicit MockDataSource(const MockFilterConfig* config) |
130 : behavior_(config->data_source_behavior) { | 132 : behavior_(config->data_source_behavior) { |
131 } | 133 } |
132 | 134 |
133 virtual ~MockDataSource() {} | 135 virtual ~MockDataSource() {} |
134 | 136 |
135 void TaskBehavior() { | 137 void TaskBehavior() { |
136 switch (behavior_) { | 138 switch (behavior_) { |
137 case MOCK_DATA_SOURCE_TASK_ERROR_POST_INIT: | 139 case MOCK_DATA_SOURCE_TASK_ERROR_POST_INIT: |
(...skipping 20 matching lines...) Expand all Loading... |
158 public: | 160 public: |
159 static FilterFactory* CreateFactory(const MockFilterConfig* config) { | 161 static FilterFactory* CreateFactory(const MockFilterConfig* config) { |
160 return new FilterFactoryImpl1<MockDemuxer, | 162 return new FilterFactoryImpl1<MockDemuxer, |
161 const MockFilterConfig*>(config); | 163 const MockFilterConfig*>(config); |
162 } | 164 } |
163 | 165 |
164 // Implementation of MediaFilter. | 166 // Implementation of MediaFilter. |
165 virtual void Stop() {} | 167 virtual void Stop() {} |
166 | 168 |
167 // Implementation of Demuxer. | 169 // Implementation of Demuxer. |
168 virtual bool Initialize(media::DataSource* data_source) { | 170 virtual bool Initialize(DataSource* data_source) { |
169 host_->InitializationComplete(); | 171 host_->InitializationComplete(); |
170 return true; | 172 return true; |
171 } | 173 } |
172 | 174 |
173 virtual size_t GetNumberOfStreams() { | 175 virtual size_t GetNumberOfStreams() { |
174 if (config_->has_video) { | 176 if (config_->has_video) { |
175 return 2; | 177 return 2; |
176 } | 178 } |
177 return 1; | 179 return 1; |
178 } | 180 } |
179 | 181 |
180 virtual media::DemuxerStream* GetStream(int stream_id) { | 182 virtual DemuxerStream* GetStream(int stream_id) { |
181 switch (stream_id) { | 183 switch (stream_id) { |
182 case 0: | 184 case 0: |
183 return &mock_audio_stream_; | 185 return &mock_audio_stream_; |
184 case 1: | 186 case 1: |
185 if (config_->has_video) { | 187 if (config_->has_video) { |
186 return &mock_video_stream_; | 188 return &mock_video_stream_; |
187 } | 189 } |
188 // Fall-through is correct if no video. | 190 // Fall-through is correct if no video. |
189 default: | 191 default: |
190 ADD_FAILURE(); | 192 ADD_FAILURE(); |
191 return NULL; | 193 return NULL; |
192 } | 194 } |
193 } | 195 } |
194 | 196 |
195 private: | 197 private: |
196 friend class media::FilterFactoryImpl1<MockDemuxer, const MockFilterConfig*>; | 198 friend class FilterFactoryImpl1<MockDemuxer, const MockFilterConfig*>; |
197 | 199 |
198 explicit MockDemuxer(const MockFilterConfig* config) | 200 explicit MockDemuxer(const MockFilterConfig* config) |
199 : config_(config), | 201 : config_(config), |
200 mock_audio_stream_(config->compressed_audio_mime_type), | 202 mock_audio_stream_(config->compressed_audio_mime_type), |
201 mock_video_stream_(config->compressed_video_mime_type) { | 203 mock_video_stream_(config->compressed_video_mime_type) { |
202 } | 204 } |
203 | 205 |
204 virtual ~MockDemuxer() {} | 206 virtual ~MockDemuxer() {} |
205 | 207 |
206 // Internal class implements DemuxerStream interface. | 208 // Internal class implements DemuxerStream interface. |
207 class MockDemuxerStream : public DemuxerStream { | 209 class MockDemuxerStream : public DemuxerStream { |
208 public: | 210 public: |
209 explicit MockDemuxerStream(const std::string& mime_type) { | 211 explicit MockDemuxerStream(const std::string& mime_type) { |
210 media_format_.SetAsString(MediaFormat::kMimeType, mime_type); | 212 media_format_.SetAsString(MediaFormat::kMimeType, mime_type); |
211 } | 213 } |
212 | 214 |
213 virtual ~MockDemuxerStream() {} | 215 virtual ~MockDemuxerStream() {} |
214 | 216 |
215 // Implementation of DemuxerStream. | 217 // Implementation of DemuxerStream. |
216 virtual const MediaFormat* GetMediaFormat() { | 218 virtual const MediaFormat* GetMediaFormat() { |
217 return &media_format_; // TODO(ralphl): implement | 219 return &media_format_; |
218 } | 220 } |
219 | 221 |
220 virtual void Read(Assignable<Buffer>* buffer) { | 222 virtual void Read(Assignable<Buffer>* buffer) { |
221 NOTREACHED(); // TODO(ralphl): fix me!! | 223 NOTREACHED(); // TODO(ralphl): fix me!! |
222 } | 224 } |
223 | 225 |
224 private: | 226 private: |
225 MediaFormat media_format_; | 227 MediaFormat media_format_; |
226 | 228 |
227 DISALLOW_COPY_AND_ASSIGN(MockDemuxerStream); | 229 DISALLOW_COPY_AND_ASSIGN(MockDemuxerStream); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 virtual const MediaFormat* GetMediaFormat() { | 261 virtual const MediaFormat* GetMediaFormat() { |
260 return &media_format_; | 262 return &media_format_; |
261 } | 263 } |
262 | 264 |
263 virtual void Read(Assignable<Buffer>* buffer) { | 265 virtual void Read(Assignable<Buffer>* buffer) { |
264 // TODO(ralphl): implement mock read. | 266 // TODO(ralphl): implement mock read. |
265 NOTREACHED(); | 267 NOTREACHED(); |
266 } | 268 } |
267 | 269 |
268 private: | 270 private: |
269 friend class media::FilterFactoryImpl1<MockAudioDecoder, | 271 friend class FilterFactoryImpl1<MockAudioDecoder, const MockFilterConfig*>; |
270 const MockFilterConfig*>; | |
271 | 272 |
272 explicit MockAudioDecoder(const MockFilterConfig* config) { | 273 explicit MockAudioDecoder(const MockFilterConfig* config) { |
273 media_format_.SetAsString(MediaFormat::kMimeType, | 274 media_format_.SetAsString(MediaFormat::kMimeType, |
274 config->uncompressed_audio_mime_type); | 275 config->uncompressed_audio_mime_type); |
275 } | 276 } |
276 | 277 |
277 virtual ~MockAudioDecoder() {} | 278 virtual ~MockAudioDecoder() {} |
278 | 279 |
279 MediaFormat media_format_; | 280 MediaFormat media_format_; |
280 | 281 |
(...skipping 18 matching lines...) Expand all Loading... |
299 | 300 |
300 // Implementation of AudioRenderer. | 301 // Implementation of AudioRenderer. |
301 virtual bool Initialize(AudioDecoder* decoder) { | 302 virtual bool Initialize(AudioDecoder* decoder) { |
302 host_->InitializationComplete(); | 303 host_->InitializationComplete(); |
303 return true; | 304 return true; |
304 } | 305 } |
305 | 306 |
306 virtual void SetVolume(float volume) {} | 307 virtual void SetVolume(float volume) {} |
307 | 308 |
308 private: | 309 private: |
309 friend class media::FilterFactoryImpl1<MockAudioRenderer, | 310 friend class FilterFactoryImpl1<MockAudioRenderer, const MockFilterConfig*>; |
310 const MockFilterConfig*>; | |
311 | 311 |
312 explicit MockAudioRenderer(const MockFilterConfig* config) {} | 312 explicit MockAudioRenderer(const MockFilterConfig* config) {} |
313 | 313 |
314 virtual ~MockAudioRenderer() {} | 314 virtual ~MockAudioRenderer() {} |
315 | 315 |
316 DISALLOW_COPY_AND_ASSIGN(MockAudioRenderer); | 316 DISALLOW_COPY_AND_ASSIGN(MockAudioRenderer); |
317 }; | 317 }; |
318 | 318 |
319 //------------------------------------------------------------------------------ | 319 //------------------------------------------------------------------------------ |
320 | 320 |
321 class MockVideoFrame : public VideoFrame { | 321 class MockVideoFrame : public VideoFrame { |
322 public: | 322 public: |
323 explicit MockVideoFrame(const MockFilterConfig* config, | 323 explicit MockVideoFrame(const MockFilterConfig* config, |
324 base::TimeDelta timestamp) | 324 base::TimeDelta timestamp) |
325 : config_(config), | 325 : config_(config), |
326 surface_locked_(false), | 326 surface_locked_(false) { |
327 timestamp_(timestamp), | 327 SetTimestamp(timestamp); |
328 duration_(config->frame_duration) { | 328 SetDuration(config->frame_duration); |
| 329 size_t y_byte_count = config_->video_width * config_->video_height; |
| 330 size_t uv_byte_count = y_byte_count / 4; |
| 331 surface_.format = config_->video_surface_format; |
| 332 surface_.width = config_->video_width; |
| 333 surface_.height = config_->video_height; |
| 334 surface_.planes = 3; |
| 335 surface_.data[0] = new char[y_byte_count]; |
| 336 surface_.data[1] = new char[uv_byte_count]; |
| 337 surface_.data[2] = new char[uv_byte_count]; |
| 338 surface_.strides[0] = config_->video_width; |
| 339 surface_.strides[1] = config_->video_width / 2; |
| 340 surface_.strides[2] = config_->video_width / 2; |
| 341 memset(surface_.data[0], 0, y_byte_count); |
| 342 memset(surface_.data[1], 0x80, uv_byte_count); |
| 343 memset(surface_.data[2], 0x80, uv_byte_count); |
| 344 int64 num_white_pixels = y_byte_count * |
| 345 timestamp.InMicroseconds() / |
| 346 config_->media_duration.InMicroseconds(); |
| 347 if (num_white_pixels > y_byte_count) { |
| 348 ADD_FAILURE(); |
| 349 num_white_pixels = y_byte_count; |
| 350 } |
| 351 if (num_white_pixels < 0) { |
| 352 ADD_FAILURE(); |
| 353 num_white_pixels = 0; |
| 354 } |
| 355 memset(surface_.data[0], 0xFF, static_cast<size_t>(num_white_pixels)); |
329 } | 356 } |
330 | 357 |
331 virtual ~MockVideoFrame() {} | 358 virtual ~MockVideoFrame() { |
332 | 359 delete[] surface_.data[0]; |
333 virtual base::TimeDelta GetTimestamp() const { | 360 delete[] surface_.data[1]; |
334 return timestamp_; | 361 delete[] surface_.data[2]; |
335 } | |
336 | |
337 virtual base::TimeDelta GetDuration() const { | |
338 return duration_; | |
339 } | |
340 | |
341 virtual void SetTimestamp(const base::TimeDelta& timestamp) { | |
342 timestamp_ = timestamp; | |
343 } | |
344 | |
345 virtual void SetDuration(const base::TimeDelta& duration) { | |
346 duration_ = duration; | |
347 } | 362 } |
348 | 363 |
349 virtual bool Lock(VideoSurface* surface) { | 364 virtual bool Lock(VideoSurface* surface) { |
350 EXPECT_FALSE(surface_locked_); | 365 EXPECT_FALSE(surface_locked_); |
| 366 if (surface_locked_) { |
| 367 memset(surface, 0, sizeof(*surface)); |
| 368 return false; |
| 369 } |
351 surface_locked_ = true; | 370 surface_locked_ = true; |
352 surface->format = config_->video_surface_format; | 371 DCHECK(sizeof(*surface) == sizeof(surface_)); |
353 surface->width = config_->video_width; | 372 memcpy(surface, &surface_, sizeof(*surface)); |
354 surface->height = config_->video_height; | 373 return true; |
355 // TODO(ralphl): mock the data for video surfaces too. | |
356 surface->planes = 3; | |
357 surface->data[0] = NULL; | |
358 surface->data[1] = NULL; | |
359 surface->data[2] = NULL; | |
360 surface->strides[0] = 0; | |
361 surface->strides[1] = 0; | |
362 surface->strides[2] = 0; | |
363 return false; | |
364 } | 374 } |
365 | 375 |
366 virtual void Unlock() { | 376 virtual void Unlock() { |
367 EXPECT_TRUE(surface_locked_); | 377 EXPECT_TRUE(surface_locked_); |
368 surface_locked_ = false; | 378 surface_locked_ = false; |
369 } | 379 } |
370 | 380 |
371 private: | 381 private: |
372 const MockFilterConfig* config_; | 382 const MockFilterConfig* config_; |
373 bool surface_locked_; | 383 bool surface_locked_; |
374 base::TimeDelta timestamp_; | 384 VideoSurface surface_; |
375 base::TimeDelta duration_; | |
376 | 385 |
377 DISALLOW_COPY_AND_ASSIGN(MockVideoFrame); | 386 DISALLOW_COPY_AND_ASSIGN(MockVideoFrame); |
378 }; | 387 }; |
379 | 388 |
380 class MockVideoDecoder : public VideoDecoder { | 389 class MockVideoDecoder : public VideoDecoder { |
381 public: | 390 public: |
382 static FilterFactory* CreateFactory(const MockFilterConfig* config) { | 391 static FilterFactory* CreateFactory(const MockFilterConfig* config) { |
383 return new FilterFactoryImpl1<MockVideoDecoder, | 392 return new FilterFactoryImpl1<MockVideoDecoder, |
384 const MockFilterConfig*>(config); | 393 const MockFilterConfig*>(config); |
385 } | 394 } |
(...skipping 14 matching lines...) Expand all Loading... |
400 virtual const MediaFormat* GetMediaFormat() { | 409 virtual const MediaFormat* GetMediaFormat() { |
401 return &media_format_; | 410 return &media_format_; |
402 } | 411 } |
403 | 412 |
404 virtual void Read(Assignable<VideoFrame>* buffer) { | 413 virtual void Read(Assignable<VideoFrame>* buffer) { |
405 buffer->AddRef(); | 414 buffer->AddRef(); |
406 host_->PostTask(NewRunnableMethod(this, &MockVideoDecoder::DoRead, buffer)); | 415 host_->PostTask(NewRunnableMethod(this, &MockVideoDecoder::DoRead, buffer)); |
407 } | 416 } |
408 | 417 |
409 private: | 418 private: |
410 friend class media::FilterFactoryImpl1<MockVideoDecoder, | 419 friend class FilterFactoryImpl1<MockVideoDecoder, const MockFilterConfig*>; |
411 const MockFilterConfig*>; | |
412 | 420 |
413 explicit MockVideoDecoder(const MockFilterConfig* config) | 421 explicit MockVideoDecoder(const MockFilterConfig* config) |
414 : config_(config) { | 422 : config_(config) { |
415 media_format_.SetAsString(MediaFormat::kMimeType, | 423 media_format_.SetAsString(MediaFormat::kMimeType, |
416 config->uncompressed_video_mime_type); | 424 config->uncompressed_video_mime_type); |
417 media_format_.SetAsInteger(MediaFormat::kWidth, config->video_width); | 425 media_format_.SetAsInteger(MediaFormat::kWidth, config->video_width); |
418 media_format_.SetAsInteger(MediaFormat::kHeight, config->video_height); | 426 media_format_.SetAsInteger(MediaFormat::kHeight, config->video_height); |
419 } | 427 } |
420 | 428 |
421 void DoRead(Assignable<VideoFrame>* buffer) { | 429 void DoRead(Assignable<VideoFrame>* buffer) { |
422 VideoFrame* frame = new MockVideoFrame(config_, mock_frame_time_); | 430 if (mock_frame_time_ < config_->media_duration) { |
423 mock_frame_time_ += config_->frame_duration; | 431 VideoFrame* frame = new MockVideoFrame(config_, mock_frame_time_); |
424 buffer->SetBuffer(frame); | 432 mock_frame_time_ += config_->frame_duration; |
425 buffer->OnAssignment(); | 433 if (mock_frame_time_ >= config_->media_duration) { |
| 434 frame->SetEndOfStream(true); |
| 435 } |
| 436 buffer->SetBuffer(frame); |
| 437 buffer->OnAssignment(); |
| 438 } |
426 buffer->Release(); | 439 buffer->Release(); |
427 } | 440 } |
428 | 441 |
429 virtual ~MockVideoDecoder() {} | 442 virtual ~MockVideoDecoder() {} |
430 | 443 |
431 MediaFormat media_format_; | 444 MediaFormat media_format_; |
432 base::TimeDelta mock_frame_time_; | 445 base::TimeDelta mock_frame_time_; |
433 const MockFilterConfig* config_; | 446 const MockFilterConfig* config_; |
434 | 447 |
435 DISALLOW_COPY_AND_ASSIGN(MockVideoDecoder); | 448 DISALLOW_COPY_AND_ASSIGN(MockVideoDecoder); |
(...skipping 16 matching lines...) Expand all Loading... |
452 virtual void Stop() {} | 465 virtual void Stop() {} |
453 | 466 |
454 // Implementation of VideoRenderer. | 467 // Implementation of VideoRenderer. |
455 virtual bool Initialize(VideoDecoder* decoder) { | 468 virtual bool Initialize(VideoDecoder* decoder) { |
456 host_->SetVideoSize(config_->video_width, config_->video_height); | 469 host_->SetVideoSize(config_->video_width, config_->video_height); |
457 host_->InitializationComplete(); | 470 host_->InitializationComplete(); |
458 return true; | 471 return true; |
459 } | 472 } |
460 | 473 |
461 private: | 474 private: |
462 friend class media::FilterFactoryImpl1<MockVideoRenderer, | 475 friend class FilterFactoryImpl1<MockVideoRenderer, const MockFilterConfig*>; |
463 const MockFilterConfig*>; | |
464 | 476 |
465 explicit MockVideoRenderer(const MockFilterConfig* config) | 477 explicit MockVideoRenderer(const MockFilterConfig* config) |
466 : config_(config) { | 478 : config_(config) { |
467 } | 479 } |
468 | 480 |
469 virtual ~MockVideoRenderer() {} | 481 virtual ~MockVideoRenderer() {} |
470 | 482 |
471 const MockFilterConfig* config_; | 483 const MockFilterConfig* config_; |
472 | 484 |
473 DISALLOW_COPY_AND_ASSIGN(MockVideoRenderer); | 485 DISALLOW_COPY_AND_ASSIGN(MockVideoRenderer); |
474 }; | 486 }; |
475 | 487 |
476 | 488 |
477 | |
478 //------------------------------------------------------------------------------ | 489 //------------------------------------------------------------------------------ |
479 // Simple class that derives from the WaitableEvent class. The event remains | 490 // Simple class that derives from the WaitableEvent class. The event remains |
480 // in the reset state until the initialization complete callback is called from | 491 // in the reset state until the initialization complete callback is called from |
481 // a media pipeline. The normal use of this object looks like: | 492 // a media pipeline. The normal use of this object looks like: |
482 // Pipeline p; | 493 // Pipeline p; |
483 // FilterFactoryCollection f; | 494 // FilterFactoryCollection f; |
484 // f->AddFactory(a); | 495 // f->AddFactory(a); |
485 // f->AddFactory(b); | 496 // f->AddFactory(b); |
486 // ... | 497 // ... |
487 // InitializationHelper h; | 498 // InitializationHelper h; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 | 546 |
536 bool callback_success_status_; | 547 bool callback_success_status_; |
537 bool waiting_for_callback_; | 548 bool waiting_for_callback_; |
538 | 549 |
539 DISALLOW_COPY_AND_ASSIGN(InitializationHelper); | 550 DISALLOW_COPY_AND_ASSIGN(InitializationHelper); |
540 }; | 551 }; |
541 | 552 |
542 } // namespace media | 553 } // namespace media |
543 | 554 |
544 #endif // MEDIA_BASE_MOCK_MEDIA_FILTERS_H_ | 555 #endif // MEDIA_BASE_MOCK_MEDIA_FILTERS_H_ |
OLD | NEW |