mirror of
https://repo.dec05eba.com/gpu-screen-recorder
synced 2026-04-03 02:01:39 +09:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f23308444a | ||
|
|
fadf9b64de | ||
|
|
e6f1d47eef | ||
|
|
7af4f106e7 |
4
TODO
4
TODO
@@ -241,4 +241,6 @@ Support reconnecting (and setting things up again) if the audio server is restar
|
||||
|
||||
Find out how nvidia-smi fixes nvenc not working on opensuse and do that ourselves instead of relying on nvidia-smi that is not always installed.
|
||||
|
||||
Pulseaudio code: add "running" variable to loops to allow stopping the running code when quitting.
|
||||
Pulseaudio code: add "running" variable to loops to allow stopping the running code when quitting.
|
||||
|
||||
Scale screenshot frame libswscale or implement lanczos shader for improved scaline for video as well.
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
|
||||
typedef struct {
|
||||
int drmfd;
|
||||
drmModePlaneResPtr planes;
|
||||
} gsr_drm;
|
||||
|
||||
typedef struct {
|
||||
@@ -289,21 +288,31 @@ static int drm_prime_handles_to_fds(gsr_drm *drm, drmModeFB2Ptr drmfb, int *fb_f
|
||||
return GSR_KMS_MAX_DMA_BUFS;
|
||||
}
|
||||
|
||||
static int kms_get_fb(gsr_drm *drm, gsr_kms_response *response, connector_to_crtc_map *c2crtc_map) {
|
||||
static int kms_get_fb(gsr_drm *drm, gsr_kms_response *response) {
|
||||
int result = -1;
|
||||
|
||||
response->result = KMS_RESULT_OK;
|
||||
response->err_msg[0] = '\0';
|
||||
response->num_items = 0;
|
||||
|
||||
for(uint32_t i = 0; i < drm->planes->count_planes && response->num_items < GSR_KMS_MAX_ITEMS; ++i) {
|
||||
connector_to_crtc_map c2crtc_map;
|
||||
c2crtc_map.num_maps = 0;
|
||||
map_crtc_to_connector_ids(drm, &c2crtc_map);
|
||||
|
||||
drmModePlaneResPtr planes = drmModeGetPlaneResources(drm->drmfd);
|
||||
if(!planes) {
|
||||
fprintf(stderr, "kms server error: failed to get plane resources, error: %s\n", strerror(errno));
|
||||
goto done;
|
||||
}
|
||||
|
||||
for(uint32_t i = 0; i < planes->count_planes && response->num_items < GSR_KMS_MAX_ITEMS; ++i) {
|
||||
drmModePlanePtr plane = NULL;
|
||||
drmModeFB2Ptr drmfb = NULL;
|
||||
|
||||
plane = drmModeGetPlane(drm->drmfd, drm->planes->planes[i]);
|
||||
plane = drmModeGetPlane(drm->drmfd, planes->planes[i]);
|
||||
if(!plane) {
|
||||
response->result = KMS_RESULT_FAILED_TO_GET_PLANE;
|
||||
snprintf(response->err_msg, sizeof(response->err_msg), "failed to get drm plane with id %u, error: %s\n", drm->planes->planes[i], strerror(errno));
|
||||
snprintf(response->err_msg, sizeof(response->err_msg), "failed to get drm plane with id %u, error: %s\n", planes->planes[i], strerror(errno));
|
||||
fprintf(stderr, "kms server error: %s\n", response->err_msg);
|
||||
goto next;
|
||||
}
|
||||
@@ -346,7 +355,7 @@ static int kms_get_fb(gsr_drm *drm, gsr_kms_response *response, connector_to_crt
|
||||
|
||||
const int item_index = response->num_items;
|
||||
|
||||
const connector_crtc_pair *crtc_pair = get_connector_pair_by_crtc_id(c2crtc_map, plane->crtc_id);
|
||||
const connector_crtc_pair *crtc_pair = get_connector_pair_by_crtc_id(&c2crtc_map, plane->crtc_id);
|
||||
if(crtc_pair && crtc_pair->hdr_metadata_blob_id) {
|
||||
response->items[item_index].has_hdr_metadata = get_hdr_metadata(drm->drmfd, crtc_pair->hdr_metadata_blob_id, &response->items[item_index].hdr_metadata);
|
||||
} else {
|
||||
@@ -389,6 +398,11 @@ static int kms_get_fb(gsr_drm *drm, gsr_kms_response *response, connector_to_crt
|
||||
drmModeFreePlane(plane);
|
||||
}
|
||||
|
||||
done:
|
||||
|
||||
if(planes)
|
||||
drmModeFreePlaneResources(planes);
|
||||
|
||||
if(response->num_items > 0)
|
||||
response->result = KMS_RESULT_OK;
|
||||
|
||||
@@ -499,7 +513,6 @@ int main(int argc, char **argv) {
|
||||
int socket_fd = 0;
|
||||
gsr_drm drm;
|
||||
drm.drmfd = 0;
|
||||
drm.planes = NULL;
|
||||
|
||||
if(argc != 3) {
|
||||
fprintf(stderr, "usage: gsr-kms-server <domain_socket_path> <card_path>\n");
|
||||
@@ -532,17 +545,6 @@ int main(int argc, char **argv) {
|
||||
fprintf(stderr, "kms server warning: drmSetClientCap DRM_CLIENT_CAP_ATOMIC failed, error: %s. The wrong monitor may be captured as a result\n", strerror(errno));
|
||||
}
|
||||
|
||||
drm.planes = drmModeGetPlaneResources(drm.drmfd);
|
||||
if(!drm.planes) {
|
||||
fprintf(stderr, "kms server error: failed to get plane resources, error: %s\n", strerror(errno));
|
||||
res = 2;
|
||||
goto done;
|
||||
}
|
||||
|
||||
connector_to_crtc_map c2crtc_map;
|
||||
c2crtc_map.num_maps = 0;
|
||||
map_crtc_to_connector_ids(&drm, &c2crtc_map);
|
||||
|
||||
fprintf(stderr, "kms server info: connecting to the client\n");
|
||||
bool connected = false;
|
||||
const double connect_timeout_sec = 5.0;
|
||||
@@ -642,7 +644,7 @@ int main(int argc, char **argv) {
|
||||
response.version = GSR_KMS_PROTOCOL_VERSION;
|
||||
response.num_items = 0;
|
||||
|
||||
if(kms_get_fb(&drm, &response, &c2crtc_map) == 0) {
|
||||
if(kms_get_fb(&drm, &response) == 0) {
|
||||
if(send_msg_to_client(socket_fd, &response) == -1)
|
||||
fprintf(stderr, "kms server error: failed to respond to client KMS_REQUEST_TYPE_GET_KMS request\n");
|
||||
} else {
|
||||
@@ -681,8 +683,6 @@ int main(int argc, char **argv) {
|
||||
}
|
||||
|
||||
done:
|
||||
if(drm.planes)
|
||||
drmModeFreePlaneResources(drm.planes);
|
||||
if(drm.drmfd > 0)
|
||||
close(drm.drmfd);
|
||||
if(socket_fd > 0)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
project('gpu-screen-recorder', ['c', 'cpp'], version : '5.2.2', default_options : ['warning_level=2'])
|
||||
project('gpu-screen-recorder', ['c', 'cpp'], version : '5.2.3', default_options : ['warning_level=2'])
|
||||
|
||||
add_project_arguments('-Wshadow', language : ['c', 'cpp'])
|
||||
if get_option('buildtype') == 'debug'
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "gpu-screen-recorder"
|
||||
type = "executable"
|
||||
version = "5.2.2"
|
||||
version = "5.2.3"
|
||||
platforms = ["posix"]
|
||||
|
||||
[config]
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
window=$(xdotool selectwindow)
|
||||
window_name=$(xdotool getwindowname "$window" || xdotool getwindowclassname "$window" || echo "Game")
|
||||
window_name="$(echo "$window_name" | tr '/\\' '_')"
|
||||
gpu-screen-recorder -w "$window" -f 60 -c mkv -a default_output -r 60 -o "$HOME/Videos/Replays/$window_name"
|
||||
gpu-screen-recorder -w "$window" -f 60 -c mkv -a default_output -bm cbr -q 45000 -r 60 -o "$HOME/Videos/Replays/$window_name"
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
pidof -q gpu-screen-recorder && exit 0
|
||||
video_path="$HOME/Videos"
|
||||
mkdir -p "$video_path"
|
||||
gpu-screen-recorder -w screen -f 60 -a default_output -c mkv -r 30 -o "$video_path"
|
||||
gpu-screen-recorder -w screen -f 60 -a default_output -c mkv -bm cbr -q 45000 -r 30 -o "$video_path"
|
||||
|
||||
Reference in New Issue
Block a user