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 "media/base/audio_buffer.h"
      6 #include "media/base/audio_bus.h"
      7 #include "media/base/test_helpers.h"
      8 #include "testing/gtest/include/gtest/gtest.h"
      9 
     10 namespace media {
     11 
     12 static const int kSampleRate = 48000;
     13 
     14 static void VerifyBusWithOffset(AudioBus* bus,
     15                                 int offset,
     16                                 int frames,
     17                                 float start,
     18                                 float start_offset,
     19                                 float increment) {
     20   for (int ch = 0; ch < bus->channels(); ++ch) {
     21     const float v = start_offset + start + ch * bus->frames() * increment;
     22     for (int i = offset; i < offset + frames; ++i) {
     23       ASSERT_FLOAT_EQ(v + i * increment, bus->channel(ch)[i]) << "i=" << i
     24                                                               << ", ch=" << ch;
     25     }
     26   }
     27 }
     28 
     29 static void VerifyBus(AudioBus* bus, int frames, float start, float increment) {
     30   VerifyBusWithOffset(bus, 0, frames, start, 0, increment);
     31 }
     32 
     33 static void TrimRangeTest(SampleFormat sample_format) {
     34   const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0;
     35   const int channels = ChannelLayoutToChannelCount(channel_layout);
     36   const int frames = kSampleRate / 10;
     37   const base::TimeDelta timestamp = base::TimeDelta();
     38   const base::TimeDelta duration = base::TimeDelta::FromMilliseconds(100);
     39   scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<float>(sample_format,
     40                                                              channel_layout,
     41                                                              channels,
     42                                                              kSampleRate,
     43                                                              0,
     44                                                              1,
     45                                                              frames,
     46                                                              timestamp);
     47   EXPECT_EQ(frames, buffer->frame_count());
     48   EXPECT_EQ(timestamp, buffer->timestamp());
     49   EXPECT_EQ(duration, buffer->duration());
     50 
     51   scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames);
     52 
     53   // Verify all frames before trimming.
     54   buffer->ReadFrames(frames, 0, 0, bus.get());
     55   VerifyBus(bus.get(), frames, 0, 1);
     56 
     57   // Trim 10ms of frames from the middle of the buffer.
     58   int trim_start = frames / 2;
     59   const int trim_length = kSampleRate / 100;
     60   const base::TimeDelta trim_duration = base::TimeDelta::FromMilliseconds(10);
     61   buffer->TrimRange(trim_start, trim_start + trim_length);
     62   EXPECT_EQ(frames - trim_length, buffer->frame_count());
     63   EXPECT_EQ(timestamp, buffer->timestamp());
     64   EXPECT_EQ(duration - trim_duration, buffer->duration());
     65   bus->Zero();
     66   buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get());
     67   VerifyBus(bus.get(), trim_start, 0, 1);
     68   VerifyBusWithOffset(bus.get(),
     69                       trim_start,
     70                       buffer->frame_count() - trim_start,
     71                       0,
     72                       trim_length,
     73                       1);
     74 
     75   // Trim 10ms of frames from the start, which just adjusts the buffer's
     76   // internal start offset.
     77   buffer->TrimStart(trim_length);
     78   trim_start -= trim_length;
     79   EXPECT_EQ(frames - 2 * trim_length, buffer->frame_count());
     80   EXPECT_EQ(timestamp + trim_duration, buffer->timestamp());
     81   EXPECT_EQ(duration - 2 * trim_duration, buffer->duration());
     82   bus->Zero();
     83   buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get());
     84   VerifyBus(bus.get(), trim_start, trim_length, 1);
     85   VerifyBusWithOffset(bus.get(),
     86                       trim_start,
     87                       buffer->frame_count() - trim_start,
     88                       trim_length,
     89                       trim_length,
     90                       1);
     91 
     92   // Trim 10ms of frames from the end, which just adjusts the buffer's frame
     93   // count.
     94   buffer->TrimEnd(trim_length);
     95   EXPECT_EQ(frames - 3 * trim_length, buffer->frame_count());
     96   EXPECT_EQ(timestamp + trim_duration, buffer->timestamp());
     97   EXPECT_EQ(duration - 3 * trim_duration, buffer->duration());
     98   bus->Zero();
     99   buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get());
    100   VerifyBus(bus.get(), trim_start, trim_length, 1);
    101   VerifyBusWithOffset(bus.get(),
    102                       trim_start,
    103                       buffer->frame_count() - trim_start,
    104                       trim_length,
    105                       trim_length,
    106                       1);
    107 
    108   // Trim another 10ms from the inner portion of the buffer.
    109   buffer->TrimRange(trim_start, trim_start + trim_length);
    110   EXPECT_EQ(frames - 4 * trim_length, buffer->frame_count());
    111   EXPECT_EQ(timestamp + trim_duration, buffer->timestamp());
    112   EXPECT_EQ(duration - 4 * trim_duration, buffer->duration());
    113   bus->Zero();
    114   buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get());
    115   VerifyBus(bus.get(), trim_start, trim_length, 1);
    116   VerifyBusWithOffset(bus.get(),
    117                       trim_start,
    118                       buffer->frame_count() - trim_start,
    119                       trim_length,
    120                       trim_length * 2,
    121                       1);
    122 
    123   // Trim off the end using TrimRange() to ensure end index is exclusive.
    124   buffer->TrimRange(buffer->frame_count() - trim_length, buffer->frame_count());
    125   EXPECT_EQ(frames - 5 * trim_length, buffer->frame_count());
    126   EXPECT_EQ(timestamp + trim_duration, buffer->timestamp());
    127   EXPECT_EQ(duration - 5 * trim_duration, buffer->duration());
    128   bus->Zero();
    129   buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get());
    130   VerifyBus(bus.get(), trim_start, trim_length, 1);
    131   VerifyBusWithOffset(bus.get(),
    132                       trim_start,
    133                       buffer->frame_count() - trim_start,
    134                       trim_length,
    135                       trim_length * 2,
    136                       1);
    137 
    138   // Trim off the start using TrimRange() to ensure start index is inclusive.
    139   buffer->TrimRange(0, trim_length);
    140   trim_start -= trim_length;
    141   EXPECT_EQ(frames - 6 * trim_length, buffer->frame_count());
    142   EXPECT_EQ(timestamp + trim_duration, buffer->timestamp());
    143   EXPECT_EQ(duration - 6 * trim_duration, buffer->duration());
    144   bus->Zero();
    145   buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get());
    146   VerifyBus(bus.get(), trim_start, 2 * trim_length, 1);
    147   VerifyBusWithOffset(bus.get(),
    148                       trim_start,
    149                       buffer->frame_count() - trim_start,
    150                       trim_length * 2,
    151                       trim_length * 2,
    152                       1);
    153 }
    154 
    155 TEST(AudioBufferTest, CopyFrom) {
    156   const ChannelLayout kChannelLayout = CHANNEL_LAYOUT_MONO;
    157   scoped_refptr<AudioBuffer> original_buffer =
    158       MakeAudioBuffer<uint8>(kSampleFormatU8,
    159                              kChannelLayout,
    160                              ChannelLayoutToChannelCount(kChannelLayout),
    161                              kSampleRate,
    162                              1,
    163                              1,
    164                              kSampleRate / 100,
    165                              base::TimeDelta());
    166   scoped_refptr<AudioBuffer> new_buffer =
    167       AudioBuffer::CopyFrom(kSampleFormatU8,
    168                             original_buffer->channel_layout(),
    169                             original_buffer->channel_count(),
    170                             original_buffer->sample_rate(),
    171                             original_buffer->frame_count(),
    172                             &original_buffer->channel_data()[0],
    173                             original_buffer->timestamp());
    174   EXPECT_EQ(original_buffer->frame_count(), new_buffer->frame_count());
    175   EXPECT_EQ(original_buffer->timestamp(), new_buffer->timestamp());
    176   EXPECT_EQ(original_buffer->duration(), new_buffer->duration());
    177   EXPECT_EQ(original_buffer->sample_rate(), new_buffer->sample_rate());
    178   EXPECT_EQ(original_buffer->channel_count(), new_buffer->channel_count());
    179   EXPECT_EQ(original_buffer->channel_layout(), new_buffer->channel_layout());
    180   EXPECT_FALSE(original_buffer->end_of_stream());
    181 }
    182 
    183 TEST(AudioBufferTest, CreateEOSBuffer) {
    184   scoped_refptr<AudioBuffer> buffer = AudioBuffer::CreateEOSBuffer();
    185   EXPECT_TRUE(buffer->end_of_stream());
    186 }
    187 
    188 TEST(AudioBufferTest, FrameSize) {
    189   const uint8 kTestData[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
    190                               15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
    191                               27, 28, 29, 30, 31 };
    192   const base::TimeDelta kTimestamp = base::TimeDelta::FromMicroseconds(1337);
    193 
    194   const uint8* const data[] = { kTestData };
    195   scoped_refptr<AudioBuffer> buffer =
    196       AudioBuffer::CopyFrom(kSampleFormatU8,
    197                             CHANNEL_LAYOUT_STEREO,
    198                             2,
    199                             kSampleRate,
    200                             16,
    201                             data,
    202                             kTimestamp);
    203   EXPECT_EQ(16, buffer->frame_count());  // 2 channels of 8-bit data
    204 
    205   buffer = AudioBuffer::CopyFrom(kSampleFormatF32,
    206                                  CHANNEL_LAYOUT_4_0,
    207                                  4,
    208                                  kSampleRate,
    209                                  2,
    210                                  data,
    211                                  kTimestamp);
    212   EXPECT_EQ(2, buffer->frame_count());  // now 4 channels of 32-bit data
    213 }
    214 
    215 TEST(AudioBufferTest, ReadU8) {
    216   const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0;
    217   const int channels = ChannelLayoutToChannelCount(channel_layout);
    218   const int frames = 10;
    219   const base::TimeDelta start_time;
    220   scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<uint8>(kSampleFormatU8,
    221                                                              channel_layout,
    222                                                              channels,
    223                                                              kSampleRate,
    224                                                              128,
    225                                                              1,
    226                                                              frames,
    227                                                              start_time);
    228   scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames);
    229   buffer->ReadFrames(frames, 0, 0, bus.get());
    230   VerifyBus(bus.get(), frames, 0, 1.0f / 127.0f);
    231 
    232   // Now read the same data one frame at a time.
    233   bus->Zero();
    234   for (int i = 0; i < frames; ++i)
    235     buffer->ReadFrames(1, i, i, bus.get());
    236   VerifyBus(bus.get(), frames, 0, 1.0f / 127.0f);
    237 }
    238 
    239 TEST(AudioBufferTest, ReadS16) {
    240   const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO;
    241   const int channels = ChannelLayoutToChannelCount(channel_layout);
    242   const int frames = 10;
    243   const base::TimeDelta start_time;
    244   scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<int16>(kSampleFormatS16,
    245                                                              channel_layout,
    246                                                              channels,
    247                                                              kSampleRate,
    248                                                              1,
    249                                                              1,
    250                                                              frames,
    251                                                              start_time);
    252   scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames);
    253   buffer->ReadFrames(frames, 0, 0, bus.get());
    254   VerifyBus(bus.get(), frames, 1.0f / kint16max, 1.0f / kint16max);
    255 
    256   // Now read the same data one frame at a time.
    257   bus->Zero();
    258   for (int i = 0; i < frames; ++i)
    259     buffer->ReadFrames(1, i, i, bus.get());
    260   VerifyBus(bus.get(), frames, 1.0f / kint16max, 1.0f / kint16max);
    261 }
    262 
    263 TEST(AudioBufferTest, ReadS32) {
    264   const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO;
    265   const int channels = ChannelLayoutToChannelCount(channel_layout);
    266   const int frames = 20;
    267   const base::TimeDelta start_time;
    268   scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<int32>(kSampleFormatS32,
    269                                                              channel_layout,
    270                                                              channels,
    271                                                              kSampleRate,
    272                                                              1,
    273                                                              1,
    274                                                              frames,
    275                                                              start_time);
    276   scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames);
    277   buffer->ReadFrames(frames, 0, 0, bus.get());
    278   VerifyBus(bus.get(), frames, 1.0f / kint32max, 1.0f / kint32max);
    279 
    280   // Read second 10 frames.
    281   bus->Zero();
    282   buffer->ReadFrames(10, 10, 0, bus.get());
    283   VerifyBus(bus.get(), 10, 11.0f / kint32max, 1.0f / kint32max);
    284 }
    285 
    286 TEST(AudioBufferTest, ReadF32) {
    287   const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO;
    288   const int channels = ChannelLayoutToChannelCount(channel_layout);
    289   const int frames = 20;
    290   const base::TimeDelta start_time;
    291   scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<float>(kSampleFormatF32,
    292                                                              channel_layout,
    293                                                              channels,
    294                                                              kSampleRate,
    295                                                              1.0f,
    296                                                              1.0f,
    297                                                              frames,
    298                                                              start_time);
    299   scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames);
    300   buffer->ReadFrames(10, 0, 0, bus.get());
    301   VerifyBus(bus.get(), 10, 1, 1);
    302 
    303   // Read second 10 frames.
    304   bus->Zero();
    305   buffer->ReadFrames(10, 10, 0, bus.get());
    306   VerifyBus(bus.get(), 10, 11, 1);
    307 }
    308 
    309 TEST(AudioBufferTest, ReadS16Planar) {
    310   const ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO;
    311   const int channels = ChannelLayoutToChannelCount(channel_layout);
    312   const int frames = 20;
    313   const base::TimeDelta start_time;
    314   scoped_refptr<AudioBuffer> buffer =
    315       MakeAudioBuffer<int16>(kSampleFormatPlanarS16,
    316                              channel_layout,
    317                              channels,
    318                              kSampleRate,
    319                              1,
    320                              1,
    321                              frames,
    322                              start_time);
    323   scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames);
    324   buffer->ReadFrames(10, 0, 0, bus.get());
    325   VerifyBus(bus.get(), 10, 1.0f / kint16max, 1.0f / kint16max);
    326 
    327   // Read all the frames backwards, one by one. ch[0] should be 20, 19, ...
    328   bus->Zero();
    329   for (int i = frames - 1; i >= 0; --i)
    330     buffer->ReadFrames(1, i, i, bus.get());
    331   VerifyBus(bus.get(), frames, 1.0f / kint16max, 1.0f / kint16max);
    332 
    333   // Read 0 frames with different offsets. Existing data in AudioBus should be
    334   // unchanged.
    335   buffer->ReadFrames(0, 0, 0, bus.get());
    336   VerifyBus(bus.get(), frames, 1.0f / kint16max, 1.0f / kint16max);
    337   buffer->ReadFrames(0, 0, 10, bus.get());
    338   VerifyBus(bus.get(), frames, 1.0f / kint16max, 1.0f / kint16max);
    339   buffer->ReadFrames(0, 10, 0, bus.get());
    340   VerifyBus(bus.get(), frames, 1.0f / kint16max, 1.0f / kint16max);
    341 }
    342 
    343 TEST(AudioBufferTest, ReadF32Planar) {
    344   const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0;
    345   const int channels = ChannelLayoutToChannelCount(channel_layout);
    346   const int frames = 100;
    347   const base::TimeDelta start_time;
    348   scoped_refptr<AudioBuffer> buffer =
    349       MakeAudioBuffer<float>(kSampleFormatPlanarF32,
    350                              channel_layout,
    351                              channels,
    352                              kSampleRate,
    353                              1.0f,
    354                              1.0f,
    355                              frames,
    356                              start_time);
    357 
    358   // Read all 100 frames from the buffer. F32 is planar, so ch[0] should be 1,
    359   // 2, 3, 4, ..., ch[1] should be 101, 102, 103, ..., and so on for all 4
    360   // channels.
    361   scoped_ptr<AudioBus> bus = AudioBus::Create(channels, 100);
    362   buffer->ReadFrames(frames, 0, 0, bus.get());
    363   VerifyBus(bus.get(), frames, 1, 1);
    364 
    365   // Now read 20 frames from the middle of the buffer.
    366   bus->Zero();
    367   buffer->ReadFrames(20, 50, 0, bus.get());
    368   VerifyBus(bus.get(), 20, 51, 1);
    369 }
    370 
    371 TEST(AudioBufferTest, EmptyBuffer) {
    372   const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0;
    373   const int channels = ChannelLayoutToChannelCount(channel_layout);
    374   const int frames = kSampleRate / 100;
    375   const base::TimeDelta start_time;
    376   scoped_refptr<AudioBuffer> buffer = AudioBuffer::CreateEmptyBuffer(
    377       channel_layout, channels, kSampleRate, frames, start_time);
    378   EXPECT_EQ(frames, buffer->frame_count());
    379   EXPECT_EQ(start_time, buffer->timestamp());
    380   EXPECT_EQ(base::TimeDelta::FromMilliseconds(10), buffer->duration());
    381   EXPECT_FALSE(buffer->end_of_stream());
    382 
    383   // Read all 100 frames from the buffer. All data should be 0.
    384   scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames);
    385   buffer->ReadFrames(frames, 0, 0, bus.get());
    386   VerifyBus(bus.get(), frames, 0, 0);
    387 }
    388 
    389 TEST(AudioBufferTest, Trim) {
    390   const ChannelLayout channel_layout = CHANNEL_LAYOUT_4_0;
    391   const int channels = ChannelLayoutToChannelCount(channel_layout);
    392   const int frames = kSampleRate / 10;
    393   const base::TimeDelta start_time;
    394   const base::TimeDelta duration = base::TimeDelta::FromMilliseconds(100);
    395   scoped_refptr<AudioBuffer> buffer =
    396       MakeAudioBuffer<float>(kSampleFormatPlanarF32,
    397                              channel_layout,
    398                              channels,
    399                              kSampleRate,
    400                              0.0f,
    401                              1.0f,
    402                              frames,
    403                              start_time);
    404   EXPECT_EQ(frames, buffer->frame_count());
    405   EXPECT_EQ(start_time, buffer->timestamp());
    406   EXPECT_EQ(duration, buffer->duration());
    407 
    408   const int ten_ms_of_frames = kSampleRate / 100;
    409   const base::TimeDelta ten_ms = base::TimeDelta::FromMilliseconds(10);
    410 
    411   scoped_ptr<AudioBus> bus = AudioBus::Create(channels, frames);
    412   buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get());
    413   VerifyBus(bus.get(), buffer->frame_count(), 0.0f, 1.0f);
    414 
    415   // Trim off 10ms of frames from the start.
    416   buffer->TrimStart(ten_ms_of_frames);
    417   EXPECT_EQ(start_time + ten_ms, buffer->timestamp());
    418   EXPECT_EQ(frames - ten_ms_of_frames, buffer->frame_count());
    419   EXPECT_EQ(duration - ten_ms, buffer->duration());
    420   buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get());
    421   VerifyBus(bus.get(), buffer->frame_count(), ten_ms_of_frames, 1.0f);
    422 
    423   // Trim off 10ms of frames from the end.
    424   buffer->TrimEnd(ten_ms_of_frames);
    425   EXPECT_EQ(start_time + ten_ms, buffer->timestamp());
    426   EXPECT_EQ(frames - 2 * ten_ms_of_frames, buffer->frame_count());
    427   EXPECT_EQ(duration - 2 * ten_ms, buffer->duration());
    428   buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get());
    429   VerifyBus(bus.get(), buffer->frame_count(), ten_ms_of_frames, 1.0f);
    430 
    431   // Trim off 40ms more from the start.
    432   buffer->TrimStart(4 * ten_ms_of_frames);
    433   EXPECT_EQ(start_time + 5 * ten_ms, buffer->timestamp());
    434   EXPECT_EQ(frames - 6 * ten_ms_of_frames, buffer->frame_count());
    435   EXPECT_EQ(duration - 6 * ten_ms, buffer->duration());
    436   buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get());
    437   VerifyBus(bus.get(), buffer->frame_count(), 5 * ten_ms_of_frames, 1.0f);
    438 
    439   // Trim off the final 40ms from the end.
    440   buffer->TrimEnd(4 * ten_ms_of_frames);
    441   EXPECT_EQ(0, buffer->frame_count());
    442   EXPECT_EQ(start_time + 5 * ten_ms, buffer->timestamp());
    443   EXPECT_EQ(base::TimeDelta(), buffer->duration());
    444 }
    445 
    446 TEST(AudioBufferTest, TrimRangePlanar) {
    447   TrimRangeTest(kSampleFormatPlanarF32);
    448 }
    449 
    450 TEST(AudioBufferTest, TrimRangeInterleaved) {
    451   TrimRangeTest(kSampleFormatF32);
    452 }
    453 
    454 }  // namespace media
    455