summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/renderer/media/data_source_impl.cc28
-rw-r--r--chrome/renderer/media/data_source_impl.h4
-rw-r--r--media/base/buffers.h2
-rw-r--r--media/base/filters.h2
-rw-r--r--media/base/mock_media_filters.h128
-rw-r--r--media/filters/file_data_source.cc2
-rw-r--r--media/filters/file_data_source.h2
-rw-r--r--media/filters/file_data_source_unittest.cc2
8 files changed, 107 insertions, 63 deletions
diff --git a/chrome/renderer/media/data_source_impl.cc b/chrome/renderer/media/data_source_impl.cc
index 3b8af52..5e97a80 100644
--- a/chrome/renderer/media/data_source_impl.cc
+++ b/chrome/renderer/media/data_source_impl.cc
@@ -45,7 +45,7 @@ void DataSourceImpl::Stop() {
// Post a close file stream task to IO message loop, it will signal the read
// event.
io_loop_->PostTask(
- FROM_HERE,NewRunnableMethod(this, &DataSourceImpl::OnCloseFileStream));
+ FROM_HERE, NewRunnableMethod(this, &DataSourceImpl::OnCloseFileStream));
// Wait for close to finish for FileStream.
close_event_.Wait();
@@ -61,14 +61,14 @@ bool DataSourceImpl::Initialize(const std::string& url) {
// We should get a call back at OnReceivedResponse().
media_format_.SetAsString(media::MediaFormat::kMimeType,
media::mime_type::kApplicationOctetStream);
- media_format_.SetAsString(media::MediaFormat::kURL, url);
+ media_format_.SetAsString(media::MediaFormat::kURL, url);
return true;
}
-size_t DataSourceImpl::Read(char* data, size_t size) {
+size_t DataSourceImpl::Read(uint8* data, size_t size) {
DCHECK(stream_.get());
// Wait until we have downloaded the requested bytes.
- while(!stopped_) {
+ while (!stopped_) {
{
AutoLock auto_lock(lock_);
if (position_ + size <= downloaded_bytes_)
@@ -99,7 +99,7 @@ bool DataSourceImpl::GetPosition(int64* position_out) {
bool DataSourceImpl::SetPosition(int64 position) {
DCHECK(stream_.get());
- while(!stopped_) {
+ while (!stopped_) {
{
AutoLock auto_lock(lock_);
if (position < downloaded_bytes_)
@@ -142,17 +142,19 @@ void DataSourceImpl::OnCreateFileStream(base::PlatformFile file) {
host_->InitializationComplete();
}
-void DataSourceImpl::OnReadFileStream(char* data, size_t size) {
+void DataSourceImpl::OnReadFileStream(uint8* data, size_t size) {
if (!stopped_ && stream_.get()) {
+ // net::FileStream::Read wants a char*, not uint8*.
+ char* c_data = reinterpret_cast<char*>(data);
+ COMPILE_ASSERT(sizeof(*c_data) == sizeof(*data), data_not_sizeof_char);
+
// This method IO operation is asynchronous, it is expected to return
// ERROR_IO_PENDING, when the operation is done, OnDidFileStreamRead() will
- // be called.
- int rv = stream_->Read(data, size, &read_callback_);
-
- // Since the file handle is asynchronous, return value other than
- // ERROR_IO_PENDING is an error.
- if (rv != net::ERR_IO_PENDING) {
- // TODO(hclam): using something like PipelineError::PIPELINE_READ_ERROR.
+ // be called. Since the file handle is asynchronous, return value other
+ // than ERROR_IO_PENDING is an error.
+ if (stream_->Read(c_data, size, &read_callback_) != net::ERR_IO_PENDING) {
+ // TODO(hclam): change to PipelineError::PIPELINE_ERROR_READ once ralphl
+ // gets the new pipeline CL checked in.
host_->Error(media::PIPELINE_ERROR_NETWORK);
}
}
diff --git a/chrome/renderer/media/data_source_impl.h b/chrome/renderer/media/data_source_impl.h
index e62bcd9..95e8090 100644
--- a/chrome/renderer/media/data_source_impl.h
+++ b/chrome/renderer/media/data_source_impl.h
@@ -102,7 +102,7 @@ class DataSourceImpl : public media::DataSource {
// Methods called from demuxer thread ---------------------------------------
// media::DataSource implementation.
- virtual size_t Read(char* data, size_t size);
+ virtual size_t Read(uint8* data, size_t size);
virtual bool GetPosition(int64* position_out);
virtual bool SetPosition(int64 position);
virtual bool GetSize(int64* size_out);
@@ -120,7 +120,7 @@ class DataSourceImpl : public media::DataSource {
// Methods called from IO thread --------------------------------------------
// Handlers for file reading.
void OnCreateFileStream(base::PlatformFile file);
- void OnReadFileStream(char* data, size_t size);
+ void OnReadFileStream(uint8* data, size_t size);
void OnCloseFileStream();
void OnSeekFileStream(net::Whence whence, int64 position);
void OnDidFileStreamRead(int size);
diff --git a/media/base/buffers.h b/media/base/buffers.h
index 9cd8c96..972a124 100644
--- a/media/base/buffers.h
+++ b/media/base/buffers.h
@@ -150,7 +150,7 @@ struct VideoSurface {
size_t strides[kMaxPlanes];
// Array of data pointers to each plane.
- char* data[kMaxPlanes];
+ uint8* data[kMaxPlanes];
};
diff --git a/media/base/filters.h b/media/base/filters.h
index ea4a585..3776c72 100644
--- a/media/base/filters.h
+++ b/media/base/filters.h
@@ -113,7 +113,7 @@ class DataSource : public MediaFilter {
// Read the given amount of bytes into data, returns the number of bytes read
// if successful, kReadError otherwise.
- virtual size_t Read(char* data, size_t size) = 0;
+ virtual size_t Read(uint8* data, size_t size) = 0;
// Returns true and the current file position for this file, false if the
// file position could not be retrieved.
diff --git a/media/base/mock_media_filters.h b/media/base/mock_media_filters.h
index ef89021..ec324ed 100644
--- a/media/base/mock_media_filters.h
+++ b/media/base/mock_media_filters.h
@@ -41,12 +41,14 @@ struct MockFilterConfig {
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 @@ struct MockFilterConfig {
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 @@ class MockDataSource : public DataSource {
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 @@ class MockDataSource : public DataSource {
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 @@ class MockDataSource : public DataSource {
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 @@ class MockDataSource : public DataSource {
}
}
- MockDataSourceBehavior behavior_;
+ const MockFilterConfig* config_;
+ int64 position_;
MediaFormat media_format_;
DISALLOW_COPY_AND_ASSIGN(MockDataSource);
@@ -173,25 +191,33 @@ class MockDemuxer : public Demuxer {
}
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 @@ class MockDemuxer : public Demuxer {
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 @@ class MockDemuxer : public Demuxer {
// 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 MockAudioRenderer : public AudioRenderer {
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 @@ class MockVideoFrame : public VideoFrame {
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 @@ class MockVideoFrame : public VideoFrame {
}
private:
- const MockFilterConfig* config_;
bool surface_locked_;
VideoSurface surface_;
@@ -428,7 +463,14 @@ class MockVideoDecoder : public VideoDecoder {
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);
diff --git a/media/filters/file_data_source.cc b/media/filters/file_data_source.cc
index 95b0ec0..9e8f54b 100644
--- a/media/filters/file_data_source.cc
+++ b/media/filters/file_data_source.cc
@@ -57,7 +57,7 @@ const MediaFormat* FileDataSource::GetMediaFormat() {
return &media_format_;
}
-size_t FileDataSource::Read(char* data, size_t size) {
+size_t FileDataSource::Read(uint8* data, size_t size) {
DCHECK(file_);
AutoLock l(lock_);
if (file_) {
diff --git a/media/filters/file_data_source.h b/media/filters/file_data_source.h
index 9caa435..1c03cf0 100644
--- a/media/filters/file_data_source.h
+++ b/media/filters/file_data_source.h
@@ -30,7 +30,7 @@ class FileDataSource : public DataSource {
// Implementation of DataSource.
virtual bool Initialize(const std::string& url);
virtual const MediaFormat* GetMediaFormat();
- virtual size_t Read(char* data, size_t size);
+ virtual size_t Read(uint8* data, size_t size);
virtual bool GetPosition(int64* position_out);
virtual bool SetPosition(int64 position);
virtual bool GetSize(int64* size_out);
diff --git a/media/filters/file_data_source_unittest.cc b/media/filters/file_data_source_unittest.cc
index 7555cb9..3eb5262 100644
--- a/media/filters/file_data_source_unittest.cc
+++ b/media/filters/file_data_source_unittest.cc
@@ -80,7 +80,7 @@ TEST(FileDataSourceTest, ReadData) {
MediaFormat url_format;
int64 position;
int64 size;
- char ten_bytes[10];
+ uint8 ten_bytes[10];
std::string url = TestFileURL();
url_format.SetAsString(MediaFormat::kMimeType, media::mime_type::kURL);
url_format.SetAsString(MediaFormat::kURL, url);