decoder_buffer_queue_unittest.cc revision ca12bfac764ba476d6cd062bf1dde12cc64c3f40
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/buffers.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/decoder_buffer.h" 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/decoder_buffer_queue.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace media { 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static base::TimeDelta ToTimeDelta(int seconds) { 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (seconds < 0) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kNoTimestamp(); 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::TimeDelta::FromSeconds(seconds); 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Helper to create buffers with specified timestamp in seconds. 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Negative numbers will be converted to kNoTimestamp(); 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static scoped_refptr<DecoderBuffer> CreateBuffer(int timestamp) { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DecoderBuffer> buffer = new DecoderBuffer(0); 23ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch buffer->set_timestamp(ToTimeDelta(timestamp)); 24ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch buffer->set_duration(ToTimeDelta(0)); 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return buffer; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DecoderBufferQueueTest, IsEmpty) { 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DecoderBufferQueue queue; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(queue.IsEmpty()); 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Push(CreateBuffer(0)); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(queue.IsEmpty()); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DecoderBufferQueueTest, Clear) { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DecoderBufferQueue queue; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Push(CreateBuffer(0)); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Push(CreateBuffer(1)); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(queue.IsEmpty()); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, queue.Duration().InSeconds()); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Clear(); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(queue.IsEmpty()); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, queue.Duration().InSeconds()); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DecoderBufferQueueTest, Duration) { 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DecoderBufferQueue queue; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, queue.Duration().InSeconds()); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Push(CreateBuffer(0)); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, queue.Duration().InSeconds()); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Push(CreateBuffer(1)); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, queue.Duration().InSeconds()); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Push(CreateBuffer(2)); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, queue.Duration().InSeconds()); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Push(CreateBuffer(4)); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(4, queue.Duration().InSeconds()); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Pop(); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3, queue.Duration().InSeconds()); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Pop(); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, queue.Duration().InSeconds()); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Pop(); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, queue.Duration().InSeconds()); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Pop(); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, queue.Duration().InSeconds()); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DecoderBufferQueueTest, Duration_OutOfOrder) { 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DecoderBufferQueue queue; 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Push(CreateBuffer(10)); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Push(CreateBuffer(12)); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, queue.Duration().InSeconds()); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Out of order: duration shouldn't change. 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Push(CreateBuffer(8)); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, queue.Duration().InSeconds()); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Removing first buffer should leave the second buffer as the only buffer 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // included in the duration calculation. 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Pop(); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, queue.Duration().InSeconds()); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Removing second buffer leaves the out-of-order buffer. It shouldn't be 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // included in duration calculations. 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Pop(); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, queue.Duration().InSeconds()); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Push a still-too-early buffer. It shouldn't be included in duration 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calculations. 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Push(CreateBuffer(11)); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, queue.Duration().InSeconds()); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Push a buffer that's after the earliest valid time. It's a singular valid 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // buffer so duration is still zero. 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Push(CreateBuffer(14)); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, queue.Duration().InSeconds()); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Push a second valid buffer. We should now have a duration. 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Push(CreateBuffer(17)); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3, queue.Duration().InSeconds()); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DecoderBufferQueueTest, Duration_NoTimestamp) { 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Buffers with no timestamp don't affect duration. 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DecoderBufferQueue queue; 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Push(CreateBuffer(0)); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Push(CreateBuffer(4)); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(4, queue.Duration().InSeconds()); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Push(CreateBuffer(-1)); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(4, queue.Duration().InSeconds()); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Push(CreateBuffer(6)); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(6, queue.Duration().InSeconds()); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Pop(); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, queue.Duration().InSeconds()); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Pop(); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, queue.Duration().InSeconds()); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Pop(); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, queue.Duration().InSeconds()); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue.Pop(); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, queue.Duration().InSeconds()); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace media 139