Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(26)

Side by Side Diff: media/base/mock_media_filters.h

Issue 27120: Added IsEndOfStream and IsDiscontiguous flags to buffers. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/base/data_buffer_unittest.cc ('k') | media/filters/test_video_renderer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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_
OLDNEW
« no previous file with comments | « media/base/data_buffer_unittest.cc ('k') | media/filters/test_video_renderer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698