Make the BlockDifference() functions return DiffInfo as their callers expect.
This prevents the compiler from warning about possible type truncations at the
callsites.
BUG=chromium:81439
TEST=none
R=wez@chromium.org
Review URL: https://webrtc-codereview.appspot.com/41059004
Cr-Commit-Position: refs/heads/master@{#9211}
diff --git a/webrtc/modules/desktop_capture/differ.cc b/webrtc/modules/desktop_capture/differ.cc
index 5a347a7..0f53b78 100644
--- a/webrtc/modules/desktop_capture/differ.cc
+++ b/webrtc/modules/desktop_capture/differ.cc
@@ -28,13 +28,14 @@
// One additional row/column is added as a boundary on the right & bottom.
diff_info_width_ = ((width_ + kBlockSize - 1) / kBlockSize) + 1;
diff_info_height_ = ((height_ + kBlockSize - 1) / kBlockSize) + 1;
- diff_info_size_ = diff_info_width_ * diff_info_height_ * sizeof(DiffInfo);
- diff_info_.reset(new DiffInfo[diff_info_size_]);
+ diff_info_size_ = diff_info_width_ * diff_info_height_ * sizeof(bool);
+ diff_info_.reset(new bool[diff_info_size_]);
}
Differ::~Differ() {}
-void Differ::CalcDirtyRegion(const void* prev_buffer, const void* curr_buffer,
+void Differ::CalcDirtyRegion(const uint8_t* prev_buffer,
+ const uint8_t* curr_buffer,
DesktopRegion* region) {
// Identify all the blocks that contain changed pixels.
MarkDirtyBlocks(prev_buffer, curr_buffer);
@@ -44,7 +45,8 @@
MergeBlocks(region);
}
-void Differ::MarkDirtyBlocks(const void* prev_buffer, const void* curr_buffer) {
+void Differ::MarkDirtyBlocks(const uint8_t* prev_buffer,
+ const uint8_t* curr_buffer) {
memset(diff_info_.get(), 0, diff_info_size_);
// Calc number of full blocks.
@@ -60,18 +62,16 @@
// Offset from the start of one block-row to the next.
int block_y_stride = (width_ * bytes_per_pixel_) * kBlockSize;
// Offset from the start of one diff_info row to the next.
- int diff_info_stride = diff_info_width_ * sizeof(DiffInfo);
+ int diff_info_stride = diff_info_width_ * sizeof(bool);
- const uint8_t* prev_block_row_start =
- static_cast<const uint8_t*>(prev_buffer);
- const uint8_t* curr_block_row_start =
- static_cast<const uint8_t*>(curr_buffer);
- DiffInfo* diff_info_row_start = static_cast<DiffInfo*>(diff_info_.get());
+ const uint8_t* prev_block_row_start = prev_buffer;
+ const uint8_t* curr_block_row_start = curr_buffer;
+ bool* diff_info_row_start = diff_info_.get();
for (int y = 0; y < y_full_blocks; y++) {
const uint8_t* prev_block = prev_block_row_start;
const uint8_t* curr_block = curr_block_row_start;
- DiffInfo* diff_info = diff_info_row_start;
+ bool* diff_info = diff_info_row_start;
for (int x = 0; x < x_full_blocks; x++) {
// Mark this block as being modified so that it gets incorporated into
@@ -79,15 +79,15 @@
*diff_info = BlockDifference(prev_block, curr_block, bytes_per_row_);
prev_block += block_x_offset;
curr_block += block_x_offset;
- diff_info += sizeof(DiffInfo);
+ diff_info += sizeof(bool);
}
// If there is a partial column at the end, handle it.
// This condition should rarely, if ever, occur.
if (partial_column_width != 0) {
- *diff_info = DiffPartialBlock(prev_block, curr_block, bytes_per_row_,
- partial_column_width, kBlockSize);
- diff_info += sizeof(DiffInfo);
+ *diff_info = !PartialBlocksEqual(prev_block, curr_block, bytes_per_row_,
+ partial_column_width, kBlockSize);
+ diff_info += sizeof(bool);
}
// Update pointers for next row.
@@ -102,74 +102,75 @@
if (partial_row_height != 0) {
const uint8_t* prev_block = prev_block_row_start;
const uint8_t* curr_block = curr_block_row_start;
- DiffInfo* diff_info = diff_info_row_start;
+ bool* diff_info = diff_info_row_start;
for (int x = 0; x < x_full_blocks; x++) {
- *diff_info = DiffPartialBlock(prev_block, curr_block,
- bytes_per_row_,
- kBlockSize, partial_row_height);
+ *diff_info = !PartialBlocksEqual(prev_block, curr_block,
+ bytes_per_row_,
+ kBlockSize, partial_row_height);
prev_block += block_x_offset;
curr_block += block_x_offset;
- diff_info += sizeof(DiffInfo);
+ diff_info += sizeof(bool);
}
if (partial_column_width != 0) {
- *diff_info = DiffPartialBlock(prev_block, curr_block, bytes_per_row_,
- partial_column_width, partial_row_height);
- diff_info += sizeof(DiffInfo);
+ *diff_info = !PartialBlocksEqual(prev_block, curr_block, bytes_per_row_,
+ partial_column_width,
+ partial_row_height);
+ diff_info += sizeof(bool);
}
}
}
-DiffInfo Differ::DiffPartialBlock(const uint8_t* prev_buffer,
- const uint8_t* curr_buffer,
- int stride, int width, int height) {
+bool Differ::PartialBlocksEqual(const uint8_t* prev_buffer,
+ const uint8_t* curr_buffer,
+ int stride, int width, int height) {
int width_bytes = width * bytes_per_pixel_;
for (int y = 0; y < height; y++) {
if (memcmp(prev_buffer, curr_buffer, width_bytes) != 0)
- return 1;
+ return false;
prev_buffer += bytes_per_row_;
curr_buffer += bytes_per_row_;
}
- return 0;
+ return true;
}
void Differ::MergeBlocks(DesktopRegion* region) {
region->Clear();
- uint8_t* diff_info_row_start = static_cast<uint8_t*>(diff_info_.get());
- int diff_info_stride = diff_info_width_ * sizeof(DiffInfo);
+ bool* diff_info_row_start = diff_info_.get();
+ int diff_info_stride = diff_info_width_ * sizeof(bool);
for (int y = 0; y < diff_info_height_; y++) {
- uint8_t* diff_info = diff_info_row_start;
+ bool* diff_info = diff_info_row_start;
for (int x = 0; x < diff_info_width_; x++) {
- if (*diff_info != 0) {
+ if (*diff_info) {
// We've found a modified block. Look at blocks to the right and below
// to group this block with as many others as we can.
int left = x * kBlockSize;
int top = y * kBlockSize;
int width = 1;
int height = 1;
- *diff_info = 0;
+ *diff_info = false;
// Group with blocks to the right.
// We can keep looking until we find an unchanged block because we
// have a boundary block which is never marked as having diffs.
- uint8_t* right = diff_info + 1;
+ bool* right = diff_info + 1;
while (*right) {
- *right++ = 0;
+ *right++ = false;
width++;
}
// Group with blocks below.
// The entire width of blocks that we matched above much match for
// each row that we add.
- uint8_t* bottom = diff_info;
+ bool* bottom = diff_info;
bool found_new_row;
do {
found_new_row = true;
bottom += diff_info_stride;
right = bottom;
for (int x2 = 0; x2 < width; x2++) {
- if (*right++ == 0) {
+ if (!*right++) {
found_new_row = false;
}
}
@@ -181,7 +182,7 @@
// try to add these blocks a second time.
right = bottom;
for (int x2 = 0; x2 < width; x2++) {
- *right++ = 0;
+ *right++ = false;
}
}
} while (found_new_row);
diff --git a/webrtc/modules/desktop_capture/differ.h b/webrtc/modules/desktop_capture/differ.h
index d5e21db..224c691 100644
--- a/webrtc/modules/desktop_capture/differ.h
+++ b/webrtc/modules/desktop_capture/differ.h
@@ -18,8 +18,6 @@
namespace webrtc {
-typedef uint8_t DiffInfo;
-
// TODO(sergeyu): Simplify differ now that we are working with DesktopRegion.
// diff_info_ should no longer be needed, as we can put our data directly into
// the region that we are calculating.
@@ -40,7 +38,7 @@
// Given the previous and current screen buffer, calculate the dirty region
// that encloses all of the changed pixels in the new screen.
- void CalcDirtyRegion(const void* prev_buffer, const void* curr_buffer,
+ void CalcDirtyRegion(const uint8_t* prev_buffer, const uint8_t* curr_buffer,
DesktopRegion* region);
private:
@@ -48,21 +46,21 @@
friend class DifferTest;
// Identify all of the blocks that contain changed pixels.
- void MarkDirtyBlocks(const void* prev_buffer, const void* curr_buffer);
+ void MarkDirtyBlocks(const uint8_t* prev_buffer, const uint8_t* curr_buffer);
// After the dirty blocks have been identified, this routine merges adjacent
// blocks into a region.
// The goal is to minimize the region that covers the dirty blocks.
void MergeBlocks(DesktopRegion* region);
- // Check for diffs in upper-left portion of the block. The size of the portion
- // to check is specified by the |width| and |height| values.
+ // Checks whether the upper-left portions of the buffers are equal. The size
+ // of the portion to check is specified by the |width| and |height| values.
// Note that if we force the capturer to always return images whose width and
// height are multiples of kBlockSize, then this will never be called.
- DiffInfo DiffPartialBlock(const uint8_t* prev_buffer,
- const uint8_t* curr_buffer,
- int stride,
- int width, int height);
+ bool PartialBlocksEqual(const uint8_t* prev_buffer,
+ const uint8_t* curr_buffer,
+ int stride,
+ int width, int height);
// Dimensions of screen.
int width_;
@@ -76,7 +74,7 @@
int bytes_per_row_;
// Diff information for each block in the image.
- rtc::scoped_ptr<DiffInfo[]> diff_info_;
+ rtc::scoped_ptr<bool[]> diff_info_;
// Dimensions and total size of diff info array.
int diff_info_width_;
diff --git a/webrtc/modules/desktop_capture/differ_block.cc b/webrtc/modules/desktop_capture/differ_block.cc
index 3d1b229..abae0d6 100644
--- a/webrtc/modules/desktop_capture/differ_block.cc
+++ b/webrtc/modules/desktop_capture/differ_block.cc
@@ -18,22 +18,24 @@
namespace webrtc {
-int BlockDifference_C(const uint8_t* image1,
- const uint8_t* image2,
- int stride) {
+bool BlockDifference_C(const uint8_t* image1,
+ const uint8_t* image2,
+ int stride) {
int width_bytes = kBlockSize * kBytesPerPixel;
for (int y = 0; y < kBlockSize; y++) {
if (memcmp(image1, image2, width_bytes) != 0)
- return 1;
+ return true;
image1 += stride;
image2 += stride;
}
- return 0;
+ return false;
}
-int BlockDifference(const uint8_t* image1, const uint8_t* image2, int stride) {
- static int (*diff_proc)(const uint8_t*, const uint8_t*, int) = NULL;
+bool BlockDifference(const uint8_t* image1,
+ const uint8_t* image2,
+ int stride) {
+ static bool (*diff_proc)(const uint8_t*, const uint8_t*, int) = NULL;
if (!diff_proc) {
#if defined(ARCH_CPU_ARM_FAMILY) || defined(ARCH_CPU_MIPS_FAMILY)
diff --git a/webrtc/modules/desktop_capture/differ_block.h b/webrtc/modules/desktop_capture/differ_block.h
index 2b43f4e..e1d487d 100644
--- a/webrtc/modules/desktop_capture/differ_block.h
+++ b/webrtc/modules/desktop_capture/differ_block.h
@@ -11,7 +11,7 @@
#ifndef WEBRTC_MODULES_DESKTOP_CAPTURE_DIFFER_BLOCK_H_
#define WEBRTC_MODULES_DESKTOP_CAPTURE_DIFFER_BLOCK_H_
-#include "webrtc/typedefs.h"
+#include <stdint.h>
namespace webrtc {
@@ -22,9 +22,11 @@
// Format: BGRA 32 bit.
const int kBytesPerPixel = 4;
-// Low level functions to compare 2 blocks of pixels. Zero means the blocks
-// are identical. One - the blocks are different.
-int BlockDifference(const uint8_t* image1, const uint8_t* image2, int stride);
+// Low level function to compare 2 blocks of pixels of size
+// (kBlockSize, kBlockSize). Returns whether the blocks differ.
+bool BlockDifference(const uint8_t* image1,
+ const uint8_t* image2,
+ int stride);
} // namespace webrtc
diff --git a/webrtc/modules/desktop_capture/differ_block_sse2.cc b/webrtc/modules/desktop_capture/differ_block_sse2.cc
index 7f31bd3..8d35df2 100644
--- a/webrtc/modules/desktop_capture/differ_block_sse2.cc
+++ b/webrtc/modules/desktop_capture/differ_block_sse2.cc
@@ -21,9 +21,9 @@
namespace webrtc {
-extern int BlockDifference_SSE2_W16(const uint8_t* image1,
- const uint8_t* image2,
- int stride) {
+extern bool BlockDifference_SSE2_W16(const uint8_t* image1,
+ const uint8_t* image2,
+ int stride) {
__m128i acc = _mm_setzero_si128();
__m128i v0;
__m128i v1;
@@ -54,16 +54,16 @@
sad = _mm_adds_epu16(sad, acc);
int diff = _mm_cvtsi128_si32(sad);
if (diff)
- return 1;
+ return true;
image1 += stride;
image2 += stride;
}
- return 0;
+ return false;
}
-extern int BlockDifference_SSE2_W32(const uint8_t* image1,
- const uint8_t* image2,
- int stride) {
+extern bool BlockDifference_SSE2_W32(const uint8_t* image1,
+ const uint8_t* image2,
+ int stride) {
__m128i acc = _mm_setzero_si128();
__m128i v0;
__m128i v1;
@@ -110,11 +110,11 @@
sad = _mm_adds_epu16(sad, acc);
int diff = _mm_cvtsi128_si32(sad);
if (diff)
- return 1;
+ return true;
image1 += stride;
image2 += stride;
}
- return 0;
+ return false;
}
} // namespace webrtc
diff --git a/webrtc/modules/desktop_capture/differ_block_sse2.h b/webrtc/modules/desktop_capture/differ_block_sse2.h
index 081e6fa..90426da 100644
--- a/webrtc/modules/desktop_capture/differ_block_sse2.h
+++ b/webrtc/modules/desktop_capture/differ_block_sse2.h
@@ -19,14 +19,14 @@
namespace webrtc {
// Find block difference of dimension 16x16.
-extern int BlockDifference_SSE2_W16(const uint8_t* image1,
- const uint8_t* image2,
- int stride);
+extern bool BlockDifference_SSE2_W16(const uint8_t* image1,
+ const uint8_t* image2,
+ int stride);
// Find block difference of dimension 32x32.
-extern int BlockDifference_SSE2_W32(const uint8_t* image1,
- const uint8_t* image2,
- int stride);
+extern bool BlockDifference_SSE2_W32(const uint8_t* image1,
+ const uint8_t* image2,
+ int stride);
} // namespace webrtc
diff --git a/webrtc/modules/desktop_capture/differ_unittest.cc b/webrtc/modules/desktop_capture/differ_unittest.cc
index 019e952..3b6f859 100644
--- a/webrtc/modules/desktop_capture/differ_unittest.cc
+++ b/webrtc/modules/desktop_capture/differ_unittest.cc
@@ -51,7 +51,7 @@
}
// Here in DifferTest so that tests can access private methods of Differ.
- void MarkDirtyBlocks(const void* prev_buffer, const void* curr_buffer) {
+ void MarkDirtyBlocks(const uint8_t* prev_buffer, const uint8_t* curr_buffer) {
differ_->MarkDirtyBlocks(prev_buffer, curr_buffer);
}
@@ -71,7 +71,7 @@
// Convenience wrapper for Differ's DiffBlock that calculates the appropriate
// offset to the start of the desired block.
- DiffInfo DiffBlock(int block_x, int block_y) {
+ bool DiffBlock(int block_x, int block_y) {
// Offset from upper-left of buffer to upper-left of requested block.
int block_offset = ((block_y * stride_) + (block_x * bytes_per_pixel_))
* kBlockSize;
@@ -114,8 +114,8 @@
}
// Get the value in the |diff_info_| array at (x,y).
- DiffInfo GetDiffInfo(int x, int y) {
- DiffInfo* diff_info = differ_->diff_info_.get();
+ bool GetDiffInfo(int x, int y) {
+ bool* diff_info = differ_->diff_info_.get();
return diff_info[(y * GetDiffInfoWidth()) + x];
}
@@ -134,8 +134,8 @@
return differ_->diff_info_size_;
}
- void SetDiffInfo(int x, int y, const DiffInfo& value) {
- DiffInfo* diff_info = differ_->diff_info_.get();
+ void SetDiffInfo(int x, int y, bool value) {
+ bool* diff_info = differ_->diff_info_.get();
diff_info[(y * GetDiffInfoWidth()) + x] = value;
}
@@ -143,7 +143,7 @@
void MarkBlocks(int x_origin, int y_origin, int width, int height) {
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
- SetDiffInfo(x_origin + x, y_origin + y, 1);
+ SetDiffInfo(x_origin + x, y_origin + y, true);
}
}
}
@@ -240,7 +240,7 @@
// Make sure each block is marked as dirty.
for (int y = 0; y < GetDiffInfoHeight() - 1; y++) {
for (int x = 0; x < GetDiffInfoWidth() - 1; x++) {
- EXPECT_EQ(1, GetDiffInfo(x, y))
+ EXPECT_TRUE(GetDiffInfo(x, y))
<< "when x = " << x << ", and y = " << y;
}
}
@@ -258,23 +258,23 @@
MarkDirtyBlocks(prev_.get(), curr_.get());
// Make sure corresponding blocks are updated.
- EXPECT_EQ(0, GetDiffInfo(0, 0));
- EXPECT_EQ(0, GetDiffInfo(0, 1));
- EXPECT_EQ(1, GetDiffInfo(0, 2));
- EXPECT_EQ(1, GetDiffInfo(1, 0));
- EXPECT_EQ(0, GetDiffInfo(1, 1));
- EXPECT_EQ(0, GetDiffInfo(1, 2));
- EXPECT_EQ(0, GetDiffInfo(2, 0));
- EXPECT_EQ(1, GetDiffInfo(2, 1));
- EXPECT_EQ(0, GetDiffInfo(2, 2));
+ EXPECT_FALSE(GetDiffInfo(0, 0));
+ EXPECT_FALSE(GetDiffInfo(0, 1));
+ EXPECT_TRUE(GetDiffInfo(0, 2));
+ EXPECT_TRUE(GetDiffInfo(1, 0));
+ EXPECT_FALSE(GetDiffInfo(1, 1));
+ EXPECT_FALSE(GetDiffInfo(1, 2));
+ EXPECT_FALSE(GetDiffInfo(2, 0));
+ EXPECT_TRUE(GetDiffInfo(2, 1));
+ EXPECT_FALSE(GetDiffInfo(2, 2));
}
TEST_F(DifferTest, DiffBlock) {
InitDiffer(kScreenWidth, kScreenHeight);
// Verify no differences at start.
- EXPECT_EQ(0, DiffBlock(0, 0));
- EXPECT_EQ(0, DiffBlock(1, 1));
+ EXPECT_FALSE(DiffBlock(0, 0));
+ EXPECT_FALSE(DiffBlock(1, 1));
// Write new data into the 4 corners of the middle block and verify that
// neighboring blocks are not affected.
@@ -283,15 +283,15 @@
WriteBlockPixel(curr_.get(), 1, 1, 0, max, 0xffffff);
WriteBlockPixel(curr_.get(), 1, 1, max, 0, 0xffffff);
WriteBlockPixel(curr_.get(), 1, 1, max, max, 0xffffff);
- EXPECT_EQ(0, DiffBlock(0, 0));
- EXPECT_EQ(0, DiffBlock(0, 1));
- EXPECT_EQ(0, DiffBlock(0, 2));
- EXPECT_EQ(0, DiffBlock(1, 0));
- EXPECT_EQ(1, DiffBlock(1, 1)); // Only this block should change.
- EXPECT_EQ(0, DiffBlock(1, 2));
- EXPECT_EQ(0, DiffBlock(2, 0));
- EXPECT_EQ(0, DiffBlock(2, 1));
- EXPECT_EQ(0, DiffBlock(2, 2));
+ EXPECT_FALSE(DiffBlock(0, 0));
+ EXPECT_FALSE(DiffBlock(0, 1));
+ EXPECT_FALSE(DiffBlock(0, 2));
+ EXPECT_FALSE(DiffBlock(1, 0));
+ EXPECT_TRUE(DiffBlock(1, 1)); // Only this block should change.
+ EXPECT_FALSE(DiffBlock(1, 2));
+ EXPECT_FALSE(DiffBlock(2, 0));
+ EXPECT_FALSE(DiffBlock(2, 1));
+ EXPECT_FALSE(DiffBlock(2, 2));
}
TEST_F(DifferTest, Partial_Setup) {
@@ -328,7 +328,7 @@
// Make sure each block is marked as dirty.
for (int y = 0; y < GetDiffInfoHeight() - 1; y++) {
for (int x = 0; x < GetDiffInfoWidth() - 1; x++) {
- EXPECT_EQ(1, GetDiffInfo(x, y))
+ EXPECT_TRUE(GetDiffInfo(x, y))
<< "when x = " << x << ", and y = " << y;
}
}
@@ -351,18 +351,18 @@
// Make sure last (partial) block in each row/column is marked as dirty.
int x_last = GetDiffInfoWidth() - 2;
for (int y = 0; y < GetDiffInfoHeight() - 1; y++) {
- EXPECT_EQ(1, GetDiffInfo(x_last, y))
+ EXPECT_TRUE(GetDiffInfo(x_last, y))
<< "when x = " << x_last << ", and y = " << y;
}
int y_last = GetDiffInfoHeight() - 2;
for (int x = 0; x < GetDiffInfoWidth() - 1; x++) {
- EXPECT_EQ(1, GetDiffInfo(x, y_last))
+ EXPECT_TRUE(GetDiffInfo(x, y_last))
<< "when x = " << x << ", and y = " << y_last;
}
// All other blocks are clean.
for (int y = 0; y < GetDiffInfoHeight() - 2; y++) {
for (int x = 0; x < GetDiffInfoWidth() - 2; x++) {
- EXPECT_EQ(0, GetDiffInfo(x, y)) << "when x = " << x << ", and y = " << y;
+ EXPECT_FALSE(GetDiffInfo(x, y)) << "when x = " << x << ", and y = " << y;
}
}
}