aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2024-06-21 23:01:00 +0200
committerdec05eba <dec05eba@protonmail.com>2024-06-21 23:01:00 +0200
commit46da55b1eafef7495204a6733193057853d6575a (patch)
tree18eb699e521da4265f97e527cb1d3eecbb35c9a8
parentfab9fc9993af7220a6941e975f82cbfbfd109934 (diff)
fm content: make sure to capture frame on damage and then no damage after fps frame timeout
-rw-r--r--include/capture/capture.h3
-rw-r--r--include/capture/xcomposite.h3
-rw-r--r--src/capture/xcomposite.c15
-rw-r--r--src/capture/xcomposite_cuda.c12
-rw-r--r--src/capture/xcomposite_vaapi.c12
-rw-r--r--src/main.cpp4
6 files changed, 31 insertions, 18 deletions
diff --git a/include/capture/capture.h b/include/capture/capture.h
index 8719c40..fbbe767 100644
--- a/include/capture/capture.h
+++ b/include/capture/capture.h
@@ -21,7 +21,8 @@ struct gsr_capture {
/* These methods should not be called manually. Call gsr_capture_* instead */
int (*start)(gsr_capture *cap, AVCodecContext *video_codec_context, AVFrame *frame);
void (*tick)(gsr_capture *cap, AVCodecContext *video_codec_context); /* can be NULL */
- bool (*consume_damage)(gsr_capture *cap); /* can be NULL */
+ bool (*is_damaged)(gsr_capture *cap); /* can be NULL */
+ void (*clear_damage)(gsr_capture *cap); /* can be NULL */
bool (*should_stop)(gsr_capture *cap, bool *err); /* can be NULL */
int (*capture)(gsr_capture *cap, AVFrame *frame);
void (*capture_end)(gsr_capture *cap, AVFrame *frame); /* can be NULL */
diff --git a/include/capture/xcomposite.h b/include/capture/xcomposite.h
index 83731fa..27b289a 100644
--- a/include/capture/xcomposite.h
+++ b/include/capture/xcomposite.h
@@ -50,7 +50,8 @@ void gsr_capture_xcomposite_init(gsr_capture_xcomposite *self, const gsr_capture
int gsr_capture_xcomposite_start(gsr_capture_xcomposite *self, AVCodecContext *video_codec_context, AVFrame *frame);
void gsr_capture_xcomposite_stop(gsr_capture_xcomposite *self);
void gsr_capture_xcomposite_tick(gsr_capture_xcomposite *self, AVCodecContext *video_codec_context);
-bool gsr_capture_xcomposite_consume_damage(gsr_capture_xcomposite *self);
+bool gsr_capture_xcomposite_is_damaged(gsr_capture_xcomposite *self);
+void gsr_capture_xcomposite_clear_damage(gsr_capture_xcomposite *self);
bool gsr_capture_xcomposite_should_stop(gsr_capture_xcomposite *self, bool *err);
int gsr_capture_xcomposite_capture(gsr_capture_xcomposite *self, AVFrame *frame);
diff --git a/src/capture/xcomposite.c b/src/capture/xcomposite.c
index c68acaa..3240ed8 100644
--- a/src/capture/xcomposite.c
+++ b/src/capture/xcomposite.c
@@ -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) {
diff --git a/src/capture/xcomposite_cuda.c b/src/capture/xcomposite_cuda.c
index 01e1f12..c436221 100644
--- a/src/capture/xcomposite_cuda.c
+++ b/src/capture/xcomposite_cuda.c
@@ -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,
diff --git a/src/capture/xcomposite_vaapi.c b/src/capture/xcomposite_vaapi.c
index b8d4544..3f27014 100644
--- a/src/capture/xcomposite_vaapi.c
+++ b/src/capture/xcomposite_vaapi.c
@@ -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,
diff --git a/src/main.cpp b/src/main.cpp
index 5d233f2..71980cf 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -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;