13d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org/*
23d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
33d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org *
43d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org *  Use of this source code is governed by a BSD-style license
53d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org *  that can be found in the LICENSE file in the root of the source
63d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org *  tree. An additional intellectual property rights grant can be found
73d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org *  in the file PATENTS.  All contributing project authors may
83d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org *  be found in the AUTHORS file in the root of the source tree.
93d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org */
103d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org
113d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org#include "testing/gmock/include/gmock/gmock.h"
123d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org#include "webrtc/modules/desktop_capture/differ_block.h"
1398f53510b222f71fdd8b799b2f33737ceeb28c61Henrik Kjellander#include "webrtc/system_wrappers/include/ref_count.h"
143d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org
153d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.orgnamespace webrtc {
163d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org
173d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org// Run 900 times to mimic 1280x720.
183d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org// TODO(fbarchard): Remove benchmark once performance is non-issue.
193d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.orgstatic const int kTimesToRun = 900;
203d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org
213d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.orgstatic void GenerateData(uint8_t* data, int size) {
223d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  for (int i = 0; i < size; ++i) {
233d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org    data[i] = i;
243d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  }
253d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org}
263d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org
273d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org// Memory buffer large enough for 2 blocks aligned to 16 bytes.
283d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.orgstatic const int kSizeOfBlock = kBlockSize * kBlockSize * kBytesPerPixel;
293d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.orguint8_t block_buffer[kSizeOfBlock * 2 + 16];
303d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org
313d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.orgvoid PrepareBuffers(uint8_t* &block1, uint8_t* &block2) {
323d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  block1 = reinterpret_cast<uint8_t*>
333d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org      ((reinterpret_cast<uintptr_t>(&block_buffer[0]) + 15) & ~15);
343d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  GenerateData(block1, kSizeOfBlock);
353d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  block2 = block1 + kSizeOfBlock;
363d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  memcpy(block2, block1, kSizeOfBlock);
373d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org}
383d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org
393d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.orgTEST(BlockDifferenceTestSame, BlockDifference) {
403d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  uint8_t* block1;
413d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  uint8_t* block2;
423d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  PrepareBuffers(block1, block2);
433d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org
443d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  // These blocks should match.
453d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  for (int i = 0; i < kTimesToRun; ++i) {
463d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org    int result = BlockDifference(block1, block2, kBlockSize * kBytesPerPixel);
473d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org    EXPECT_EQ(0, result);
483d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  }
493d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org}
503d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org
513d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.orgTEST(BlockDifferenceTestLast, BlockDifference) {
523d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  uint8_t* block1;
533d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  uint8_t* block2;
543d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  PrepareBuffers(block1, block2);
553d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  block2[kSizeOfBlock-2] += 1;
563d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org
573d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  for (int i = 0; i < kTimesToRun; ++i) {
583d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org    int result = BlockDifference(block1, block2, kBlockSize * kBytesPerPixel);
593d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org    EXPECT_EQ(1, result);
603d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  }
613d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org}
623d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org
633d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.orgTEST(BlockDifferenceTestMid, BlockDifference) {
643d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  uint8_t* block1;
653d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  uint8_t* block2;
663d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  PrepareBuffers(block1, block2);
673d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  block2[kSizeOfBlock/2+1] += 1;
683d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org
693d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  for (int i = 0; i < kTimesToRun; ++i) {
703d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org    int result = BlockDifference(block1, block2, kBlockSize * kBytesPerPixel);
713d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org    EXPECT_EQ(1, result);
723d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  }
733d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org}
743d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org
753d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.orgTEST(BlockDifferenceTestFirst, BlockDifference) {
763d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  uint8_t* block1;
773d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  uint8_t* block2;
783d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  PrepareBuffers(block1, block2);
793d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  block2[0] += 1;
803d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org
813d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  for (int i = 0; i < kTimesToRun; ++i) {
823d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org    int result = BlockDifference(block1, block2, kBlockSize * kBytesPerPixel);
833d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org    EXPECT_EQ(1, result);
843d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org  }
853d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org}
863d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org
873d34f66292ad4d3950d94026d08c3659880d30e2sergeyu@chromium.org}  // namespace webrtc
88