16c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org/*
26c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
36c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org *
46c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org *  Use of this source code is governed by a BSD-style license
56c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org *  that can be found in the LICENSE file in the root of the source
66c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org *  tree. An additional intellectual property rights grant can be found
76c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org *  in the file PATENTS.  All contributing project authors may
86c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org *  be found in the AUTHORS file in the root of the source tree.
96c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org */
106c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
116c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#include "testing/gmock/include/gmock/gmock.h"
126c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#include "webrtc/modules/desktop_capture/differ_block.h"
136c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#include "webrtc/system_wrappers/interface/ref_count.h"
146c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
156c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgnamespace webrtc {
166c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
176c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org// Run 900 times to mimic 1280x720.
186c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org// TODO(fbarchard): Remove benchmark once performance is non-issue.
196c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgstatic const int kTimesToRun = 900;
206c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
216c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgstatic void GenerateData(uint8_t* data, int size) {
226c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  for (int i = 0; i < size; ++i) {
236c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org    data[i] = i;
246c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  }
256c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org}
266c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
276c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org// Memory buffer large enough for 2 blocks aligned to 16 bytes.
286c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgstatic const int kSizeOfBlock = kBlockSize * kBlockSize * kBytesPerPixel;
296c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orguint8_t block_buffer[kSizeOfBlock * 2 + 16];
306c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
316c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgvoid PrepareBuffers(uint8_t* &block1, uint8_t* &block2) {
326c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  block1 = reinterpret_cast<uint8_t*>
336c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org      ((reinterpret_cast<uintptr_t>(&block_buffer[0]) + 15) & ~15);
346c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  GenerateData(block1, kSizeOfBlock);
356c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  block2 = block1 + kSizeOfBlock;
366c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  memcpy(block2, block1, kSizeOfBlock);
376c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org}
386c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
396c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgTEST(BlockDifferenceTestSame, BlockDifference) {
406c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  uint8_t* block1;
416c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  uint8_t* block2;
426c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  PrepareBuffers(block1, block2);
436c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
446c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // These blocks should match.
456c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  for (int i = 0; i < kTimesToRun; ++i) {
466c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org    int result = BlockDifference(block1, block2, kBlockSize * kBytesPerPixel);
476c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org    EXPECT_EQ(0, result);
486c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  }
496c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org}
506c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
516c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgTEST(BlockDifferenceTestLast, BlockDifference) {
526c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  uint8_t* block1;
536c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  uint8_t* block2;
546c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  PrepareBuffers(block1, block2);
556c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  block2[kSizeOfBlock-2] += 1;
566c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
576c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  for (int i = 0; i < kTimesToRun; ++i) {
586c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org    int result = BlockDifference(block1, block2, kBlockSize * kBytesPerPixel);
596c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org    EXPECT_EQ(1, result);
606c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  }
616c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org}
626c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
636c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgTEST(BlockDifferenceTestMid, BlockDifference) {
646c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  uint8_t* block1;
656c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  uint8_t* block2;
666c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  PrepareBuffers(block1, block2);
676c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  block2[kSizeOfBlock/2+1] += 1;
686c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
696c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  for (int i = 0; i < kTimesToRun; ++i) {
706c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org    int result = BlockDifference(block1, block2, kBlockSize * kBytesPerPixel);
716c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org    EXPECT_EQ(1, result);
726c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  }
736c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org}
746c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
756c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgTEST(BlockDifferenceTestFirst, BlockDifference) {
766c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  uint8_t* block1;
776c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  uint8_t* block2;
786c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  PrepareBuffers(block1, block2);
796c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  block2[0] += 1;
806c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
816c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  for (int i = 0; i < kTimesToRun; ++i) {
826c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org    int result = BlockDifference(block1, block2, kBlockSize * kBytesPerPixel);
836c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org    EXPECT_EQ(1, result);
846c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  }
856c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org}
866c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
876c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org}  // namespace webrtc
88