- add sources.
[platform/framework/web/crosswalk.git] / src / media / base / decoder_buffer_queue_unittest.cc
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
10 namespace media {
11
12 static 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();
21 static scoped_refptr<DecoderBuffer> CreateBuffer(int timestamp) {
22   scoped_refptr<DecoderBuffer> buffer = new DecoderBuffer(0);
23   buffer->set_timestamp(ToTimeDelta(timestamp));
24   buffer->set_duration(ToTimeDelta(0));
25   return buffer;
26 }
27
28 TEST(DecoderBufferQueueTest, IsEmpty) {
29   DecoderBufferQueue queue;
30   EXPECT_TRUE(queue.IsEmpty());
31
32   queue.Push(CreateBuffer(0));
33   EXPECT_FALSE(queue.IsEmpty());
34 }
35
36 TEST(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
48 TEST(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
77 TEST(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
112 TEST(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