lavfi/vsrc_ddagrab: add an option to avoid duplicating frames

Tested-by: Jiří Eliášek, Misha Aizatulin
This commit is contained in:
Anton Khirnov 2023-11-19 12:46:48 +01:00
parent 66f028accb
commit 0291b6f824
2 changed files with 17 additions and 5 deletions

View File

@ -28713,10 +28713,10 @@ it'll always be captured.
@item framerate
Maximum framerate at which the desktop will be captured - the interval between
successive frames will not be smaller than the inverse of the framerate. When
the desktop is not being updated often enough, the filter will duplicate
a previous frame. Note that there is no background buffering going on, so when
the filter is not polled often enough then the actual inter-frame interval may
be significantly larger.
@var{dup_frames} is true (the default) and the desktop is not being updated
often enough, the filter will duplicate a previous frame. Note that there is no
background buffering going on, so when the filter is not polled often enough
then the actual inter-frame interval may be significantly larger.
Defaults to 30 FPS.
@ -28749,6 +28749,13 @@ Passes all supported output formats to DDA and returns what DDA decides to use.
Filter initialization will fail if 10 bit format is requested but unavailable.
@end table
@item dup_frames
When this option is set to true (the default), the filter will duplicate frames
when the desktop has not been updated in order to maintain approximately
constant target framerate. When this option is set to false, the filter will
wait for the desktop to be updated (inter-frame intervals may vary significantly
in this case).
@end table
@subsection Examples

View File

@ -101,6 +101,7 @@ typedef struct DdagrabContext {
int out_fmt;
int allow_fallback;
int force_fmt;
int dup_frames;
} DdagrabContext;
#define OFFSET(x) offsetof(DdagrabContext, x)
@ -124,6 +125,8 @@ static const AVOption ddagrab_options[] = {
OFFSET(allow_fallback), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
{ "force_fmt", "exclude BGRA from format list (experimental, discouraged by Microsoft)",
OFFSET(force_fmt), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
{ "dup_frames", "duplicate frames to maintain framerate",
OFFSET(dup_frames), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, FLAGS },
{ NULL }
};
@ -1067,7 +1070,9 @@ static int ddagrab_request_frame(AVFilterLink *outlink)
now -= dda->first_pts;
if (!dda->probed_texture) {
ret = next_frame_internal(avctx, &cur_texture, 0);
do {
ret = next_frame_internal(avctx, &cur_texture, 0);
} while (ret == AVERROR(EAGAIN) && !dda->dup_frames);
} else {
cur_texture = dda->probed_texture;
dda->probed_texture = NULL;