From: FgoDt <fgodt...@hotmail.com>

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

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 },
 };
 
-- 
2.23.0

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to