| Index: media/base/mock_media_filters.h
|
| ===================================================================
|
| --- media/base/mock_media_filters.h (revision 10301)
|
| +++ media/base/mock_media_filters.h (working copy)
|
| @@ -45,7 +45,8 @@
|
| uncompressed_audio_mime_type(mime_type::kUncompressedAudio),
|
| compressed_video_mime_type(mime_type::kH264AnnexB),
|
| uncompressed_video_mime_type(mime_type::kUncompressedVideo),
|
| - frame_duration(base::TimeDelta::FromMicroseconds(33333)) {
|
| + frame_duration(base::TimeDelta::FromMicroseconds(33333)),
|
| + media_duration(base::TimeDelta::FromSeconds(5)) {
|
| }
|
|
|
| MockDataSourceBehavior data_source_behavior;
|
| @@ -58,10 +59,11 @@
|
| std::string compressed_video_mime_type;
|
| std::string uncompressed_video_mime_type;
|
| base::TimeDelta frame_duration;
|
| + base::TimeDelta media_duration;
|
| };
|
|
|
|
|
| -class MockDataSource : public media::DataSource {
|
| +class MockDataSource : public DataSource {
|
| public:
|
| static FilterFactory* CreateFactory(const MockFilterConfig* config) {
|
| return new FilterFactoryImpl1<MockDataSource,
|
| @@ -123,8 +125,8 @@
|
| }
|
|
|
| private:
|
| - friend class media::FilterFactoryImpl1<MockDataSource,
|
| - const MockFilterConfig*>;
|
| + friend class FilterFactoryImpl1<MockDataSource,
|
| + const MockFilterConfig*>;
|
|
|
| explicit MockDataSource(const MockFilterConfig* config)
|
| : behavior_(config->data_source_behavior) {
|
| @@ -165,7 +167,7 @@
|
| virtual void Stop() {}
|
|
|
| // Implementation of Demuxer.
|
| - virtual bool Initialize(media::DataSource* data_source) {
|
| + virtual bool Initialize(DataSource* data_source) {
|
| host_->InitializationComplete();
|
| return true;
|
| }
|
| @@ -177,7 +179,7 @@
|
| return 1;
|
| }
|
|
|
| - virtual media::DemuxerStream* GetStream(int stream_id) {
|
| + virtual DemuxerStream* GetStream(int stream_id) {
|
| switch (stream_id) {
|
| case 0:
|
| return &mock_audio_stream_;
|
| @@ -193,7 +195,7 @@
|
| }
|
|
|
| private:
|
| - friend class media::FilterFactoryImpl1<MockDemuxer, const MockFilterConfig*>;
|
| + friend class FilterFactoryImpl1<MockDemuxer, const MockFilterConfig*>;
|
|
|
| explicit MockDemuxer(const MockFilterConfig* config)
|
| : config_(config),
|
| @@ -214,7 +216,7 @@
|
|
|
| // Implementation of DemuxerStream.
|
| virtual const MediaFormat* GetMediaFormat() {
|
| - return &media_format_; // TODO(ralphl): implement
|
| + return &media_format_;
|
| }
|
|
|
| virtual void Read(Assignable<Buffer>* buffer) {
|
| @@ -266,8 +268,7 @@
|
| }
|
|
|
| private:
|
| - friend class media::FilterFactoryImpl1<MockAudioDecoder,
|
| - const MockFilterConfig*>;
|
| + friend class FilterFactoryImpl1<MockAudioDecoder, const MockFilterConfig*>;
|
|
|
| explicit MockAudioDecoder(const MockFilterConfig* config) {
|
| media_format_.SetAsString(MediaFormat::kMimeType,
|
| @@ -306,8 +307,7 @@
|
| virtual void SetVolume(float volume) {}
|
|
|
| private:
|
| - friend class media::FilterFactoryImpl1<MockAudioRenderer,
|
| - const MockFilterConfig*>;
|
| + friend class FilterFactoryImpl1<MockAudioRenderer, const MockFilterConfig*>;
|
|
|
| explicit MockAudioRenderer(const MockFilterConfig* config) {}
|
|
|
| @@ -323,44 +323,54 @@
|
| explicit MockVideoFrame(const MockFilterConfig* config,
|
| base::TimeDelta timestamp)
|
| : config_(config),
|
| - surface_locked_(false),
|
| - timestamp_(timestamp),
|
| - duration_(config->frame_duration) {
|
| + surface_locked_(false) {
|
| + SetTimestamp(timestamp);
|
| + SetDuration(config->frame_duration);
|
| + size_t y_byte_count = config_->video_width * config_->video_height;
|
| + size_t uv_byte_count = y_byte_count / 4;
|
| + surface_.format = config_->video_surface_format;
|
| + surface_.width = config_->video_width;
|
| + surface_.height = config_->video_height;
|
| + surface_.planes = 3;
|
| + surface_.data[0] = new char[y_byte_count];
|
| + surface_.data[1] = new char[uv_byte_count];
|
| + surface_.data[2] = new char[uv_byte_count];
|
| + surface_.strides[0] = config_->video_width;
|
| + surface_.strides[1] = config_->video_width / 2;
|
| + surface_.strides[2] = config_->video_width / 2;
|
| + memset(surface_.data[0], 0, y_byte_count);
|
| + memset(surface_.data[1], 0x80, uv_byte_count);
|
| + memset(surface_.data[2], 0x80, uv_byte_count);
|
| + int64 num_white_pixels = y_byte_count *
|
| + timestamp.InMicroseconds() /
|
| + config_->media_duration.InMicroseconds();
|
| + if (num_white_pixels > y_byte_count) {
|
| + ADD_FAILURE();
|
| + num_white_pixels = y_byte_count;
|
| + }
|
| + if (num_white_pixels < 0) {
|
| + ADD_FAILURE();
|
| + num_white_pixels = 0;
|
| + }
|
| + memset(surface_.data[0], 0xFF, static_cast<size_t>(num_white_pixels));
|
| }
|
|
|
| - virtual ~MockVideoFrame() {}
|
| -
|
| - virtual base::TimeDelta GetTimestamp() const {
|
| - return timestamp_;
|
| + virtual ~MockVideoFrame() {
|
| + delete[] surface_.data[0];
|
| + delete[] surface_.data[1];
|
| + delete[] surface_.data[2];
|
| }
|
|
|
| - virtual base::TimeDelta GetDuration() const {
|
| - return duration_;
|
| - }
|
| -
|
| - virtual void SetTimestamp(const base::TimeDelta& timestamp) {
|
| - timestamp_ = timestamp;
|
| - }
|
| -
|
| - virtual void SetDuration(const base::TimeDelta& duration) {
|
| - duration_ = duration;
|
| - }
|
| -
|
| virtual bool Lock(VideoSurface* surface) {
|
| EXPECT_FALSE(surface_locked_);
|
| + if (surface_locked_) {
|
| + memset(surface, 0, sizeof(*surface));
|
| + return false;
|
| + }
|
| surface_locked_ = true;
|
| - surface->format = config_->video_surface_format;
|
| - surface->width = config_->video_width;
|
| - surface->height = config_->video_height;
|
| - // TODO(ralphl): mock the data for video surfaces too.
|
| - surface->planes = 3;
|
| - surface->data[0] = NULL;
|
| - surface->data[1] = NULL;
|
| - surface->data[2] = NULL;
|
| - surface->strides[0] = 0;
|
| - surface->strides[1] = 0;
|
| - surface->strides[2] = 0;
|
| - return false;
|
| + DCHECK(sizeof(*surface) == sizeof(surface_));
|
| + memcpy(surface, &surface_, sizeof(*surface));
|
| + return true;
|
| }
|
|
|
| virtual void Unlock() {
|
| @@ -371,8 +381,7 @@
|
| private:
|
| const MockFilterConfig* config_;
|
| bool surface_locked_;
|
| - base::TimeDelta timestamp_;
|
| - base::TimeDelta duration_;
|
| + VideoSurface surface_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(MockVideoFrame);
|
| };
|
| @@ -407,8 +416,7 @@
|
| }
|
|
|
| private:
|
| - friend class media::FilterFactoryImpl1<MockVideoDecoder,
|
| - const MockFilterConfig*>;
|
| + friend class FilterFactoryImpl1<MockVideoDecoder, const MockFilterConfig*>;
|
|
|
| explicit MockVideoDecoder(const MockFilterConfig* config)
|
| : config_(config) {
|
| @@ -419,10 +427,15 @@
|
| }
|
|
|
| void DoRead(Assignable<VideoFrame>* buffer) {
|
| - VideoFrame* frame = new MockVideoFrame(config_, mock_frame_time_);
|
| - mock_frame_time_ += config_->frame_duration;
|
| - buffer->SetBuffer(frame);
|
| - buffer->OnAssignment();
|
| + if (mock_frame_time_ < config_->media_duration) {
|
| + VideoFrame* frame = new MockVideoFrame(config_, mock_frame_time_);
|
| + mock_frame_time_ += config_->frame_duration;
|
| + if (mock_frame_time_ >= config_->media_duration) {
|
| + frame->SetEndOfStream(true);
|
| + }
|
| + buffer->SetBuffer(frame);
|
| + buffer->OnAssignment();
|
| + }
|
| buffer->Release();
|
| }
|
|
|
| @@ -459,8 +472,7 @@
|
| }
|
|
|
| private:
|
| - friend class media::FilterFactoryImpl1<MockVideoRenderer,
|
| - const MockFilterConfig*>;
|
| + friend class FilterFactoryImpl1<MockVideoRenderer, const MockFilterConfig*>;
|
|
|
| explicit MockVideoRenderer(const MockFilterConfig* config)
|
| : config_(config) {
|
| @@ -474,7 +486,6 @@
|
| };
|
|
|
|
|
| -
|
| //------------------------------------------------------------------------------
|
| // Simple class that derives from the WaitableEvent class. The event remains
|
| // in the reset state until the initialization complete callback is called from
|
|
|