Upstream version 11.40.277.0
[platform/framework/web/crosswalk.git] / src / third_party / webrtc / modules / desktop_capture / differ.h
1 /*
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
19 namespace webrtc {
20
21 typedef 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.
29 class 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_ptr<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_