On Mon, 30 Dec 2019, fgodt...@hotmail.com wrote:
From: FgoDt <fgodt...@hotmail.com>
The commit description should go here, not in the commit title.
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.
Why? Does this happen with every windows version? This does not seem like the right fix. In fact, I dont't see how this can work, because mouse is drawn upon the captured video "manually" in paint_mouse_pointer. Could you dig deeper what is the main cause of the issue?
+Disable CAPTUREBLT FLAG by set value @code{0} to fix cursor flickering. Default value is @code{1} +
Doesn't this change what is captured when the user captures a single window and something is dragged on top? That alone might be a useful addition, but the documentation as is would be totally misleading.
+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 }, };
Regards, Marton _______________________________________________ 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".