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".