mirror of
https://repo.dec05eba.com/gpu-screen-recorder
synced 2026-04-24 18:42:57 +09:00
Window capture: clear background with black color
This commit is contained in:
@@ -45,6 +45,7 @@ typedef struct {
|
|||||||
int gsr_color_conversion_init(gsr_color_conversion *self, const gsr_color_conversion_params *params);
|
int gsr_color_conversion_init(gsr_color_conversion *self, const gsr_color_conversion_params *params);
|
||||||
void gsr_color_conversion_deinit(gsr_color_conversion *self);
|
void gsr_color_conversion_deinit(gsr_color_conversion *self);
|
||||||
|
|
||||||
int gsr_color_conversion_draw(gsr_color_conversion *self, unsigned int texture_id, vec2i source_pos, vec2i source_size, vec2i texture_pos, vec2i texture_size, float rotation, bool external_texture);
|
void gsr_color_conversion_draw(gsr_color_conversion *self, unsigned int texture_id, vec2i source_pos, vec2i source_size, vec2i texture_pos, vec2i texture_size, float rotation, bool external_texture);
|
||||||
|
void gsr_color_conversion_clear(gsr_color_conversion *self);
|
||||||
|
|
||||||
#endif /* GSR_COLOR_CONVERSION_H */
|
#endif /* GSR_COLOR_CONVERSION_H */
|
||||||
|
|||||||
@@ -272,6 +272,7 @@ static void gsr_capture_xcomposite_cuda_stop(gsr_capture *cap, AVCodecContext *v
|
|||||||
static void gsr_capture_xcomposite_cuda_tick(gsr_capture *cap, AVCodecContext *video_codec_context, AVFrame **frame) {
|
static void gsr_capture_xcomposite_cuda_tick(gsr_capture *cap, AVCodecContext *video_codec_context, AVFrame **frame) {
|
||||||
gsr_capture_xcomposite_cuda *cap_xcomp = cap->priv;
|
gsr_capture_xcomposite_cuda *cap_xcomp = cap->priv;
|
||||||
|
|
||||||
|
cap_xcomp->params.egl->glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
cap_xcomp->params.egl->glClear(GL_COLOR_BUFFER_BIT);
|
cap_xcomp->params.egl->glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
bool init_new_window = false;
|
bool init_new_window = false;
|
||||||
|
|||||||
@@ -199,6 +199,7 @@ static void gsr_capture_xcomposite_vaapi_tick(gsr_capture *cap, AVCodecContext *
|
|||||||
gsr_capture_xcomposite_vaapi *cap_xcomp = cap->priv;
|
gsr_capture_xcomposite_vaapi *cap_xcomp = cap->priv;
|
||||||
|
|
||||||
// TODO:
|
// TODO:
|
||||||
|
cap_xcomp->params.egl->glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
cap_xcomp->params.egl->glClear(GL_COLOR_BUFFER_BIT);
|
cap_xcomp->params.egl->glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
bool init_new_window = false;
|
bool init_new_window = false;
|
||||||
@@ -418,6 +419,8 @@ static void gsr_capture_xcomposite_vaapi_tick(gsr_capture *cap, AVCodecContext *
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gsr_color_conversion_clear(&cap_xcomp->color_conversion);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -362,7 +362,7 @@ void gsr_color_conversion_deinit(gsr_color_conversion *self) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* |source_pos| is in pixel coordinates and |source_size| */
|
/* |source_pos| is in pixel coordinates and |source_size| */
|
||||||
int gsr_color_conversion_draw(gsr_color_conversion *self, unsigned int texture_id, vec2i source_pos, vec2i source_size, vec2i texture_pos, vec2i texture_size, float rotation, bool external_texture) {
|
void gsr_color_conversion_draw(gsr_color_conversion *self, unsigned int texture_id, vec2i source_pos, vec2i source_size, vec2i texture_pos, vec2i texture_size, float rotation, bool external_texture) {
|
||||||
/* TODO: Do not call this every frame? */
|
/* TODO: Do not call this every frame? */
|
||||||
vec2i dest_texture_size = {0, 0};
|
vec2i dest_texture_size = {0, 0};
|
||||||
self->params.egl->glBindTexture(GL_TEXTURE_2D, self->params.destination_textures[0]);
|
self->params.egl->glBindTexture(GL_TEXTURE_2D, self->params.destination_textures[0]);
|
||||||
@@ -453,5 +453,44 @@ int gsr_color_conversion_draw(gsr_color_conversion *self, unsigned int texture_i
|
|||||||
gsr_shader_use_none(&self->shaders[0]);
|
gsr_shader_use_none(&self->shaders[0]);
|
||||||
self->params.egl->glBindTexture(texture_target, 0);
|
self->params.egl->glBindTexture(texture_target, 0);
|
||||||
self->params.egl->glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
self->params.egl->glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
return 0;
|
}
|
||||||
|
|
||||||
|
void gsr_color_conversion_clear(gsr_color_conversion *self) {
|
||||||
|
float color1[4];
|
||||||
|
float color2[4];
|
||||||
|
|
||||||
|
switch(self->params.destination_color) {
|
||||||
|
case GSR_DESTINATION_COLOR_BGR: {
|
||||||
|
color1[0] = 0.0f;
|
||||||
|
color1[1] = 0.0f;
|
||||||
|
color1[2] = 0.0f;
|
||||||
|
color1[3] = 1.0f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GSR_DESTINATION_COLOR_NV12:
|
||||||
|
case GSR_DESTINATION_COLOR_P010: {
|
||||||
|
color1[0] = 0.0f;
|
||||||
|
color1[1] = 0.0f;
|
||||||
|
color1[2] = 0.0f;
|
||||||
|
color1[3] = 1.0f;
|
||||||
|
|
||||||
|
color2[0] = 0.5f;
|
||||||
|
color2[1] = 0.5f;
|
||||||
|
color2[2] = 0.0f;
|
||||||
|
color2[3] = 1.0f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self->params.egl->glBindFramebuffer(GL_FRAMEBUFFER, self->framebuffers[0]);
|
||||||
|
self->params.egl->glClearColor(color1[0], color1[1], color1[2], color1[3]);
|
||||||
|
self->params.egl->glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
if(self->params.num_destination_textures > 1) {
|
||||||
|
self->params.egl->glBindFramebuffer(GL_FRAMEBUFFER, self->framebuffers[1]);
|
||||||
|
self->params.egl->glClearColor(color2[0], color2[1], color2[2], color2[3]);
|
||||||
|
self->params.egl->glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
self->params.egl->glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user