Home | History | Annotate | Download | only in base
      1 // Copyright 2013 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 "base/basictypes.h"
      6 #include "base/logging.h"
      7 #include "base/memory/scoped_ptr.h"
      8 #include "base/strings/stringprintf.h"
      9 #include "base/time/time.h"
     10 #include "media/base/audio_buffer.h"
     11 #include "media/base/audio_buffer_queue.h"
     12 #include "media/base/audio_bus.h"
     13 #include "media/base/buffers.h"
     14 #include "media/base/test_helpers.h"
     15 #include "testing/gtest/include/gtest/gtest.h"
     16 
     17 namespace media {
     18 
     19 static void VerifyResult(float* channel_data,
     20                          int frames,
     21                          float start,
     22                          float increment) {
     23   for (int i = 0; i < frames; ++i) {
     24     SCOPED_TRACE(base::StringPrintf(
     25         "i=%d/%d start=%f, increment=%f", i, frames, start, increment));
     26     ASSERT_EQ(start, channel_data[i]);
     27     start += increment;
     28   }
     29 }
     30 
     31 TEST(AudioBufferQueueTest, AppendAndClear) {
     32   const int channels = 1;
     33   const int frames = 8;
     34   const base::TimeDelta kNoTime = kNoTimestamp();
     35   AudioBufferQueue buffer;
     36   EXPECT_EQ(0, buffer.frames());
     37   buffer.Append(MakeInterleavedAudioBuffer<uint8>(
     38       kSampleFormatU8, channels, 10, 1, frames, kNoTime, kNoTime));
     39   EXPECT_EQ(frames, buffer.frames());
     40   buffer.Clear();
     41   EXPECT_EQ(0, buffer.frames());
     42   buffer.Append(MakeInterleavedAudioBuffer<uint8>(
     43       kSampleFormatU8, channels, 20, 1, frames, kNoTime, kNoTime));
     44   EXPECT_EQ(frames, buffer.frames());
     45 }
     46 
     47 TEST(AudioBufferQueueTest, MultipleAppend) {
     48   const int channels = 1;
     49   const int frames = 8;
     50   const base::TimeDelta kNoTime = kNoTimestamp();
     51   AudioBufferQueue buffer;
     52 
     53   // Append 40 frames in 5 buffers.
     54   buffer.Append(MakeInterleavedAudioBuffer<uint8>(
     55       kSampleFormatU8, channels, 10, 1, frames, kNoTime, kNoTime));
     56   EXPECT_EQ(8, buffer.frames());
     57   buffer.Append(MakeInterleavedAudioBuffer<uint8>(
     58       kSampleFormatU8, channels, 10, 1, frames, kNoTime, kNoTime));
     59   EXPECT_EQ(16, buffer.frames());
     60   buffer.Append(MakeInterleavedAudioBuffer<uint8>(
     61       kSampleFormatU8, channels, 10, 1, frames, kNoTime, kNoTime));
     62   EXPECT_EQ(24, buffer.frames());
     63   buffer.Append(MakeInterleavedAudioBuffer<uint8>(
     64       kSampleFormatU8, channels, 10, 1, frames, kNoTime, kNoTime));
     65   EXPECT_EQ(32, buffer.frames());
     66   buffer.Append(MakeInterleavedAudioBuffer<uint8>(
     67       kSampleFormatU8, channels, 10, 1, frames, kNoTime, kNoTime));
     68   EXPECT_EQ(40, buffer.frames());
     69 }
     70 
     71 TEST(AudioBufferQueueTest, IteratorCheck) {
     72   const int channels = 1;
     73   const int frames = 8;
     74   const base::TimeDelta kNoTime = kNoTimestamp();
     75   AudioBufferQueue buffer;
     76   scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100);
     77 
     78   // Append 40 frames in 5 buffers. Intersperse ReadFrames() to make the
     79   // iterator is pointing to the correct position.
     80   buffer.Append(MakeInterleavedAudioBuffer<float>(
     81       kSampleFormatF32, channels, 10.0f, 1.0f, frames, kNoTime, kNoTime));
     82   EXPECT_EQ(8, buffer.frames());
     83 
     84   EXPECT_EQ(4, buffer.ReadFrames(4, 0, bus.get()));
     85   EXPECT_EQ(4, buffer.frames());
     86   VerifyResult(bus->channel(0), 4, 10.0f, 1.0f);
     87 
     88   buffer.Append(MakeInterleavedAudioBuffer<float>(
     89       kSampleFormatF32, channels, 20.0f, 1.0f, frames, kNoTime, kNoTime));
     90   EXPECT_EQ(12, buffer.frames());
     91   buffer.Append(MakeInterleavedAudioBuffer<float>(
     92       kSampleFormatF32, channels, 30.0f, 1.0f, frames, kNoTime, kNoTime));
     93   EXPECT_EQ(20, buffer.frames());
     94 
     95   buffer.SeekFrames(16);
     96   EXPECT_EQ(4, buffer.ReadFrames(4, 0, bus.get()));
     97   EXPECT_EQ(0, buffer.frames());
     98   VerifyResult(bus->channel(0), 4, 34.0f, 1.0f);
     99 
    100   buffer.Append(MakeInterleavedAudioBuffer<float>(
    101       kSampleFormatF32, channels, 40.0f, 1.0f, frames, kNoTime, kNoTime));
    102   EXPECT_EQ(8, buffer.frames());
    103   buffer.Append(MakeInterleavedAudioBuffer<float>(
    104       kSampleFormatF32, channels, 50.0f, 1.0f, frames, kNoTime, kNoTime));
    105   EXPECT_EQ(16, buffer.frames());
    106 
    107   EXPECT_EQ(4, buffer.ReadFrames(4, 0, bus.get()));
    108   VerifyResult(bus->channel(0), 4, 40.0f, 1.0f);
    109 
    110   // Read off the end of the buffer.
    111   EXPECT_EQ(12, buffer.frames());
    112   buffer.SeekFrames(8);
    113   EXPECT_EQ(4, buffer.ReadFrames(100, 0, bus.get()));
    114   VerifyResult(bus->channel(0), 4, 54.0f, 1.0f);
    115 }
    116 
    117 TEST(AudioBufferQueueTest, Seek) {
    118   const int channels = 2;
    119   const int frames = 6;
    120   const base::TimeDelta kNoTime = kNoTimestamp();
    121   AudioBufferQueue buffer;
    122 
    123   // Add 6 frames of data.
    124   buffer.Append(MakeInterleavedAudioBuffer<float>(
    125       kSampleFormatF32, channels, 1.0f, 1.0f, frames, kNoTime, kNoTime));
    126   EXPECT_EQ(6, buffer.frames());
    127 
    128   // Seek past 2 frames.
    129   buffer.SeekFrames(2);
    130   EXPECT_EQ(4, buffer.frames());
    131 
    132   // Seek to end of data.
    133   buffer.SeekFrames(4);
    134   EXPECT_EQ(0, buffer.frames());
    135 
    136   // At end, seek now fails unless 0 specified.
    137   buffer.SeekFrames(0);
    138 }
    139 
    140 TEST(AudioBufferQueueTest, ReadF32) {
    141   const int channels = 2;
    142   const base::TimeDelta kNoTime = kNoTimestamp();
    143   AudioBufferQueue buffer;
    144 
    145   // Add 76 frames of data.
    146   buffer.Append(MakeInterleavedAudioBuffer<float>(
    147       kSampleFormatF32, channels, 1.0f, 1.0f, 6, kNoTime, kNoTime));
    148   buffer.Append(MakeInterleavedAudioBuffer<float>(
    149       kSampleFormatF32, channels, 13.0f, 1.0f, 10, kNoTime, kNoTime));
    150   buffer.Append(MakeInterleavedAudioBuffer<float>(
    151       kSampleFormatF32, channels, 33.0f, 1.0f, 60, kNoTime, kNoTime));
    152   EXPECT_EQ(76, buffer.frames());
    153 
    154   // Read 3 frames from the buffer. F32 is interleaved, so ch[0] should be
    155   // 1, 3, 5, and ch[1] should be 2, 4, 6.
    156   scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100);
    157   EXPECT_EQ(3, buffer.ReadFrames(3, 0, bus.get()));
    158   EXPECT_EQ(73, buffer.frames());
    159   VerifyResult(bus->channel(0), 3, 1.0f, 2.0f);
    160   VerifyResult(bus->channel(1), 3, 2.0f, 2.0f);
    161 
    162   // Now read 5 frames, which will span buffers. Append the data into AudioBus.
    163   EXPECT_EQ(5, buffer.ReadFrames(5, 3, bus.get()));
    164   EXPECT_EQ(68, buffer.frames());
    165   VerifyResult(bus->channel(0), 8, 1.0f, 2.0f);
    166   VerifyResult(bus->channel(1), 8, 2.0f, 2.0f);
    167 
    168   // Now skip into the third buffer.
    169   buffer.SeekFrames(20);
    170   EXPECT_EQ(48, buffer.frames());
    171 
    172   // Now read 2 frames, which are in the third buffer.
    173   EXPECT_EQ(2, buffer.ReadFrames(2, 0, bus.get()));
    174   VerifyResult(bus->channel(0), 2, 57.0f, 2.0f);
    175   VerifyResult(bus->channel(1), 2, 58.0f, 2.0f);
    176 }
    177 
    178 TEST(AudioBufferQueueTest, ReadU8) {
    179   const int channels = 4;
    180   const int frames = 4;
    181   const base::TimeDelta kNoTime = kNoTimestamp();
    182   AudioBufferQueue buffer;
    183 
    184   // Add 4 frames of data.
    185   buffer.Append(MakeInterleavedAudioBuffer<uint8>(
    186       kSampleFormatU8, channels, 128, 1, frames, kNoTime, kNoTime));
    187 
    188   // Read all 4 frames from the buffer. Data is interleaved, so ch[0] should be
    189   // 128, 132, 136, 140, other channels similar. However, values are converted
    190   // from [0, 255] to [-1.0, 1.0] with a bias of 128. Thus the first buffer
    191   // value should be 0.0, then 1/127, 2/127, etc.
    192   scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100);
    193   EXPECT_EQ(4, buffer.ReadFrames(4, 0, bus.get()));
    194   EXPECT_EQ(0, buffer.frames());
    195   VerifyResult(bus->channel(0), 4, 0.0f, 4.0f / 127.0f);
    196   VerifyResult(bus->channel(1), 4, 1.0f / 127.0f, 4.0f / 127.0f);
    197   VerifyResult(bus->channel(2), 4, 2.0f / 127.0f, 4.0f / 127.0f);
    198   VerifyResult(bus->channel(3), 4, 3.0f / 127.0f, 4.0f / 127.0f);
    199 }
    200 
    201 TEST(AudioBufferQueueTest, ReadS16) {
    202   const int channels = 2;
    203   const base::TimeDelta kNoTime = kNoTimestamp();
    204   AudioBufferQueue buffer;
    205 
    206   // Add 24 frames of data.
    207   buffer.Append(MakeInterleavedAudioBuffer<int16>(
    208       kSampleFormatS16, channels, 1, 1, 4, kNoTime, kNoTime));
    209   buffer.Append(MakeInterleavedAudioBuffer<int16>(
    210       kSampleFormatS16, channels, 9, 1, 20, kNoTime, kNoTime));
    211   EXPECT_EQ(24, buffer.frames());
    212 
    213   // Read 6 frames from the buffer. Data is interleaved, so ch[0] should be
    214   // 1, 3, 5, 7, 9, 11, and ch[1] should be 2, 4, 6, 8, 10, 12.
    215   // Data is converted to float from -1.0 to 1.0 based on int16 range.
    216   scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100);
    217   EXPECT_EQ(6, buffer.ReadFrames(6, 0, bus.get()));
    218   EXPECT_EQ(18, buffer.frames());
    219   VerifyResult(bus->channel(0), 6, 1.0f / kint16max, 2.0f / kint16max);
    220   VerifyResult(bus->channel(1), 6, 2.0f / kint16max, 2.0f / kint16max);
    221 }
    222 
    223 TEST(AudioBufferQueueTest, ReadS32) {
    224   const int channels = 2;
    225   const base::TimeDelta kNoTime = kNoTimestamp();
    226   AudioBufferQueue buffer;
    227 
    228   // Add 24 frames of data.
    229   buffer.Append(MakeInterleavedAudioBuffer<int32>(
    230       kSampleFormatS32, channels, 1, 1, 4, kNoTime, kNoTime));
    231   buffer.Append(MakeInterleavedAudioBuffer<int32>(
    232       kSampleFormatS32, channels, 9, 1, 20, kNoTime, kNoTime));
    233   EXPECT_EQ(24, buffer.frames());
    234 
    235   // Read 6 frames from the buffer. Data is interleaved, so ch[0] should be
    236   // 1, 3, 5, 7, 100, 106, and ch[1] should be 2, 4, 6, 8, 103, 109.
    237   // Data is converted to float from -1.0 to 1.0 based on int32 range.
    238   scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100);
    239   EXPECT_EQ(6, buffer.ReadFrames(6, 0, bus.get()));
    240   EXPECT_EQ(18, buffer.frames());
    241   VerifyResult(bus->channel(0), 6, 1.0f / kint32max, 2.0f / kint32max);
    242   VerifyResult(bus->channel(1), 6, 2.0f / kint32max, 2.0f / kint32max);
    243 
    244   // Read the next 2 frames.
    245   EXPECT_EQ(2, buffer.ReadFrames(2, 0, bus.get()));
    246   EXPECT_EQ(16, buffer.frames());
    247   VerifyResult(bus->channel(0), 2, 13.0f / kint32max, 2.0f / kint32max);
    248   VerifyResult(bus->channel(1), 2, 14.0f / kint32max, 2.0f / kint32max);
    249 }
    250 
    251 TEST(AudioBufferQueueTest, ReadF32Planar) {
    252   const int channels = 2;
    253   const base::TimeDelta kNoTime = kNoTimestamp();
    254   AudioBufferQueue buffer;
    255 
    256   // Add 14 frames of data.
    257   buffer.Append(MakePlanarAudioBuffer<float>(
    258       kSampleFormatPlanarF32, channels, 1.0f, 1.0f, 4, kNoTime, kNoTime));
    259   buffer.Append(MakePlanarAudioBuffer<float>(
    260       kSampleFormatPlanarF32, channels, 50.0f, 1.0f, 10, kNoTime, kNoTime));
    261   EXPECT_EQ(14, buffer.frames());
    262 
    263   // Read 6 frames from the buffer. F32 is planar, so ch[0] should be
    264   // 1, 2, 3, 4, 50, 51, and ch[1] should be 5, 6, 7, 8, 60, 61.
    265   scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100);
    266   EXPECT_EQ(6, buffer.ReadFrames(6, 0, bus.get()));
    267   EXPECT_EQ(8, buffer.frames());
    268   VerifyResult(bus->channel(0), 4, 1.0f, 1.0f);
    269   VerifyResult(bus->channel(0) + 4, 2, 50.0f, 1.0f);
    270   VerifyResult(bus->channel(1), 4, 5.0f, 1.0f);
    271   VerifyResult(bus->channel(1) + 4, 2, 60.0f, 1.0f);
    272 }
    273 
    274 TEST(AudioBufferQueueTest, ReadS16Planar) {
    275   const int channels = 2;
    276   const base::TimeDelta kNoTime = kNoTimestamp();
    277   AudioBufferQueue buffer;
    278 
    279   // Add 24 frames of data.
    280   buffer.Append(MakePlanarAudioBuffer<int16>(
    281       kSampleFormatPlanarS16, channels, 1, 1, 4, kNoTime, kNoTime));
    282   buffer.Append(MakePlanarAudioBuffer<int16>(
    283       kSampleFormatPlanarS16, channels, 100, 5, 20, kNoTime, kNoTime));
    284   EXPECT_EQ(24, buffer.frames());
    285 
    286   // Read 6 frames from the buffer. Data is planar, so ch[0] should be
    287   // 1, 2, 3, 4, 100, 105, and ch[1] should be 5, 6, 7, 8, 200, 205.
    288   // Data is converted to float from -1.0 to 1.0 based on int16 range.
    289   scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100);
    290   EXPECT_EQ(6, buffer.ReadFrames(6, 0, bus.get()));
    291   EXPECT_EQ(18, buffer.frames());
    292   VerifyResult(bus->channel(0), 4, 1.0f / kint16max, 1.0f / kint16max);
    293   VerifyResult(bus->channel(0) + 4, 2, 100.0f / kint16max, 5.0f / kint16max);
    294   VerifyResult(bus->channel(1), 4, 5.0f / kint16max, 1.0f / kint16max);
    295   VerifyResult(bus->channel(1) + 4, 2, 200.0f / kint16max, 5.0f / kint16max);
    296 }
    297 
    298 TEST(AudioBufferQueueTest, ReadManyChannels) {
    299   const int channels = 16;
    300   const base::TimeDelta kNoTime = kNoTimestamp();
    301   AudioBufferQueue buffer;
    302 
    303   // Add 76 frames of data.
    304   buffer.Append(MakeInterleavedAudioBuffer<float>(
    305       kSampleFormatF32, channels, 0.0f, 1.0f, 6, kNoTime, kNoTime));
    306   buffer.Append(MakeInterleavedAudioBuffer<float>(
    307       kSampleFormatF32, channels, 6.0f * channels, 1.0f, 10, kNoTime, kNoTime));
    308   buffer.Append(MakeInterleavedAudioBuffer<float>(kSampleFormatF32,
    309                                                   channels,
    310                                                   16.0f * channels,
    311                                                   1.0f,
    312                                                   60,
    313                                                   kNoTime,
    314                                                   kNoTime));
    315   EXPECT_EQ(76, buffer.frames());
    316 
    317   // Read 3 frames from the buffer. F32 is interleaved, so ch[0] should be
    318   // 1, 17, 33, and ch[1] should be 2, 18, 34. Just check a few channels.
    319   scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100);
    320   EXPECT_EQ(30, buffer.ReadFrames(30, 0, bus.get()));
    321   EXPECT_EQ(46, buffer.frames());
    322   for (int i = 0; i < channels; ++i) {
    323     VerifyResult(bus->channel(i), 30, static_cast<float>(i), 16.0f);
    324   }
    325 }
    326 
    327 TEST(AudioBufferQueueTest, Peek) {
    328   const int channels = 4;
    329   const base::TimeDelta kNoTime = kNoTimestamp();
    330   AudioBufferQueue buffer;
    331 
    332   // Add 60 frames of data.
    333   buffer.Append(MakeInterleavedAudioBuffer<float>(
    334       kSampleFormatF32, channels, 0.0f, 1.0f, 60, kNoTime, kNoTime));
    335   EXPECT_EQ(60, buffer.frames());
    336 
    337   // Peek at the first 30 frames.
    338   scoped_ptr<AudioBus> bus1 = AudioBus::Create(channels, 100);
    339   EXPECT_EQ(60, buffer.frames());
    340   EXPECT_EQ(60, buffer.PeekFrames(100, 0, 0, bus1.get()));
    341   EXPECT_EQ(30, buffer.PeekFrames(30, 0, 0, bus1.get()));
    342   EXPECT_EQ(60, buffer.frames());
    343 
    344   // Now read the next 30 frames (which should be the same as those peeked at).
    345   scoped_ptr<AudioBus> bus2 = AudioBus::Create(channels, 100);
    346   EXPECT_EQ(30, buffer.ReadFrames(30, 0, bus2.get()));
    347   for (int i = 0; i < channels; ++i) {
    348     VerifyResult(bus1->channel(i),
    349                  30,
    350                  static_cast<float>(i),
    351                  static_cast<float>(channels));
    352     VerifyResult(bus2->channel(i),
    353                  30,
    354                  static_cast<float>(i),
    355                  static_cast<float>(channels));
    356   }
    357 
    358   // Peek 10 frames forward
    359   EXPECT_EQ(5, buffer.PeekFrames(5, 10, 0, bus1.get()));
    360   for (int i = 0; i < channels; ++i) {
    361     VerifyResult(bus1->channel(i),
    362                  5,
    363                  static_cast<float>(i + 40 * channels),
    364                  static_cast<float>(channels));
    365   }
    366 
    367   // Peek to the end of the buffer.
    368   EXPECT_EQ(30, buffer.frames());
    369   EXPECT_EQ(30, buffer.PeekFrames(100, 0, 0, bus1.get()));
    370   EXPECT_EQ(30, buffer.PeekFrames(30, 0, 0, bus1.get()));
    371 }
    372 
    373 TEST(AudioBufferQueueTest, Time) {
    374   const int channels = 2;
    375   const base::TimeDelta start_time1;
    376   const base::TimeDelta start_time2 = base::TimeDelta::FromSeconds(30);
    377   const base::TimeDelta duration = base::TimeDelta::FromSeconds(10);
    378   AudioBufferQueue buffer;
    379   scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100);
    380 
    381   // Add two buffers (second one added later):
    382   //   first:  start=0s,  duration=10s
    383   //   second: start=30s, duration=10s
    384   buffer.Append(MakeInterleavedAudioBuffer<int16>(
    385       kSampleFormatS16, channels, 1, 1, 10, start_time1, duration));
    386   EXPECT_EQ(10, buffer.frames());
    387 
    388   // Check starting time.
    389   EXPECT_EQ(start_time1, buffer.current_time());
    390 
    391   // Read 2 frames, should be 2s in (since duration is 1s per sample).
    392   EXPECT_EQ(2, buffer.ReadFrames(2, 0, bus.get()));
    393   EXPECT_EQ(start_time1 + base::TimeDelta::FromSeconds(2),
    394             buffer.current_time());
    395 
    396   // Skip 2 frames.
    397   buffer.SeekFrames(2);
    398   EXPECT_EQ(start_time1 + base::TimeDelta::FromSeconds(4),
    399             buffer.current_time());
    400 
    401   // Add second buffer for more data.
    402   buffer.Append(MakeInterleavedAudioBuffer<int16>(
    403       kSampleFormatS16, channels, 1, 1, 10, start_time2, duration));
    404   EXPECT_EQ(16, buffer.frames());
    405 
    406   // Read until almost the end of buffer1.
    407   EXPECT_EQ(5, buffer.ReadFrames(5, 0, bus.get()));
    408   EXPECT_EQ(start_time1 + base::TimeDelta::FromSeconds(9),
    409             buffer.current_time());
    410 
    411   // Read 1 value, so time moved to buffer2.
    412   EXPECT_EQ(1, buffer.ReadFrames(1, 0, bus.get()));
    413   EXPECT_EQ(start_time2, buffer.current_time());
    414 
    415   // Read all 10 frames in buffer2, timestamp should be last time from buffer2.
    416   EXPECT_EQ(10, buffer.ReadFrames(10, 0, bus.get()));
    417   EXPECT_EQ(start_time2 + base::TimeDelta::FromSeconds(10),
    418             buffer.current_time());
    419 
    420   // Try to read more frames (which don't exist), timestamp should remain.
    421   EXPECT_EQ(0, buffer.ReadFrames(5, 0, bus.get()));
    422   EXPECT_EQ(start_time2 + base::TimeDelta::FromSeconds(10),
    423             buffer.current_time());
    424 }
    425 
    426 TEST(AudioBufferQueueTest, NoTime) {
    427   const int channels = 2;
    428   const base::TimeDelta kNoTime = kNoTimestamp();
    429   AudioBufferQueue buffer;
    430   scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100);
    431 
    432   // Add two buffers with no timestamps. Time should always be unknown.
    433   buffer.Append(MakeInterleavedAudioBuffer<int16>(
    434       kSampleFormatS16, channels, 1, 1, 10, kNoTime, kNoTime));
    435   buffer.Append(MakeInterleavedAudioBuffer<int16>(
    436       kSampleFormatS16, channels, 1, 1, 10, kNoTime, kNoTime));
    437   EXPECT_EQ(20, buffer.frames());
    438 
    439   // Check starting time.
    440   EXPECT_EQ(kNoTime, buffer.current_time());
    441 
    442   // Read 2 frames.
    443   EXPECT_EQ(2, buffer.ReadFrames(2, 0, bus.get()));
    444   EXPECT_EQ(kNoTime, buffer.current_time());
    445 
    446   // Skip 2 frames.
    447   buffer.SeekFrames(2);
    448   EXPECT_EQ(kNoTime, buffer.current_time());
    449 
    450   // Read until almost the end of buffer1.
    451   EXPECT_EQ(5, buffer.ReadFrames(5, 0, bus.get()));
    452   EXPECT_EQ(kNoTime, buffer.current_time());
    453 
    454   // Read 1 value, so time moved to buffer2.
    455   EXPECT_EQ(1, buffer.ReadFrames(1, 0, bus.get()));
    456   EXPECT_EQ(kNoTime, buffer.current_time());
    457 
    458   // Read all 10 frames in buffer2.
    459   EXPECT_EQ(10, buffer.ReadFrames(10, 0, bus.get()));
    460   EXPECT_EQ(kNoTime, buffer.current_time());
    461 
    462   // Try to read more frames (which don't exist), timestamp should remain.
    463   EXPECT_EQ(0, buffer.ReadFrames(5, 0, bus.get()));
    464   EXPECT_EQ(kNoTime, buffer.current_time());
    465 }
    466 
    467 }  // namespace media
    468