diff options
author | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-14 17:31:23 +0000 |
---|---|---|
committer | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-14 17:31:23 +0000 |
commit | da978a8dbce277274eaeff4cfa5878d11b17b591 (patch) | |
tree | cebecd3e8da40421fe4709e438301f512df39ad9 /media | |
parent | cbcdbdf3aa4e1c694880003114239fbfd73572ab (diff) | |
download | chromium_src-da978a8dbce277274eaeff4cfa5878d11b17b591.zip chromium_src-da978a8dbce277274eaeff4cfa5878d11b17b591.tar.gz chromium_src-da978a8dbce277274eaeff4cfa5878d11b17b591.tar.bz2 |
Reimplement FileDataSource using file_util::MemoryMappedFile and convert to using FilePath.
This time without breaking the build!
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@167691 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 | 6 | ||||
-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, 79 insertions, 112 deletions
diff --git a/media/base/test_data_util.cc b/media/base/test_data_util.cc index 4cba4a8..134655d 100644 --- a/media/base/test_data_util.cc +++ b/media/base/test_data_util.cc @@ -11,7 +11,7 @@ namespace media { -std::string GetTestDataURL(const std::string& name) { +FilePath GetTestDataFilePath(const std::string& name) { FilePath file_path; CHECK(PathService::Get(base::DIR_SOURCE_ROOT, &file_path)); @@ -19,7 +19,7 @@ std::string GetTestDataURL(const std::string& name) { .Append(FILE_PATH_LITERAL("test")) .Append(FILE_PATH_LITERAL("data")) .AppendASCII(name); - return file_path.MaybeAsASCII(); + return file_path; } 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 81efa80..062bbda 100644 --- a/media/base/test_data_util.h +++ b/media/base/test_data_util.h @@ -8,6 +8,7 @@ #include <string> #include "base/basictypes.h" +#include "base/file_path.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" @@ -15,8 +16,8 @@ namespace media { class DecoderBuffer; -// Returns a URL path for a file in the media/test/data directory. -std::string GetTestDataURL(const std::string& name); +// Returns a file path for a file in the media/test/data directory. +FilePath GetTestDataFilePath(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 8fce919..9f0873a 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(GetTestDataURL(GetParam().filename), + ASSERT_TRUE(Start(GetTestDataFilePath(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(GetTestDataURL(GetParam().filename), + ASSERT_FALSE(Start(GetTestDataFilePath(GetParam().filename), GetParam().init_status, true)); EXPECT_EQ(GetVideoHash(), GetParam().video_md5); EXPECT_EQ(GetAudioHash(), GetParam().audio_md5); @@ -357,7 +357,7 @@ TEST_P(FFmpegRegressionTest, BasicPlayback) { } TEST_P(FlakyFFmpegRegressionTest, BasicPlayback) { - if (Start(GetTestDataURL(GetParam().filename))) { + if (Start(GetTestDataFilePath(GetParam().filename))) { Play(); WaitUntilEndedOrError(); } diff --git a/media/filters/blocking_url_protocol_unittest.cc b/media/filters/blocking_url_protocol_unittest.cc index be33557..3b86e72 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(GetTestDataURL("bear-320x240.webm"))); + CHECK(data_source_->Initialize(GetTestDataFilePath("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 26a5017..fd52beb 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.MaybeAsASCII())); + EXPECT_TRUE(data_source_->Initialize(file_path)); } DISALLOW_COPY_AND_ASSIGN(FFmpegDemuxerTest); diff --git a/media/filters/file_data_source.cc b/media/filters/file_data_source.cc index f528ce0..dab5c58 100644 --- a/media/filters/file_data_source.cc +++ b/media/filters/file_data_source.cc @@ -4,37 +4,24 @@ #include "media/filters/file_data_source.h" -#include <limits> +#include <algorithm> -#include "base/file_util.h" #include "base/logging.h" -#include "base/utf_string_conversions.h" namespace media { FileDataSource::FileDataSource() - : file_(NULL), - file_size_(0), - force_read_errors_(false), + : force_read_errors_(false), force_streaming_(false) { } -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; +bool FileDataSource::Initialize(const FilePath& file_path) { + DCHECK(!file_.IsValid()); + + if (!file_.Initialize(file_path)) return false; - } - UpdateHostBytes(); + UpdateHostBytes(); return true; } @@ -44,50 +31,32 @@ void FileDataSource::set_host(DataSourceHost* host) { } void FileDataSource::Stop(const base::Closure& callback) { - base::AutoLock l(lock_); - if (file_) { - file_util::CloseFile(file_); - file_ = NULL; - file_size_ = 0; - } - if (!callback.is_null()) - callback.Run(); + callback.Run(); } void FileDataSource::Read(int64 position, int size, uint8* data, const DataSource::ReadCB& read_cb) { - 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; - } + if (force_read_errors_ || !file_.IsValid()) { + read_cb.Run(kReadError); + return; } - read_cb.Run(kReadError); + 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); } bool FileDataSource::GetSize(int64* size_out) { - DCHECK(size_out); - DCHECK(file_); - base::AutoLock l(lock_); - *size_out = file_size_; + *size_out = file_.length(); return true; } @@ -97,14 +66,12 @@ bool FileDataSource::IsStreaming() { void FileDataSource::SetBitrate(int bitrate) {} -FileDataSource::~FileDataSource() { - DCHECK(!file_); -} +FileDataSource::~FileDataSource() {} void FileDataSource::UpdateHostBytes() { - if (host() && file_) { - host()->SetTotalBytes(file_size_); - host()->AddBufferedByteRange(0, file_size_); + if (host() && file_.IsValid()) { + host()->SetTotalBytes(file_.length()); + host()->AddBufferedByteRange(0, file_.length()); } } diff --git a/media/filters/file_data_source.h b/media/filters/file_data_source.h index a2c728d..bc46bf7 100644 --- a/media/filters/file_data_source.h +++ b/media/filters/file_data_source.h @@ -7,7 +7,8 @@ #include <string> -#include "base/synchronization/lock.h" +#include "base/file_path.h" +#include "base/file_util.h" #include "media/base/data_source.h" namespace media { @@ -18,7 +19,7 @@ class MEDIA_EXPORT FileDataSource : public DataSource { public: FileDataSource(); - bool Initialize(const std::string& url); + bool Initialize(const FilePath& file_path); // Implementation of DataSource. virtual void set_host(DataSourceHost* host) OVERRIDE; @@ -40,14 +41,7 @@ class MEDIA_EXPORT FileDataSource : public DataSource { // Informs the host of changes in total and buffered bytes. void UpdateHostBytes(); - // 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_; + file_util::MemoryMappedFile file_; 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 b0d7988..ac170a7 100644 --- a/media/filters/file_data_source_unittest.cc +++ b/media/filters/file_data_source_unittest.cc @@ -34,18 +34,14 @@ 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. -std::string TestFileURL() { +FilePath 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")); -#if defined (OS_WIN) - return WideToUTF8(data_dir.value()); -#else - return data_dir.value(); -#endif + return data_dir; } // Test that FileDataSource call the appropriate methods on its filter host. @@ -84,6 +80,11 @@ 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 13e95a5..2339402e 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) - : url_(GetTestDataURL(filename)), + : file_path_(GetTestDataFilePath(filename)), current_position_(0), initial_append_size_(initial_append_size), mimetype_(mimetype) { @@ -129,7 +129,7 @@ class MockMediaSource { } private: - std::string url_; + FilePath file_path_; 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(GetTestDataURL("bear-320x240.webm"), PIPELINE_OK)); + ASSERT_TRUE(Start(GetTestDataFilePath("bear-320x240.webm"), PIPELINE_OK)); Play(); @@ -285,7 +285,8 @@ TEST_F(PipelineIntegrationTest, BasicPlayback) { } TEST_F(PipelineIntegrationTest, BasicPlaybackHashed) { - ASSERT_TRUE(Start(GetTestDataURL("bear-320x240.webm"), PIPELINE_OK, true)); + ASSERT_TRUE(Start(GetTestDataFilePath("bear-320x240.webm"), + PIPELINE_OK, true)); Play(); @@ -364,7 +365,7 @@ TEST_F(PipelineIntegrationTest, MediaSource_ConfigChange_MP4) { #endif TEST_F(PipelineIntegrationTest, BasicPlayback_16x9AspectRatio) { - ASSERT_TRUE(Start(GetTestDataURL("bear-320x240-16x9-aspect.webm"), + ASSERT_TRUE(Start(GetTestDataFilePath("bear-320x240-16x9-aspect.webm"), PIPELINE_OK)); Play(); ASSERT_TRUE(WaitUntilOnEnded()); @@ -387,7 +388,7 @@ TEST_F(PipelineIntegrationTest, EncryptedPlayback) { // TODO(acolwell): Fix flakiness http://crbug.com/117921 TEST_F(PipelineIntegrationTest, DISABLED_SeekWhilePaused) { - ASSERT_TRUE(Start(GetTestDataURL("bear-320x240.webm"), PIPELINE_OK)); + ASSERT_TRUE(Start(GetTestDataFilePath("bear-320x240.webm"), PIPELINE_OK)); base::TimeDelta duration(pipeline_->GetMediaDuration()); base::TimeDelta start_seek_time(duration / 4); @@ -411,7 +412,7 @@ TEST_F(PipelineIntegrationTest, DISABLED_SeekWhilePaused) { // TODO(acolwell): Fix flakiness http://crbug.com/117921 TEST_F(PipelineIntegrationTest, DISABLED_SeekWhilePlaying) { - ASSERT_TRUE(Start(GetTestDataURL("bear-320x240.webm"), PIPELINE_OK)); + ASSERT_TRUE(Start(GetTestDataFilePath("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 9e3c6a9..6dc6a4d 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 std::string& url, +bool PipelineIntegrationTestBase::Start(const FilePath& file_path, PipelineStatus expected_status) { EXPECT_CALL(*this, OnBufferingState(Pipeline::kHaveMetadata)) .Times(AtMost(1)); EXPECT_CALL(*this, OnBufferingState(Pipeline::kPrerollCompleted)) .Times(AtMost(1)); pipeline_->Start( - CreateFilterCollection(url), + CreateFilterCollection(file_path), 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 std::string& url, return (pipeline_status_ == PIPELINE_OK); } -bool PipelineIntegrationTestBase::Start(const std::string& url, +bool PipelineIntegrationTestBase::Start(const FilePath& file_path, PipelineStatus expected_status, bool hashing_enabled) { hashing_enabled_ = hashing_enabled; - return Start(url, expected_status); + return Start(file_path, expected_status); } -bool PipelineIntegrationTestBase::Start(const std::string& url) { +bool PipelineIntegrationTestBase::Start(const FilePath& file_path) { EXPECT_CALL(*this, OnBufferingState(Pipeline::kHaveMetadata)) .Times(AtMost(1)); EXPECT_CALL(*this, OnBufferingState(Pipeline::kPrerollCompleted)) .Times(AtMost(1)); pipeline_->Start( - CreateFilterCollection(url), + CreateFilterCollection(file_path), 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 std::string& url) { +PipelineIntegrationTestBase::CreateFilterCollection(const FilePath& file_path) { scoped_refptr<FileDataSource> data_source = new FileDataSource(); - CHECK(data_source->Initialize(url)); + CHECK(data_source->Initialize(file_path)); 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 a301a42..cd77e3a 100644 --- a/media/filters/pipeline_integration_test_base.h +++ b/media/filters/pipeline_integration_test_base.h @@ -15,6 +15,8 @@ #include "media/filters/video_renderer_base.h" #include "testing/gmock/include/gmock/gmock.h" +class FilePath; + namespace media { class Decryptor; @@ -38,21 +40,22 @@ class PipelineIntegrationTestBase { bool WaitUntilOnEnded(); PipelineStatus WaitUntilEndedOrError(); - bool Start(const std::string& url, PipelineStatus expected_status); + bool Start(const FilePath& file_path, 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 std::string& url, PipelineStatus expected_status, + bool Start(const FilePath& file_path, 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 std::string& url); + bool Start(const FilePath& file_path); void Play(); void Pause(); bool Seek(base::TimeDelta seek_time); void Stop(); bool WaitUntilCurrentTimeIsAfter(const base::TimeDelta& wait_time); - scoped_ptr<FilterCollection> CreateFilterCollection(const std::string& url); + scoped_ptr<FilterCollection> CreateFilterCollection( + const FilePath& file_path); // 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 3029da9..255f2d0 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* url, VideoRendererBase* video_renderer) { +bool Movie::Open(const wchar_t* file_path, VideoRendererBase* video_renderer) { // Close previous movie. if (pipeline_) { Close(); @@ -67,9 +67,8 @@ bool Movie::Open(const wchar_t* url, 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(url_utf8)) { + if (!data_source->Initialize(FilePath(file_path)) { return false; } diff --git a/media/tools/player_wtl/movie.h b/media/tools/player_wtl/movie.h index 0e04278..7414407 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* url, VideoRendererBase* video_renderer); + bool Open(const wchar_t* file_path, 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 b1c814e..08e6371 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) { + const std::string& file_path) { scoped_refptr<media::FileDataSource> file_data_source( new media::FileDataSource()); - CHECK(file_data_source->Initialize(file)); + CHECK(file_data_source->Initialize(FilePath(file_path))); return file_data_source; } diff --git a/media/tools/seek_tester/seek_tester.cc b/media/tools/seek_tester/seek_tester.cc index 69d7b2e..2bed876 100644 --- a/media/tools/seek_tester/seek_tester.cc +++ b/media/tools/seek_tester/seek_tester.cc @@ -16,6 +16,7 @@ #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" @@ -61,7 +62,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(argv[1])); + CHECK(file_data_source->Initialize(FilePath::FromUTF8Unsafe(argv[1]))); DemuxerHostImpl host; MessageLoop loop; |