summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-14 17:31:23 +0000
committerscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-14 17:31:23 +0000
commitda978a8dbce277274eaeff4cfa5878d11b17b591 (patch)
treecebecd3e8da40421fe4709e438301f512df39ad9 /media
parentcbcdbdf3aa4e1c694880003114239fbfd73572ab (diff)
downloadchromium_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.cc4
-rw-r--r--media/base/test_data_util.h5
-rw-r--r--media/ffmpeg/ffmpeg_regression_tests.cc6
-rw-r--r--media/filters/blocking_url_protocol_unittest.cc2
-rw-r--r--media/filters/ffmpeg_demuxer_unittest.cc2
-rw-r--r--media/filters/file_data_source.cc89
-rw-r--r--media/filters/file_data_source.h14
-rw-r--r--media/filters/file_data_source_unittest.cc13
-rw-r--r--media/filters/pipeline_integration_test.cc15
-rw-r--r--media/filters/pipeline_integration_test_base.cc16
-rw-r--r--media/filters/pipeline_integration_test_base.h11
-rw-r--r--media/tools/player_wtl/movie.cc5
-rw-r--r--media/tools/player_wtl/movie.h2
-rw-r--r--media/tools/player_x11/player_x11.cc4
-rw-r--r--media/tools/seek_tester/seek_tester.cc3
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;