diff mbox

[FFmpeg-devel,v2,1/1] avdevice/gdigrab: Add use_captureblt option for diable CAPTUREBLT, when useing the bitblt function with CAPTUREBLT it caused the mouse cursor flicker. most time we dont need this flag to capture window

Message ID HK2PR03MB459671B825EBB3C7FD111F10C6500@HK2PR03MB4596.apcprd03.prod.outlook.com
State New
Headers show

Commit Message

fgodtdev@hotmail.com Dec. 17, 2019, 8:15 a.m. UTC
From: FgoDt <fgodtdev@hotmail.com>

Signed-off-by: fgodt <fgodtdev@hotmail.com>
---
 doc/indevs.texi       |  6 ++++++
 libavdevice/gdigrab.c | 10 +++++++++-
 2 files changed, 15 insertions(+), 1 deletion(-)
diff mbox

Patch

diff --git a/doc/indevs.texi b/doc/indevs.texi
index 92bc65be41..43b0bd0465 100644
--- a/doc/indevs.texi
+++ b/doc/indevs.texi
@@ -748,6 +748,12 @@  When capturing a region with @var{video_size}, set the distance from the top edg
 
 Note that the offset calculation is from the top left corner of the primary monitor on Windows. If you have a monitor positioned above your primary monitor, you will need to use a negative @var{offset_y} value to move the region to that monitor.
 
+@item use_captureblt
+When use gdigrab to capture window or desktop, the mouse cursor will flicker.
+Disable CAPTUREBLT FLAG by set value @code{0} to fix cursor flickering. Default value is @code{1}
+
+Note the value @code{1} is essential to capture specific  window
+
 @end table
 
 @section iec61883
diff --git a/libavdevice/gdigrab.c b/libavdevice/gdigrab.c
index f4444406fa..658719e929 100644
--- a/libavdevice/gdigrab.c
+++ b/libavdevice/gdigrab.c
@@ -53,6 +53,8 @@  struct gdigrab {
     int        offset_x;    /**< Capture x offset (private option) */
     int        offset_y;    /**< Capture y offset (private option) */
 
+    int        use_captureblt; /**< Capture gdi window with CAPTUREBLT flag (private option) */
+
     HWND       hwnd;        /**< Handle of the window for the grab */
     HDC        source_hdc;  /**< Source device context */
     HDC        dest_hdc;    /**< Destination, source-compatible DC */
@@ -542,6 +544,8 @@  static int gdigrab_read_packet(AVFormatContext *s1, AVPacket *pkt)
 
     int64_t curtime, delay;
 
+    unsigned long flag = SRCCOPY;
+
     /* Calculate the time of the next frame */
     time_frame += INT64_C(1000000);
 
@@ -570,12 +574,15 @@  static int gdigrab_read_packet(AVFormatContext *s1, AVPacket *pkt)
         return AVERROR(ENOMEM);
     pkt->pts = curtime;
 
+    if(gdigrab->use_captureblt)
+        flag |= CAPTUREBLT;
+
     /* Blit screen grab */
     if (!BitBlt(dest_hdc, 0, 0,
                 clip_rect.right - clip_rect.left,
                 clip_rect.bottom - clip_rect.top,
                 source_hdc,
-                clip_rect.left, clip_rect.top, SRCCOPY | CAPTUREBLT)) {
+                clip_rect.left, clip_rect.top, flag)) {
         WIN32_API_ERROR("Failed to capture image");
         return AVERROR(EIO);
     }
@@ -639,6 +646,7 @@  static const AVOption options[] = {
     { "video_size", "set video frame size", OFFSET(width), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0, DEC },
     { "offset_x", "capture area x offset", OFFSET(offset_x), AV_OPT_TYPE_INT, {.i64 = 0}, INT_MIN, INT_MAX, DEC },
     { "offset_y", "capture area y offset", OFFSET(offset_y), AV_OPT_TYPE_INT, {.i64 = 0}, INT_MIN, INT_MAX, DEC },
+    { "use_captureblt", "capture gdi window use CAPTTUREBLT flag", OFFSET(use_captureblt), AV_OPT_TYPE_INT, {.i64 = 1}, 0, 1, DEC },
     { NULL },
 };