summaryrefslogtreecommitdiffstats
path: root/media/base
diff options
context:
space:
mode:
Diffstat (limited to 'media/base')
-rw-r--r--media/base/mock_filters.h12
-rw-r--r--media/base/pipeline_impl.cc17
-rw-r--r--media/base/pipeline_impl_unittest.cc37
3 files changed, 64 insertions, 2 deletions
diff --git a/media/base/mock_filters.h b/media/base/mock_filters.h
index d3546c4..533ced7 100644
--- a/media/base/mock_filters.h
+++ b/media/base/mock_filters.h
@@ -342,6 +342,18 @@ ACTION_P2(SetDuration, filter, duration) {
filter->host()->SetDuration(duration);
}
+// Helper gmock action that calls SetTotalBytes() on behalf of the provided
+// filter.
+ACTION_P2(SetTotalBytes, filter, bytes) {
+ filter->host()->SetTotalBytes(bytes);
+}
+
+// Helper gmock action that calls SetBufferedBytes() on behalf of the provided
+// filter.
+ACTION_P2(SetBufferedBytes, filter, bytes) {
+ filter->host()->SetBufferedBytes(bytes);
+}
+
} // namespace media
#endif // MEDIA_BASE_MOCK_FILTERS_H_
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc
index 05ee62e..cc1c3b2 100644
--- a/media/base/pipeline_impl.cc
+++ b/media/base/pipeline_impl.cc
@@ -211,7 +211,22 @@ base::TimeDelta PipelineImpl::GetCurrentTime() const {
base::TimeDelta PipelineImpl::GetBufferedTime() const {
AutoLock auto_lock(lock_);
- return buffered_time_;
+
+ // If buffered time was set, we report that value directly.
+ if (buffered_time_.ToInternalValue() > 0)
+ return buffered_time_;
+
+ // If buffered time was not set, we use duration and buffered bytes to
+ // estimate the buffered time.
+ // TODO(hclam): The estimation is based on linear interpolation which is
+ // not accurate enough. We should find a better way to estimate the value.
+ if (total_bytes_ == 0)
+ return base::TimeDelta();
+
+ double ratio = static_cast<double>(buffered_bytes_);
+ ratio /= total_bytes_;
+ return base::TimeDelta::FromMilliseconds(
+ static_cast<int64>(duration_.InMilliseconds() * ratio));
}
base::TimeDelta PipelineImpl::GetDuration() const {
diff --git a/media/base/pipeline_impl_unittest.cc b/media/base/pipeline_impl_unittest.cc
index 068b095..6400049 100644
--- a/media/base/pipeline_impl_unittest.cc
+++ b/media/base/pipeline_impl_unittest.cc
@@ -20,6 +20,16 @@ using ::testing::NotNull;
using ::testing::Return;
using ::testing::StrictMock;
+namespace {
+
+// Total bytes of the data source.
+const int kTotalBytes = 1024;
+
+// Buffered bytes of the data source.
+const int kBufferedBytes = 1024;
+
+} // namespace
+
namespace media {
// Used for setting expectations on pipeline callbacks. Using a StrictMock
@@ -70,7 +80,9 @@ class PipelineImplTest : public ::testing::Test {
// Sets up expectations to allow the data source to initialize.
void InitializeDataSource() {
EXPECT_CALL(*mocks_->data_source(), Initialize("", NotNull()))
- .WillOnce(Invoke(&RunFilterCallback));
+ .WillOnce(DoAll(SetTotalBytes(mocks_->data_source(), kTotalBytes),
+ SetBufferedBytes(mocks_->data_source(), kBufferedBytes),
+ Invoke(&RunFilterCallback)));
EXPECT_CALL(*mocks_->data_source(), SetPlaybackRate(0.0f));
EXPECT_CALL(*mocks_->data_source(), Seek(base::TimeDelta(), NotNull()))
.WillOnce(Invoke(&RunFilterCallback));
@@ -404,4 +416,27 @@ TEST_F(PipelineImplTest, SetVolume) {
pipeline_->SetVolume(expected);
}
+TEST_F(PipelineImplTest, Properties) {
+ scoped_refptr<StrictMock<MockDemuxerStream> > stream =
+ new StrictMock<MockDemuxerStream>("video/x-foo");
+ MockDemuxerStreamVector streams;
+ streams.push_back(stream);
+
+ InitializeDataSource();
+ base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100);
+ InitializeDemuxer(&streams, kDuration);
+ InitializeVideoDecoder(stream);
+ InitializeVideoRenderer();
+
+ InitializePipeline();
+ EXPECT_TRUE(pipeline_->IsInitialized());
+ EXPECT_EQ(PIPELINE_OK, pipeline_->GetError());
+ EXPECT_EQ(kDuration.ToInternalValue(),
+ pipeline_->GetDuration().ToInternalValue());
+ EXPECT_EQ(kTotalBytes, pipeline_->GetTotalBytes());
+ EXPECT_EQ(kBufferedBytes, pipeline_->GetBufferedBytes());
+ EXPECT_EQ(kDuration.ToInternalValue(),
+ pipeline_->GetBufferedTime().ToInternalValue());
+}
+
} // namespace media