mirror of
https://repo.dec05eba.com/gpu-screen-recorder
synced 2026-03-31 09:07:13 +09:00
fm content: make sure to capture frame on damage and then no damage after fps frame timeout
This commit is contained in:
@@ -285,15 +285,12 @@ void gsr_capture_xcomposite_tick(gsr_capture_xcomposite *self, AVCodecContext *v
|
||||
}
|
||||
}
|
||||
|
||||
bool gsr_capture_xcomposite_consume_damage(gsr_capture_xcomposite *self) {
|
||||
if(self->damage_event) {
|
||||
const bool damaged = self->damaged;
|
||||
self->damaged = false;
|
||||
//fprintf(stderr, "consume: %s\n", damaged ? "yes" : "no");
|
||||
return damaged;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
bool gsr_capture_xcomposite_is_damaged(gsr_capture_xcomposite *self) {
|
||||
return self->damage_event ? self->damaged : true;
|
||||
}
|
||||
|
||||
void gsr_capture_xcomposite_clear_damage(gsr_capture_xcomposite *self) {
|
||||
self->damaged = false;
|
||||
}
|
||||
|
||||
bool gsr_capture_xcomposite_should_stop(gsr_capture_xcomposite *self, bool *err) {
|
||||
|
||||
@@ -76,9 +76,14 @@ static void gsr_capture_xcomposite_cuda_tick(gsr_capture *cap, AVCodecContext *v
|
||||
gsr_capture_xcomposite_tick(&cap_xcomp->xcomposite, video_codec_context);
|
||||
}
|
||||
|
||||
static bool gsr_capture_xcomposite_cuda_consume_damage(gsr_capture *cap) {
|
||||
static bool gsr_capture_xcomposite_cuda_is_damaged(gsr_capture *cap) {
|
||||
gsr_capture_xcomposite_cuda *cap_xcomp = cap->priv;
|
||||
return gsr_capture_xcomposite_consume_damage(&cap_xcomp->xcomposite);
|
||||
return gsr_capture_xcomposite_is_damaged(&cap_xcomp->xcomposite);
|
||||
}
|
||||
|
||||
static void gsr_capture_xcomposite_cuda_clear_damage(gsr_capture *cap) {
|
||||
gsr_capture_xcomposite_cuda *cap_xcomp = cap->priv;
|
||||
gsr_capture_xcomposite_clear_damage(&cap_xcomp->xcomposite);
|
||||
}
|
||||
|
||||
static bool gsr_capture_xcomposite_cuda_should_stop(gsr_capture *cap, bool *err) {
|
||||
@@ -149,7 +154,8 @@ gsr_capture* gsr_capture_xcomposite_cuda_create(const gsr_capture_xcomposite_cud
|
||||
*cap = (gsr_capture) {
|
||||
.start = gsr_capture_xcomposite_cuda_start,
|
||||
.tick = gsr_capture_xcomposite_cuda_tick,
|
||||
.consume_damage = gsr_capture_xcomposite_cuda_consume_damage,
|
||||
.is_damaged = gsr_capture_xcomposite_cuda_is_damaged,
|
||||
.clear_damage = gsr_capture_xcomposite_cuda_clear_damage,
|
||||
.should_stop = gsr_capture_xcomposite_cuda_should_stop,
|
||||
.capture = gsr_capture_xcomposite_cuda_capture,
|
||||
.capture_end = NULL,
|
||||
|
||||
@@ -43,9 +43,14 @@ static void gsr_capture_xcomposite_vaapi_tick(gsr_capture *cap, AVCodecContext *
|
||||
gsr_capture_xcomposite_tick(&cap_xcomp->xcomposite, video_codec_context);
|
||||
}
|
||||
|
||||
static bool gsr_capture_xcomposite_vaapi_consume_damage(gsr_capture *cap) {
|
||||
static bool gsr_capture_xcomposite_vaapi_is_damaged(gsr_capture *cap) {
|
||||
gsr_capture_xcomposite_vaapi *cap_xcomp = cap->priv;
|
||||
return gsr_capture_xcomposite_consume_damage(&cap_xcomp->xcomposite);
|
||||
return gsr_capture_xcomposite_is_damaged(&cap_xcomp->xcomposite);
|
||||
}
|
||||
|
||||
static void gsr_capture_xcomposite_vaapi_clear_damage(gsr_capture *cap) {
|
||||
gsr_capture_xcomposite_vaapi *cap_xcomp = cap->priv;
|
||||
gsr_capture_xcomposite_clear_damage(&cap_xcomp->xcomposite);
|
||||
}
|
||||
|
||||
static bool gsr_capture_xcomposite_vaapi_should_stop(gsr_capture *cap, bool *err) {
|
||||
@@ -103,7 +108,8 @@ gsr_capture* gsr_capture_xcomposite_vaapi_create(const gsr_capture_xcomposite_va
|
||||
*cap = (gsr_capture) {
|
||||
.start = gsr_capture_xcomposite_vaapi_start,
|
||||
.tick = gsr_capture_xcomposite_vaapi_tick,
|
||||
.consume_damage = gsr_capture_xcomposite_vaapi_consume_damage,
|
||||
.is_damaged = gsr_capture_xcomposite_vaapi_is_damaged,
|
||||
.clear_damage = gsr_capture_xcomposite_vaapi_clear_damage,
|
||||
.should_stop = gsr_capture_xcomposite_vaapi_should_stop,
|
||||
.capture = gsr_capture_xcomposite_vaapi_capture,
|
||||
.capture_end = NULL,
|
||||
|
||||
@@ -2719,13 +2719,15 @@ int main(int argc, char **argv) {
|
||||
damage_fps_counter = 0;
|
||||
}
|
||||
|
||||
const bool damaged = !capture->consume_damage || capture->consume_damage(capture);
|
||||
const bool damaged = !capture->is_damaged || capture->is_damaged(capture);
|
||||
if(damaged) {
|
||||
++damage_fps_counter;
|
||||
}
|
||||
|
||||
double frame_time_overflow = frame_timer_elapsed - target_fps;
|
||||
if (frame_time_overflow >= 0.0 && damaged) {
|
||||
if(capture->clear_damage)
|
||||
capture->clear_damage(capture);
|
||||
frame_time_overflow = std::min(frame_time_overflow, target_fps);
|
||||
frame_timer_start = time_now - frame_time_overflow;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user