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