decoder_buffer_queue_unittest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "media/base/buffers.h"
6#include "media/base/decoder_buffer.h"
7#include "media/base/decoder_buffer_queue.h"
8#include "testing/gtest/include/gtest/gtest.h"
9
10namespace media {
11
12static base::TimeDelta ToTimeDelta(int seconds) {
13  if (seconds < 0)
14    return kNoTimestamp();
15  return base::TimeDelta::FromSeconds(seconds);
16}
17
18// Helper to create buffers with specified timestamp in seconds.
19//
20// Negative numbers will be converted to kNoTimestamp();
21static scoped_refptr<DecoderBuffer> CreateBuffer(int timestamp) {
22  scoped_refptr<DecoderBuffer> buffer = new DecoderBuffer(0);
23  buffer->SetTimestamp(ToTimeDelta(timestamp));
24  buffer->SetDuration(ToTimeDelta(0));
25  return buffer;
26}
27
28TEST(DecoderBufferQueueTest, IsEmpty) {
29  DecoderBufferQueue queue;
30  EXPECT_TRUE(queue.IsEmpty());
31
32  queue.Push(CreateBuffer(0));
33  EXPECT_FALSE(queue.IsEmpty());
34}
35
36TEST(DecoderBufferQueueTest, Clear) {
37  DecoderBufferQueue queue;
38  queue.Push(CreateBuffer(0));
39  queue.Push(CreateBuffer(1));
40  EXPECT_FALSE(queue.IsEmpty());
41  EXPECT_EQ(1, queue.Duration().InSeconds());
42
43  queue.Clear();
44  EXPECT_TRUE(queue.IsEmpty());
45  EXPECT_EQ(0, queue.Duration().InSeconds());
46}
47
48TEST(DecoderBufferQueueTest, Duration) {
49  DecoderBufferQueue queue;
50  EXPECT_EQ(0, queue.Duration().InSeconds());
51
52  queue.Push(CreateBuffer(0));
53  EXPECT_EQ(0, queue.Duration().InSeconds());
54
55  queue.Push(CreateBuffer(1));
56  EXPECT_EQ(1, queue.Duration().InSeconds());
57
58  queue.Push(CreateBuffer(2));
59  EXPECT_EQ(2, queue.Duration().InSeconds());
60
61  queue.Push(CreateBuffer(4));
62  EXPECT_EQ(4, queue.Duration().InSeconds());
63
64  queue.Pop();
65  EXPECT_EQ(3, queue.Duration().InSeconds());
66
67  queue.Pop();
68  EXPECT_EQ(2, queue.Duration().InSeconds());
69
70  queue.Pop();
71  EXPECT_EQ(0, queue.Duration().InSeconds());
72
73  queue.Pop();
74  EXPECT_EQ(0, queue.Duration().InSeconds());
75}
76
77TEST(DecoderBufferQueueTest, Duration_OutOfOrder) {
78  DecoderBufferQueue queue;
79  queue.Push(CreateBuffer(10));
80  queue.Push(CreateBuffer(12));
81  EXPECT_EQ(2, queue.Duration().InSeconds());
82
83  // Out of order: duration shouldn't change.
84  queue.Push(CreateBuffer(8));
85  EXPECT_EQ(2, queue.Duration().InSeconds());
86
87  // Removing first buffer should leave the second buffer as the only buffer
88  // included in the duration calculation.
89  queue.Pop();
90  EXPECT_EQ(0, queue.Duration().InSeconds());
91
92  // Removing second buffer leaves the out-of-order buffer. It shouldn't be
93  // included in duration calculations.
94  queue.Pop();
95  EXPECT_EQ(0, queue.Duration().InSeconds());
96
97  // Push a still-too-early buffer. It shouldn't be included in duration
98  // calculations.
99  queue.Push(CreateBuffer(11));
100  EXPECT_EQ(0, queue.Duration().InSeconds());
101
102  // Push a buffer that's after the earliest valid time. It's a singular valid
103  // buffer so duration is still zero.
104  queue.Push(CreateBuffer(14));
105  EXPECT_EQ(0, queue.Duration().InSeconds());
106
107  // Push a second valid buffer. We should now have a duration.
108  queue.Push(CreateBuffer(17));
109  EXPECT_EQ(3, queue.Duration().InSeconds());
110}
111
112TEST(DecoderBufferQueueTest, Duration_NoTimestamp) {
113  // Buffers with no timestamp don't affect duration.
114  DecoderBufferQueue queue;
115  queue.Push(CreateBuffer(0));
116  queue.Push(CreateBuffer(4));
117  EXPECT_EQ(4, queue.Duration().InSeconds());
118
119  queue.Push(CreateBuffer(-1));
120  EXPECT_EQ(4, queue.Duration().InSeconds());
121
122  queue.Push(CreateBuffer(6));
123  EXPECT_EQ(6, queue.Duration().InSeconds());
124
125  queue.Pop();
126  EXPECT_EQ(2, queue.Duration().InSeconds());
127
128  queue.Pop();
129  EXPECT_EQ(0, queue.Duration().InSeconds());
130
131  queue.Pop();
132  EXPECT_EQ(0, queue.Duration().InSeconds());
133
134  queue.Pop();
135  EXPECT_EQ(0, queue.Duration().InSeconds());
136}
137
138}  // namespace media
139