Home | History | Annotate | Download | only in desktop_capture
      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_
     92