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