Index: media/base/mock_media_filters.h |
=================================================================== |
--- media/base/mock_media_filters.h (revision 10837) |
+++ media/base/mock_media_filters.h (working copy) |
@@ -41,12 +41,14 @@ |
video_width(1280u), |
video_height(720u), |
video_surface_format(VideoSurface::YV12), |
+ has_audio(true), |
compressed_audio_mime_type(mime_type::kAACAudio), |
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)), |
- media_duration(base::TimeDelta::FromSeconds(5)) { |
+ media_duration(base::TimeDelta::FromSeconds(5)), |
+ media_total_bytes(media_duration.InMilliseconds() * 250) { |
} |
MockDataSourceBehavior data_source_behavior; |
@@ -54,12 +56,14 @@ |
size_t video_width; |
size_t video_height; |
VideoSurface::Format video_surface_format; |
+ bool has_audio; |
std::string compressed_audio_mime_type; |
std::string uncompressed_audio_mime_type; |
std::string compressed_video_mime_type; |
std::string uncompressed_video_mime_type; |
base::TimeDelta frame_duration; |
base::TimeDelta media_duration; |
+ int64 media_total_bytes; |
}; |
@@ -78,7 +82,8 @@ |
media_format_.SetAsString(MediaFormat::kMimeType, |
mime_type::kApplicationOctetStream); |
media_format_.SetAsString(MediaFormat::kURL, url); |
- switch (behavior_) { |
+ host_->SetTotalBytes(config_->media_total_bytes); |
+ switch (config_->data_source_behavior) { |
case MOCK_DATA_SOURCE_NORMAL_INIT: |
host_->InitializationComplete(); |
return true; |
@@ -106,21 +111,32 @@ |
return &media_format_; |
} |
- virtual size_t Read(char* data, size_t size) { |
- return 0; |
+ virtual size_t Read(uint8* data, size_t size) { |
+ size_t read = static_cast<size_t>(config_->media_total_bytes - position_); |
+ if (size < read) { |
+ read = size; |
+ } |
+ memset(data, 0, read); |
+ return read; |
} |
virtual bool GetPosition(int64* position_out) { |
- *position_out = 0; |
- return false; |
+ *position_out = position_; |
+ return true; |
} |
virtual bool SetPosition(int64 position) { |
+ EXPECT_GE(position, 0u); |
+ EXPECT_LE(position, config_->media_total_bytes); |
+ if (position < 0u || position > config_->media_total_bytes) { |
+ return false; |
+ } |
+ position_ = position; |
return true; |
} |
virtual bool GetSize(int64* size_out) { |
- *size_out = 0; |
+ *size_out = config_->media_total_bytes; |
return false; |
} |
@@ -129,13 +145,14 @@ |
const MockFilterConfig*>; |
explicit MockDataSource(const MockFilterConfig* config) |
- : behavior_(config->data_source_behavior) { |
+ : config_(config), |
+ position_(0) { |
} |
virtual ~MockDataSource() {} |
void TaskBehavior() { |
- switch (behavior_) { |
+ switch (config_->data_source_behavior) { |
case MOCK_DATA_SOURCE_TASK_ERROR_POST_INIT: |
case MOCK_DATA_SOURCE_TASK_ERROR_PRE_INIT: |
host_->Error(PIPELINE_ERROR_NETWORK); |
@@ -148,7 +165,8 @@ |
} |
} |
- MockDataSourceBehavior behavior_; |
+ const MockFilterConfig* config_; |
+ int64 position_; |
MediaFormat media_format_; |
DISALLOW_COPY_AND_ASSIGN(MockDataSource); |
@@ -173,25 +191,33 @@ |
} |
virtual size_t GetNumberOfStreams() { |
+ size_t num_streams = 0; |
+ if (config_->has_audio) { |
+ ++num_streams; |
+ } |
if (config_->has_video) { |
- return 2; |
+ ++num_streams; |
} |
- return 1; |
+ return num_streams; |
} |
virtual DemuxerStream* GetStream(int stream_id) { |
switch (stream_id) { |
case 0: |
- return &mock_audio_stream_; |
+ if (config_->has_audio) { |
+ return &mock_audio_stream_; |
+ } else if (config_->has_video) { |
+ return &mock_video_stream_; |
+ } |
+ break; |
case 1: |
- if (config_->has_video) { |
+ if (config_->has_audio && config_->has_video) { |
return &mock_video_stream_; |
} |
- // Fall-through is correct if no video. |
- default: |
- ADD_FAILURE(); |
- return NULL; |
+ break; |
} |
+ ADD_FAILURE(); |
+ return NULL; |
} |
private: |
@@ -199,8 +225,8 @@ |
explicit MockDemuxer(const MockFilterConfig* config) |
: config_(config), |
- mock_audio_stream_(config->compressed_audio_mime_type), |
- mock_video_stream_(config->compressed_video_mime_type) { |
+ mock_audio_stream_(config, true), |
+ mock_video_stream_(config, false) { |
} |
virtual ~MockDemuxer() {} |
@@ -208,8 +234,16 @@ |
// Internal class implements DemuxerStream interface. |
class MockDemuxerStream : public DemuxerStream { |
public: |
- explicit MockDemuxerStream(const std::string& mime_type) { |
- media_format_.SetAsString(MediaFormat::kMimeType, mime_type); |
+ MockDemuxerStream(const MockFilterConfig* config, bool is_audio) { |
+ if (is_audio) { |
+ media_format_.SetAsString(MediaFormat::kMimeType, |
+ config->compressed_audio_mime_type); |
+ } else { |
+ media_format_.SetAsString(MediaFormat::kMimeType, |
+ config->compressed_video_mime_type); |
+ media_format_.SetAsInteger(MediaFormat::kWidth, config->video_width); |
+ media_format_.SetAsInteger(MediaFormat::kHeight, config->video_height); |
+ } |
} |
virtual ~MockDemuxerStream() {} |
@@ -320,30 +354,32 @@ |
class MockVideoFrame : public VideoFrame { |
public: |
- explicit MockVideoFrame(const MockFilterConfig* config, |
- base::TimeDelta timestamp) |
- : config_(config), |
- surface_locked_(false) { |
+ MockVideoFrame(size_t video_width, |
+ size_t video_height, |
+ VideoSurface::Format video_surface_format, |
+ base::TimeDelta timestamp, |
+ base::TimeDelta duration, |
+ double ratio_white_to_black) { |
+ surface_locked_ = false; |
SetTimestamp(timestamp); |
- SetDuration(config->frame_duration); |
- size_t y_byte_count = config_->video_width * config_->video_height; |
+ SetDuration(duration); |
+ size_t y_byte_count = video_width * 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_.format = video_surface_format; |
+ surface_.width = video_width; |
+ surface_.height = 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; |
+ surface_.data[0] = new uint8[y_byte_count]; |
+ surface_.data[1] = new uint8[uv_byte_count]; |
+ surface_.data[2] = new uint8[uv_byte_count]; |
+ surface_.strides[0] = video_width; |
+ surface_.strides[1] = video_width / 2; |
+ surface_.strides[2] = 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(); |
+ int64 num_white_pixels = static_cast<int64>(y_byte_count * |
+ ratio_white_to_black); |
if (num_white_pixels > y_byte_count) { |
ADD_FAILURE(); |
num_white_pixels = y_byte_count; |
@@ -368,7 +404,7 @@ |
return false; |
} |
surface_locked_ = true; |
- DCHECK(sizeof(*surface) == sizeof(surface_)); |
+ COMPILE_ASSERT(sizeof(*surface) == sizeof(surface_), surface_size_mismatch); |
memcpy(surface, &surface_, sizeof(*surface)); |
return true; |
} |
@@ -379,7 +415,6 @@ |
} |
private: |
- const MockFilterConfig* config_; |
bool surface_locked_; |
VideoSurface surface_; |
@@ -428,7 +463,14 @@ |
void DoRead(Assignable<VideoFrame>* buffer) { |
if (mock_frame_time_ < config_->media_duration) { |
- VideoFrame* frame = new MockVideoFrame(config_, mock_frame_time_); |
+ VideoFrame* frame = new MockVideoFrame( |
+ config_->video_width, |
+ config_->video_height, |
+ config_->video_surface_format, |
+ mock_frame_time_, |
+ config_->frame_duration, |
+ (mock_frame_time_.InSecondsF() / |
+ config_->media_duration.InSecondsF())); |
mock_frame_time_ += config_->frame_duration; |
if (mock_frame_time_ >= config_->media_duration) { |
frame->SetEndOfStream(true); |