2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
11 #ifndef WEBRTC_MODULES_DESKTOP_CAPTURE_DIFFER_H_
12 #define WEBRTC_MODULES_DESKTOP_CAPTURE_DIFFER_H_
16 #include "webrtc/modules/desktop_capture/desktop_region.h"
17 #include "webrtc/system_wrappers/interface/scoped_ptr.h"
21 typedef uint8_t DiffInfo;
23 // TODO(sergeyu): Simplify differ now that we are working with DesktopRegion.
24 // diff_info_ should no longer be needed, as we can put our data directly into
25 // the region that we are calculating.
26 // http://crbug.com/92379
27 // TODO(sergeyu): Rename this class to something more sensible, e.g.
28 // ScreenCaptureFrameDifferencer.
31 // Create a differ that operates on bitmaps with the specified width, height
32 // and bytes_per_pixel.
33 Differ(int width, int height, int bytes_per_pixel, int stride);
36 int width() { return width_; }
37 int height() { return height_; }
38 int bytes_per_pixel() { return bytes_per_pixel_; }
39 int bytes_per_row() { return bytes_per_row_; }
41 // Given the previous and current screen buffer, calculate the dirty region
42 // that encloses all of the changed pixels in the new screen.
43 void CalcDirtyRegion(const void* prev_buffer, const void* curr_buffer,
44 DesktopRegion* region);
47 // Allow tests to access our private parts.
48 friend class DifferTest;
50 // Identify all of the blocks that contain changed pixels.
51 void MarkDirtyBlocks(const void* prev_buffer, const void* curr_buffer);
53 // After the dirty blocks have been identified, this routine merges adjacent
54 // blocks into a region.
55 // The goal is to minimize the region that covers the dirty blocks.
56 void MergeBlocks(DesktopRegion* region);
58 // Check for diffs in upper-left portion of the block. The size of the portion
59 // to check is specified by the |width| and |height| values.
60 // Note that if we force the capturer to always return images whose width and
61 // height are multiples of kBlockSize, then this will never be called.
62 DiffInfo DiffPartialBlock(const uint8_t* prev_buffer,
63 const uint8_t* curr_buffer,
65 int width, int height);
67 // Dimensions of screen.
71 // Number of bytes for each pixel in source and dest bitmap.
72 // (Yes, they must match.)
75 // Number of bytes in each row of the image (AKA: stride).
78 // Diff information for each block in the image.
79 scoped_ptr<DiffInfo[]> diff_info_;
81 // Dimensions and total size of diff info array.
83 int diff_info_height_;
86 DISALLOW_COPY_AND_ASSIGN(Differ);
91 #endif // WEBRTC_MODULES_DESKTOP_CAPTURE_DIFFER_H_