#include "media/base/decoder_buffer_queue.h"
#include "base/memory/scoped_refptr.h"
#include "media/base/decoder_buffer.h"
#include "media/base/timestamp_constants.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace media {
static base::TimeDelta ToTimeDelta(int seconds) {
if (seconds < 0)
return kNoTimestamp;
return base::Seconds(seconds);
}
static scoped_refptr<DecoderBuffer> CreateBuffer(int timestamp) {
auto buffer = base::MakeRefCounted<DecoderBuffer>(0);
buffer->set_timestamp(ToTimeDelta(timestamp));
buffer->set_duration(ToTimeDelta(0));
return buffer;
}
static scoped_refptr<DecoderBuffer> CreateBuffer(int timestamp, int size) {
auto buffer = base::MakeRefCounted<DecoderBuffer>(size);
buffer->set_timestamp(ToTimeDelta(timestamp));
buffer->set_duration(ToTimeDelta(0));
return buffer;
}
static size_t GetExpectedMemoryUsage(int number_of_buffers, int data_size) {
return number_of_buffers * sizeof(DecoderBuffer) + data_size;
}
TEST(DecoderBufferQueueTest, IsEmpty) {
DecoderBufferQueue queue;
EXPECT_TRUE(queue.IsEmpty());
queue.Push(CreateBuffer(0));
EXPECT_FALSE(queue.IsEmpty());
}
TEST(DecoderBufferQueueTest, Clear) {
DecoderBufferQueue queue;
queue.Push(CreateBuffer(0));
queue.Push(CreateBuffer(1));
EXPECT_FALSE(queue.IsEmpty());
EXPECT_EQ(1, queue.Duration().InSeconds());
queue.Clear();
EXPECT_TRUE(queue.IsEmpty());
EXPECT_EQ(0, queue.Duration().InSeconds());
}
TEST(DecoderBufferQueueTest, Duration) {
DecoderBufferQueue queue;
EXPECT_EQ(0, queue.Duration().InSeconds());
queue.Push(CreateBuffer(0));
EXPECT_EQ(0, queue.Duration().InSeconds());
queue.Push(CreateBuffer(1));
EXPECT_EQ(1, queue.Duration().InSeconds());
queue.Push(CreateBuffer(2));
EXPECT_EQ(2, queue.Duration().InSeconds());
queue.Push(CreateBuffer(4));
EXPECT_EQ(4, queue.Duration().InSeconds());
queue.Pop();
EXPECT_EQ(3, queue.Duration().InSeconds());
queue.Pop();
EXPECT_EQ(2, queue.Duration().InSeconds());
queue.Pop();
EXPECT_EQ(0, queue.Duration().InSeconds());
queue.Pop();
EXPECT_EQ(0, queue.Duration().InSeconds());
}
TEST(DecoderBufferQueueTest, Duration_OutOfOrder) {
DecoderBufferQueue queue;
queue.Push(CreateBuffer(10));
queue.Push(CreateBuffer(12));
EXPECT_EQ(2, queue.Duration().InSeconds());
queue.Push(CreateBuffer(8));
EXPECT_EQ(2, queue.Duration().InSeconds());
queue.Pop();
EXPECT_EQ(0, queue.Duration().InSeconds());
queue.Pop();
EXPECT_EQ(0, queue.Duration().InSeconds());
queue.Push(CreateBuffer(11));
EXPECT_EQ(0, queue.Duration().InSeconds());
queue.Push(CreateBuffer(14));
EXPECT_EQ(0, queue.Duration().InSeconds());
queue.Push(CreateBuffer(17));
EXPECT_EQ(3, queue.Duration().InSeconds());
}
TEST(DecoderBufferQueueTest, Duration_NoTimestamp) {
DecoderBufferQueue queue;
queue.Push(CreateBuffer(0));
queue.Push(CreateBuffer(4));
EXPECT_EQ(4, queue.Duration().InSeconds());
queue.Push(CreateBuffer(-1));
EXPECT_EQ(4, queue.Duration().InSeconds());
queue.Push(CreateBuffer(6));
EXPECT_EQ(6, queue.Duration().InSeconds());
queue.Pop();
EXPECT_EQ(2, queue.Duration().InSeconds());
queue.Pop();
EXPECT_EQ(0, queue.Duration().InSeconds());
queue.Pop();
EXPECT_EQ(0, queue.Duration().InSeconds());
queue.Pop();
EXPECT_EQ(0, queue.Duration().InSeconds());
}
TEST(DecoderBufferQueueTest, MemoryUsage) {
DecoderBufferQueue queue;
EXPECT_EQ(queue.memory_usage_in_bytes(), 0u);
queue.Push(CreateBuffer(0, 0u));
EXPECT_EQ(queue.memory_usage_in_bytes(), GetExpectedMemoryUsage(1, 0));
queue.Pop();
EXPECT_EQ(queue.memory_usage_in_bytes(), 0u);
queue.Push(CreateBuffer(1, 1200u));
EXPECT_EQ(queue.memory_usage_in_bytes(), GetExpectedMemoryUsage(1, 1200));
queue.Push(CreateBuffer(2, 1000u));
EXPECT_EQ(queue.memory_usage_in_bytes(), GetExpectedMemoryUsage(2, 2200));
queue.Pop();
EXPECT_EQ(queue.memory_usage_in_bytes(), GetExpectedMemoryUsage(1, 1000));
queue.Push(CreateBuffer(3, 999u));
queue.Push(CreateBuffer(4, 999u));
EXPECT_EQ(queue.memory_usage_in_bytes(), GetExpectedMemoryUsage(3, 2998));
queue.Clear();
EXPECT_EQ(queue.memory_usage_in_bytes(), GetExpectedMemoryUsage(0, 0));
queue.Push(CreateBuffer(5, 1400u));
EXPECT_EQ(queue.memory_usage_in_bytes(), GetExpectedMemoryUsage(1, 1400));
}
}