diff options
author | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-14 10:51:07 +0000 |
---|---|---|
committer | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-14 10:51:07 +0000 |
commit | e53d3ff360d9b38fd7c9469cfcad1554e989cbc1 (patch) | |
tree | 7f7ecae295cede0c7b278ebefb3fa481f75c62e6 /media | |
parent | a9eb92e5aacf23874b075d2f707150e7d9578cd4 (diff) | |
download | chromium_src-e53d3ff360d9b38fd7c9469cfcad1554e989cbc1.zip chromium_src-e53d3ff360d9b38fd7c9469cfcad1554e989cbc1.tar.gz chromium_src-e53d3ff360d9b38fd7c9469cfcad1554e989cbc1.tar.bz2 |
Revert 167638 - Reimplement FileDataSource using file_util::MemoryMappedFile and convert to using FilePath.
Review URL: https://chromiumcodereview.appspot.com/11360229
TBR=scherkus@chromium.org
Review URL: https://codereview.chromium.org/11361258
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@167644 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r-- | media/base/test_data_util.cc | 4 | ||||
-rw-r--r-- | media/base/test_data_util.h | 5 | ||||
-rw-r--r-- | media/ffmpeg/ffmpeg_regression_tests.cc | 4 | ||||
-rw-r--r-- | media/filters/blocking_url_protocol_unittest.cc | 2 | ||||
-rw-r--r-- | media/filters/ffmpeg_demuxer_unittest.cc | 2 | ||||
-rw-r--r-- | media/filters/file_data_source.cc | 89 | ||||
-rw-r--r-- | media/filters/file_data_source.h | 14 | ||||
-rw-r--r-- | media/filters/file_data_source_unittest.cc | 13 | ||||
-rw-r--r-- | media/filters/pipeline_integration_test.cc | 15 | ||||
-rw-r--r-- | media/filters/pipeline_integration_test_base.cc | 16 | ||||
-rw-r--r-- | media/filters/pipeline_integration_test_base.h | 11 | ||||
-rw-r--r-- | media/tools/player_wtl/movie.cc | 5 | ||||
-rw-r--r-- | media/tools/player_wtl/movie.h | 2 | ||||
-rw-r--r-- | media/tools/player_x11/player_x11.cc | 4 | ||||
-rw-r--r-- | media/tools/seek_tester/seek_tester.cc | 3 |
15 files changed, 111 insertions, 78 deletions
diff --git a/media/base/test_data_util.cc b/media/base/test_data_util.cc index 134655d..4cba4a8 100644 --- a/media/base/test_data_util.cc +++ b/media/base/test_data_util.cc @@ -11,7 +11,7 @@ namespace media { -FilePath GetTestDataFilePath(const std::string& name) { +std::string GetTestDataURL(const std::string& name) { FilePath file_path; CHECK(PathService::Get(base::DIR_SOURCE_ROOT, &file_path)); @@ -19,7 +19,7 @@ FilePath GetTestDataFilePath(const std::string& name) { .Append(FILE_PATH_LITERAL("test")) .Append(FILE_PATH_LITERAL("data")) .AppendASCII(name); - return file_path; + return file_path.MaybeAsASCII(); } scoped_refptr<DecoderBuffer> ReadTestDataFile(const std::string& name) { diff --git a/media/base/test_data_util.h b/media/base/test_data_util.h index 062bbda..81efa80 100644 --- a/media/base/test_data_util.h +++ b/media/base/test_data_util.h @@ -8,7 +8,6 @@ #include <string> #include "base/basictypes.h" -#include "base/file_path.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" @@ -16,8 +15,8 @@ namespace media { class DecoderBuffer; -// Returns a file path for a file in the media/test/data directory. -FilePath GetTestDataFilePath(const std::string& name); +// Returns a URL path for a file in the media/test/data directory. +std::string GetTestDataURL(const std::string& name); // Reads a test file from media/test/data directory and stores it in // a DecoderBuffer. Use DecoderBuffer vs DataBuffer to ensure no matter diff --git a/media/ffmpeg/ffmpeg_regression_tests.cc b/media/ffmpeg/ffmpeg_regression_tests.cc index 0b4dd40..8fce919 100644 --- a/media/ffmpeg/ffmpeg_regression_tests.cc +++ b/media/ffmpeg/ffmpeg_regression_tests.cc @@ -334,7 +334,7 @@ FLAKY_FFMPEG_TEST_CASE(MP4_10, "security/null1.m4a"); TEST_P(FFmpegRegressionTest, BasicPlayback) { if (GetParam().init_status == PIPELINE_OK) { - ASSERT_TRUE(Start(GetTestDataFilePath(GetParam().filename), + ASSERT_TRUE(Start(GetTestDataURL(GetParam().filename), GetParam().init_status, true)); Play(); ASSERT_EQ(WaitUntilEndedOrError(), GetParam().end_status); @@ -349,7 +349,7 @@ TEST_P(FFmpegRegressionTest, BasicPlayback) { Seek(base::TimeDelta::FromMilliseconds(0)); } } else { - ASSERT_FALSE(Start(GetTestDataFilePath(GetParam().filename), + ASSERT_FALSE(Start(GetTestDataURL(GetParam().filename), GetParam().init_status, true)); EXPECT_EQ(GetVideoHash(), GetParam().video_md5); EXPECT_EQ(GetAudioHash(), GetParam().audio_md5); diff --git a/media/filters/blocking_url_protocol_unittest.cc b/media/filters/blocking_url_protocol_unittest.cc index 3b86e72..be33557 100644 --- a/media/filters/blocking_url_protocol_unittest.cc +++ b/media/filters/blocking_url_protocol_unittest.cc @@ -20,7 +20,7 @@ class BlockingUrlProtocolTest : public testing::Test { public: BlockingUrlProtocolTest() { data_source_ = new FileDataSource(); - CHECK(data_source_->Initialize(GetTestDataFilePath("bear-320x240.webm"))); + CHECK(data_source_->Initialize(GetTestDataURL("bear-320x240.webm"))); url_protocol_.reset(new BlockingUrlProtocol(data_source_, base::Bind( &BlockingUrlProtocolTest::OnDataSourceError, base::Unretained(this)))); diff --git a/media/filters/ffmpeg_demuxer_unittest.cc b/media/filters/ffmpeg_demuxer_unittest.cc index fd52beb..26a5017 100644 --- a/media/filters/ffmpeg_demuxer_unittest.cc +++ b/media/filters/ffmpeg_demuxer_unittest.cc @@ -168,7 +168,7 @@ class FFmpegDemuxerTest : public testing::Test { .AppendASCII(name); data_source_ = new FileDataSource(); - EXPECT_TRUE(data_source_->Initialize(file_path)); + EXPECT_TRUE(data_source_->Initialize(file_path.MaybeAsASCII())); } DISALLOW_COPY_AND_ASSIGN(FFmpegDemuxerTest); diff --git a/media/filters/file_data_source.cc b/media/filters/file_data_source.cc index dab5c58..f528ce0 100644 --- a/media/filters/file_data_source.cc +++ b/media/filters/file_data_source.cc @@ -4,24 +4,37 @@ #include "media/filters/file_data_source.h" -#include <algorithm> +#include <limits> +#include "base/file_util.h" #include "base/logging.h" +#include "base/utf_string_conversions.h" namespace media { FileDataSource::FileDataSource() - : force_read_errors_(false), + : file_(NULL), + file_size_(0), + force_read_errors_(false), force_streaming_(false) { } -bool FileDataSource::Initialize(const FilePath& file_path) { - DCHECK(!file_.IsValid()); - - if (!file_.Initialize(file_path)) +bool FileDataSource::Initialize(const std::string& url) { + DCHECK(!file_); +#if defined(OS_WIN) + FilePath file_path(UTF8ToWide(url)); +#else + FilePath file_path(url); +#endif + if (file_util::GetFileSize(file_path, &file_size_)) { + file_ = file_util::OpenFile(file_path, "rb"); + } + if (!file_) { + file_size_ = 0; return false; - + } UpdateHostBytes(); + return true; } @@ -31,32 +44,50 @@ void FileDataSource::set_host(DataSourceHost* host) { } void FileDataSource::Stop(const base::Closure& callback) { - callback.Run(); + base::AutoLock l(lock_); + if (file_) { + file_util::CloseFile(file_); + file_ = NULL; + file_size_ = 0; + } + if (!callback.is_null()) + callback.Run(); } void FileDataSource::Read(int64 position, int size, uint8* data, const DataSource::ReadCB& read_cb) { - if (force_read_errors_ || !file_.IsValid()) { - read_cb.Run(kReadError); - return; + DCHECK(file_); + base::AutoLock l(lock_); + + if (!force_read_errors_ && file_) { +#if defined(OS_WIN) + if (_fseeki64(file_, position, SEEK_SET)) { + read_cb.Run(DataSource::kReadError); + return; + } +#else + CHECK(position <= std::numeric_limits<int32>::max()); + // TODO(hclam): Change fseek() to support 64-bit position. + if (fseek(file_, static_cast<int32>(position), SEEK_SET)) { + read_cb.Run(DataSource::kReadError); + return; + } +#endif + int size_read = fread(data, 1, size, file_); + if (size_read == size || !ferror(file_)) { + read_cb.Run(size_read); + return; + } } - int64 file_size = file_.length(); - - CHECK_GE(file_size, 0); - CHECK_GE(position, 0); - CHECK_GE(size, 0); - - // Cap position and size within bounds. - position = std::min(position, file_size); - int64 clamped_size = std::min(static_cast<int64>(size), file_size - position); - - memcpy(data, file_.data() + position, clamped_size); - read_cb.Run(clamped_size); + read_cb.Run(kReadError); } bool FileDataSource::GetSize(int64* size_out) { - *size_out = file_.length(); + DCHECK(size_out); + DCHECK(file_); + base::AutoLock l(lock_); + *size_out = file_size_; return true; } @@ -66,12 +97,14 @@ bool FileDataSource::IsStreaming() { void FileDataSource::SetBitrate(int bitrate) {} -FileDataSource::~FileDataSource() {} +FileDataSource::~FileDataSource() { + DCHECK(!file_); +} void FileDataSource::UpdateHostBytes() { - if (host() && file_.IsValid()) { - host()->SetTotalBytes(file_.length()); - host()->AddBufferedByteRange(0, file_.length()); + if (host() && file_) { + host()->SetTotalBytes(file_size_); + host()->AddBufferedByteRange(0, file_size_); } } diff --git a/media/filters/file_data_source.h b/media/filters/file_data_source.h index bc46bf7..a2c728d 100644 --- a/media/filters/file_data_source.h +++ b/media/filters/file_data_source.h @@ -7,8 +7,7 @@ #include <string> -#include "base/file_path.h" -#include "base/file_util.h" +#include "base/synchronization/lock.h" #include "media/base/data_source.h" namespace media { @@ -19,7 +18,7 @@ class MEDIA_EXPORT FileDataSource : public DataSource { public: FileDataSource(); - bool Initialize(const FilePath& file_path); + bool Initialize(const std::string& url); // Implementation of DataSource. virtual void set_host(DataSourceHost* host) OVERRIDE; @@ -41,7 +40,14 @@ class MEDIA_EXPORT FileDataSource : public DataSource { // Informs the host of changes in total and buffered bytes. void UpdateHostBytes(); - file_util::MemoryMappedFile file_; + // File handle. NULL if not initialized or an error occurs. + FILE* file_; + + // Size of the file in bytes. + int64 file_size_; + + // Serialize all operations to prevent stopping during reads. + base::Lock lock_; bool force_read_errors_; bool force_streaming_; diff --git a/media/filters/file_data_source_unittest.cc b/media/filters/file_data_source_unittest.cc index ac170a7..b0d7988 100644 --- a/media/filters/file_data_source_unittest.cc +++ b/media/filters/file_data_source_unittest.cc @@ -34,14 +34,18 @@ class ReadCBHandler { // FilePath class are unicode, and the pipeline wants char strings. Convert // the string to UTF8 under Windows. For Mac and Linux, file paths are already // chars so just return the string from the FilePath. -FilePath TestFileURL() { +std::string TestFileURL() { FilePath data_dir; EXPECT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &data_dir)); data_dir = data_dir.Append(FILE_PATH_LITERAL("media")) .Append(FILE_PATH_LITERAL("test")) .Append(FILE_PATH_LITERAL("data")) .Append(FILE_PATH_LITERAL("ten_byte_file")); - return data_dir; +#if defined (OS_WIN) + return WideToUTF8(data_dir.value()); +#else + return data_dir.value(); +#endif } // Test that FileDataSource call the appropriate methods on its filter host. @@ -80,11 +84,6 @@ TEST(FileDataSourceTest, ReadData) { EXPECT_EQ('5', ten_bytes[5]); EXPECT_EQ('9', ten_bytes[9]); - EXPECT_CALL(handler, ReadCB(1)); - filter->Read(9, 1, ten_bytes, base::Bind( - &ReadCBHandler::ReadCB, base::Unretained(&handler))); - EXPECT_EQ('9', ten_bytes[0]); - EXPECT_CALL(handler, ReadCB(0)); filter->Read(10, 10, ten_bytes, base::Bind( &ReadCBHandler::ReadCB, base::Unretained(&handler))); diff --git a/media/filters/pipeline_integration_test.cc b/media/filters/pipeline_integration_test.cc index 2339402e..13e95a5 100644 --- a/media/filters/pipeline_integration_test.cc +++ b/media/filters/pipeline_integration_test.cc @@ -38,7 +38,7 @@ class MockMediaSource { public: MockMediaSource(const std::string& filename, const std::string& mimetype, int initial_append_size) - : file_path_(GetTestDataFilePath(filename)), + : url_(GetTestDataURL(filename)), current_position_(0), initial_append_size_(initial_append_size), mimetype_(mimetype) { @@ -129,7 +129,7 @@ class MockMediaSource { } private: - FilePath file_path_; + std::string url_; scoped_refptr<DecoderBuffer> file_data_; int current_position_; int initial_append_size_; @@ -277,7 +277,7 @@ class PipelineIntegrationTest TEST_F(PipelineIntegrationTest, BasicPlayback) { - ASSERT_TRUE(Start(GetTestDataFilePath("bear-320x240.webm"), PIPELINE_OK)); + ASSERT_TRUE(Start(GetTestDataURL("bear-320x240.webm"), PIPELINE_OK)); Play(); @@ -285,8 +285,7 @@ TEST_F(PipelineIntegrationTest, BasicPlayback) { } TEST_F(PipelineIntegrationTest, BasicPlaybackHashed) { - ASSERT_TRUE(Start(GetTestDataFilePath("bear-320x240.webm"), - PIPELINE_OK, true)); + ASSERT_TRUE(Start(GetTestDataURL("bear-320x240.webm"), PIPELINE_OK, true)); Play(); @@ -365,7 +364,7 @@ TEST_F(PipelineIntegrationTest, MediaSource_ConfigChange_MP4) { #endif TEST_F(PipelineIntegrationTest, BasicPlayback_16x9AspectRatio) { - ASSERT_TRUE(Start(GetTestDataFilePath("bear-320x240-16x9-aspect.webm"), + ASSERT_TRUE(Start(GetTestDataURL("bear-320x240-16x9-aspect.webm"), PIPELINE_OK)); Play(); ASSERT_TRUE(WaitUntilOnEnded()); @@ -388,7 +387,7 @@ TEST_F(PipelineIntegrationTest, EncryptedPlayback) { // TODO(acolwell): Fix flakiness http://crbug.com/117921 TEST_F(PipelineIntegrationTest, DISABLED_SeekWhilePaused) { - ASSERT_TRUE(Start(GetTestDataFilePath("bear-320x240.webm"), PIPELINE_OK)); + ASSERT_TRUE(Start(GetTestDataURL("bear-320x240.webm"), PIPELINE_OK)); base::TimeDelta duration(pipeline_->GetMediaDuration()); base::TimeDelta start_seek_time(duration / 4); @@ -412,7 +411,7 @@ TEST_F(PipelineIntegrationTest, DISABLED_SeekWhilePaused) { // TODO(acolwell): Fix flakiness http://crbug.com/117921 TEST_F(PipelineIntegrationTest, DISABLED_SeekWhilePlaying) { - ASSERT_TRUE(Start(GetTestDataFilePath("bear-320x240.webm"), PIPELINE_OK)); + ASSERT_TRUE(Start(GetTestDataURL("bear-320x240.webm"), PIPELINE_OK)); base::TimeDelta duration(pipeline_->GetMediaDuration()); base::TimeDelta start_seek_time(duration / 4); diff --git a/media/filters/pipeline_integration_test_base.cc b/media/filters/pipeline_integration_test_base.cc index 6dc6a4d..9e3c6a9 100644 --- a/media/filters/pipeline_integration_test_base.cc +++ b/media/filters/pipeline_integration_test_base.cc @@ -87,14 +87,14 @@ void PipelineIntegrationTestBase::OnError(PipelineStatus status) { message_loop_.PostTask(FROM_HERE, MessageLoop::QuitClosure()); } -bool PipelineIntegrationTestBase::Start(const FilePath& file_path, +bool PipelineIntegrationTestBase::Start(const std::string& url, PipelineStatus expected_status) { EXPECT_CALL(*this, OnBufferingState(Pipeline::kHaveMetadata)) .Times(AtMost(1)); EXPECT_CALL(*this, OnBufferingState(Pipeline::kPrerollCompleted)) .Times(AtMost(1)); pipeline_->Start( - CreateFilterCollection(file_path), + CreateFilterCollection(url), base::Bind(&PipelineIntegrationTestBase::OnEnded, base::Unretained(this)), base::Bind(&PipelineIntegrationTestBase::OnError, base::Unretained(this)), QuitOnStatusCB(expected_status), @@ -104,20 +104,20 @@ bool PipelineIntegrationTestBase::Start(const FilePath& file_path, return (pipeline_status_ == PIPELINE_OK); } -bool PipelineIntegrationTestBase::Start(const FilePath& file_path, +bool PipelineIntegrationTestBase::Start(const std::string& url, PipelineStatus expected_status, bool hashing_enabled) { hashing_enabled_ = hashing_enabled; - return Start(file_path, expected_status); + return Start(url, expected_status); } -bool PipelineIntegrationTestBase::Start(const FilePath& file_path) { +bool PipelineIntegrationTestBase::Start(const std::string& url) { EXPECT_CALL(*this, OnBufferingState(Pipeline::kHaveMetadata)) .Times(AtMost(1)); EXPECT_CALL(*this, OnBufferingState(Pipeline::kPrerollCompleted)) .Times(AtMost(1)); pipeline_->Start( - CreateFilterCollection(file_path), + CreateFilterCollection(url), base::Bind(&PipelineIntegrationTestBase::OnEnded, base::Unretained(this)), base::Bind(&PipelineIntegrationTestBase::OnError, base::Unretained(this)), base::Bind(&PipelineIntegrationTestBase::OnStatusCallback, @@ -183,9 +183,9 @@ bool PipelineIntegrationTestBase::WaitUntilCurrentTimeIsAfter( } scoped_ptr<FilterCollection> -PipelineIntegrationTestBase::CreateFilterCollection(const FilePath& file_path) { +PipelineIntegrationTestBase::CreateFilterCollection(const std::string& url) { scoped_refptr<FileDataSource> data_source = new FileDataSource(); - CHECK(data_source->Initialize(file_path)); + CHECK(data_source->Initialize(url)); return CreateFilterCollection( new FFmpegDemuxer(message_loop_.message_loop_proxy(), data_source), NULL); diff --git a/media/filters/pipeline_integration_test_base.h b/media/filters/pipeline_integration_test_base.h index cd77e3a..a301a42 100644 --- a/media/filters/pipeline_integration_test_base.h +++ b/media/filters/pipeline_integration_test_base.h @@ -15,8 +15,6 @@ #include "media/filters/video_renderer_base.h" #include "testing/gmock/include/gmock/gmock.h" -class FilePath; - namespace media { class Decryptor; @@ -40,22 +38,21 @@ class PipelineIntegrationTestBase { bool WaitUntilOnEnded(); PipelineStatus WaitUntilEndedOrError(); - bool Start(const FilePath& file_path, PipelineStatus expected_status); + bool Start(const std::string& url, PipelineStatus expected_status); // Enable playback with audio and video hashing enabled. Frame dropping and // audio underflow will be disabled to ensure consistent hashes. - bool Start(const FilePath& file_path, PipelineStatus expected_status, + bool Start(const std::string& url, PipelineStatus expected_status, bool hashing_enabled); // Initialize the pipeline and ignore any status updates. Useful for testing // invalid audio/video clips which don't have deterministic results. - bool Start(const FilePath& file_path); + bool Start(const std::string& url); void Play(); void Pause(); bool Seek(base::TimeDelta seek_time); void Stop(); bool WaitUntilCurrentTimeIsAfter(const base::TimeDelta& wait_time); - scoped_ptr<FilterCollection> CreateFilterCollection( - const FilePath& file_path); + scoped_ptr<FilterCollection> CreateFilterCollection(const std::string& url); // Returns the MD5 hash of all video frames seen. Should only be called once // after playback completes. First time hashes should be generated with diff --git a/media/tools/player_wtl/movie.cc b/media/tools/player_wtl/movie.cc index 255f2d0..3029da9 100644 --- a/media/tools/player_wtl/movie.cc +++ b/media/tools/player_wtl/movie.cc @@ -53,7 +53,7 @@ void Movie::SetFrameBuffer(HBITMAP hbmp, HWND hwnd) { movie_hwnd_ = hwnd; } -bool Movie::Open(const wchar_t* file_path, VideoRendererBase* video_renderer) { +bool Movie::Open(const wchar_t* url, VideoRendererBase* video_renderer) { // Close previous movie. if (pipeline_) { Close(); @@ -67,8 +67,9 @@ bool Movie::Open(const wchar_t* file_path, VideoRendererBase* video_renderer) { pipeline_ = new Pipeline(pipeline_loop, new media::MediaLog()); // Open the file. + std::string url_utf8 = WideToUTF8(string16(url)); scoped_refptr<FileDataSource> data_source = new FileDataSource(); - if (!data_source->Initialize(FilePath(file_path)) { + if (!data_source->Initialize(url_utf8)) { return false; } diff --git a/media/tools/player_wtl/movie.h b/media/tools/player_wtl/movie.h index 7414407..0e04278 100644 --- a/media/tools/player_wtl/movie.h +++ b/media/tools/player_wtl/movie.h @@ -27,7 +27,7 @@ class Movie { static Movie* GetInstance(); // Open a movie. - bool Open(const wchar_t* file_path, VideoRendererBase* video_renderer); + bool Open(const wchar_t* url, VideoRendererBase* video_renderer); // Set playback rate. void Play(float rate); diff --git a/media/tools/player_x11/player_x11.cc b/media/tools/player_x11/player_x11.cc index 08e6371..b1c814e 100644 --- a/media/tools/player_x11/player_x11.cc +++ b/media/tools/player_x11/player_x11.cc @@ -47,10 +47,10 @@ media::AudioManager* g_audio_manager = NULL; media::VideoRendererBase* g_video_renderer = NULL; scoped_refptr<media::FileDataSource> CreateFileDataSource( - const std::string& file_path) { + const std::string& file) { scoped_refptr<media::FileDataSource> file_data_source( new media::FileDataSource()); - CHECK(file_data_source->Initialize(FilePath(file_path))); + CHECK(file_data_source->Initialize(file)); return file_data_source; } diff --git a/media/tools/seek_tester/seek_tester.cc b/media/tools/seek_tester/seek_tester.cc index 2bed876..69d7b2e 100644 --- a/media/tools/seek_tester/seek_tester.cc +++ b/media/tools/seek_tester/seek_tester.cc @@ -16,7 +16,6 @@ #include "base/at_exit.h" #include "base/bind.h" #include "base/logging.h" -#include "base/file_path.h" #include "base/message_loop.h" #include "base/string_number_conversions.h" #include "media/base/media.h" @@ -62,7 +61,7 @@ int main(int argc, char** argv) { CHECK(base::StringToUint64(argv[2], &seek_target_ms)); scoped_refptr<media::FileDataSource> file_data_source( new media::FileDataSource()); - CHECK(file_data_source->Initialize(FilePath::FromUTF8Unsafe(argv[1]))); + CHECK(file_data_source->Initialize(argv[1])); DemuxerHostImpl host; MessageLoop loop; |