mirror of https://git.ffmpeg.org/ffmpeg.git
lavfi/vsrc_ddagrab: add an option to avoid duplicating frames
Tested-by: Jiří Eliášek, Misha Aizatulin
This commit is contained in:
parent
66f028accb
commit
0291b6f824
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue