Home | History | Annotate | Download | only in base
      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
    139