Home | History | Annotate | Download | only in desktop_capture
      1 /*
      2  *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #include "testing/gmock/include/gmock/gmock.h"
     12 #include "webrtc/modules/desktop_capture/differ_block.h"
     13 #include "webrtc/system_wrappers/interface/ref_count.h"
     14 
     15 namespace webrtc {
     16 
     17 // Run 900 times to mimic 1280x720.
     18 // TODO(fbarchard): Remove benchmark once performance is non-issue.
     19 static const int kTimesToRun = 900;
     20 
     21 static void GenerateData(uint8_t* data, int size) {
     22   for (int i = 0; i < size; ++i) {
     23     data[i] = i;
     24   }
     25 }
     26 
     27 // Memory buffer large enough for 2 blocks aligned to 16 bytes.
     28 static const int kSizeOfBlock = kBlockSize * kBlockSize * kBytesPerPixel;
     29 uint8_t block_buffer[kSizeOfBlock * 2 + 16];
     30 
     31 void PrepareBuffers(uint8_t* &block1, uint8_t* &block2) {
     32   block1 = reinterpret_cast<uint8_t*>
     33       ((reinterpret_cast<uintptr_t>(&block_buffer[0]) + 15) & ~15);
     34   GenerateData(block1, kSizeOfBlock);
     35   block2 = block1 + kSizeOfBlock;
     36   memcpy(block2, block1, kSizeOfBlock);
     37 }
     38 
     39 TEST(BlockDifferenceTestSame, BlockDifference) {
     40   uint8_t* block1;
     41   uint8_t* block2;
     42   PrepareBuffers(block1, block2);
     43 
     44   // These blocks should match.
     45   for (int i = 0; i < kTimesToRun; ++i) {
     46     int result = BlockDifference(block1, block2, kBlockSize * kBytesPerPixel);
     47     EXPECT_EQ(0, result);
     48   }
     49 }
     50 
     51 TEST(BlockDifferenceTestLast, BlockDifference) {
     52   uint8_t* block1;
     53   uint8_t* block2;
     54   PrepareBuffers(block1, block2);
     55   block2[kSizeOfBlock-2] += 1;
     56 
     57   for (int i = 0; i < kTimesToRun; ++i) {
     58     int result = BlockDifference(block1, block2, kBlockSize * kBytesPerPixel);
     59     EXPECT_EQ(1, result);
     60   }
     61 }
     62 
     63 TEST(BlockDifferenceTestMid, BlockDifference) {
     64   uint8_t* block1;
     65   uint8_t* block2;
     66   PrepareBuffers(block1, block2);
     67   block2[kSizeOfBlock/2+1] += 1;
     68 
     69   for (int i = 0; i < kTimesToRun; ++i) {
     70     int result = BlockDifference(block1, block2, kBlockSize * kBytesPerPixel);
     71     EXPECT_EQ(1, result);
     72   }
     73 }
     74 
     75 TEST(BlockDifferenceTestFirst, BlockDifference) {
     76   uint8_t* block1;
     77   uint8_t* block2;
     78   PrepareBuffers(block1, block2);
     79   block2[0] += 1;
     80 
     81   for (int i = 0; i < kTimesToRun; ++i) {
     82     int result = BlockDifference(block1, block2, kBlockSize * kBytesPerPixel);
     83     EXPECT_EQ(1, result);
     84   }
     85 }
     86 
     87 }  // namespace webrtc
     88