blob: 8edce80b4efa0543ea781a3730c0fb35ed5c5fad [file] [log] [blame]
sergeyu@chromium.org3d34f662013-06-04 18:51:23 +00001/*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 *
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.
9 */
10
11#ifndef WEBRTC_MODULES_DESKTOP_CAPTURE_DIFFER_H_
12#define WEBRTC_MODULES_DESKTOP_CAPTURE_DIFFER_H_
13
14#include <vector>
15
16#include "webrtc/modules/desktop_capture/desktop_region.h"
17#include "webrtc/system_wrappers/interface/scoped_ptr.h"
18
19namespace webrtc {
20
21typedef uint8_t DiffInfo;
22
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.
29class Differ {
30 public:
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);
34 ~Differ();
35
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_; }
40
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);
45
46 private:
47 // Allow tests to access our private parts.
48 friend class DifferTest;
49
50 // Identify all of the blocks that contain changed pixels.
51 void MarkDirtyBlocks(const void* prev_buffer, const void* curr_buffer);
52
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);
57
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,
64 int stride,
65 int width, int height);
66
67 // Dimensions of screen.
68 int width_;
69 int height_;
70
71 // Number of bytes for each pixel in source and dest bitmap.
72 // (Yes, they must match.)
73 int bytes_per_pixel_;
74
75 // Number of bytes in each row of the image (AKA: stride).
76 int bytes_per_row_;
77
78 // Diff information for each block in the image.
79 scoped_array<DiffInfo> diff_info_;
80
81 // Dimensions and total size of diff info array.
82 int diff_info_width_;
83 int diff_info_height_;
84 int diff_info_size_;
85
86 DISALLOW_COPY_AND_ASSIGN(Differ);
87};
88
89} // namespace webrtc
90
91#endif // WEBRTC_MODULES_DESKTOP_CAPTURE_DIFFER_H_