mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-10-26 12:15:34 +08:00
Support AV1 codec
This commit is contained in:
@@ -1,16 +1,19 @@
|
|||||||
[signal server]
|
[signal server]
|
||||||
ip = 120.77.216.215
|
ip = 150.158.81.30
|
||||||
port = 9099
|
port = 9099
|
||||||
|
|
||||||
[stun server]
|
[stun server]
|
||||||
ip = 120.77.216.215
|
ip = 150.158.81.30
|
||||||
port = 3478
|
port = 3478
|
||||||
|
|
||||||
[turn server]
|
[turn server]
|
||||||
ip = 120.77.216.215
|
ip = 150.158.81.30
|
||||||
port = 3478
|
port = 3478
|
||||||
username = dijunkun
|
username = dijunkun
|
||||||
password = dijunkunpw
|
password = dijunkunpw
|
||||||
|
|
||||||
[hardware acceleration]
|
[hardware acceleration]
|
||||||
|
turn_on = false
|
||||||
|
|
||||||
|
[av1 encoding]
|
||||||
turn_on = true
|
turn_on = true
|
||||||
770
src/gui/main.cpp
770
src/gui/main.cpp
@@ -440,268 +440,336 @@ int initResampler() {
|
|||||||
fprintf(stderr, "Could not allocate destination samples\n");
|
fprintf(stderr, "Could not allocate destination samples\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main() {
|
int main(int argc, char *argv[]) {
|
||||||
LOG_INFO("Remote desk");
|
LOG_INFO("Remote desk");
|
||||||
|
|
||||||
last_ts = static_cast<uint32_t>(
|
last_ts = static_cast<uint32_t>(
|
||||||
std::chrono::duration_cast<std::chrono::milliseconds>(
|
std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||||
std::chrono::high_resolution_clock::now().time_since_epoch())
|
std::chrono::high_resolution_clock::now().time_since_epoch())
|
||||||
.count());
|
.count());
|
||||||
|
|
||||||
initResampler();
|
initResampler();
|
||||||
|
|
||||||
cd_cache_file = fopen("cache.cd", "r+");
|
cd_cache_file = fopen("cache.cd", "r+");
|
||||||
if (cd_cache_file) {
|
if (cd_cache_file) {
|
||||||
fseek(cd_cache_file, 0, SEEK_SET);
|
fseek(cd_cache_file, 0, SEEK_SET);
|
||||||
fread(&cd_cache.password, sizeof(cd_cache.password), 1, cd_cache_file);
|
fread(&cd_cache.password, sizeof(cd_cache.password), 1, cd_cache_file);
|
||||||
fclose(cd_cache_file);
|
fclose(cd_cache_file);
|
||||||
strncpy(input_password, cd_cache.password, sizeof(cd_cache.password));
|
strncpy(input_password, cd_cache.password, sizeof(cd_cache.password));
|
||||||
}
|
|
||||||
|
|
||||||
// Setup SDL
|
|
||||||
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER |
|
|
||||||
SDL_INIT_GAMECONTROLLER) != 0) {
|
|
||||||
printf("Error: %s\n", SDL_GetError());
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// From 2.0.18: Enable native IME.
|
|
||||||
#ifdef SDL_HINT_IME_SHOW_UI
|
|
||||||
SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Create window with SDL_Renderer graphics context
|
|
||||||
SDL_WindowFlags window_flags =
|
|
||||||
(SDL_WindowFlags)(SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI);
|
|
||||||
window = SDL_CreateWindow("Remote Desk", SDL_WINDOWPOS_CENTERED,
|
|
||||||
SDL_WINDOWPOS_CENTERED, window_w, window_h,
|
|
||||||
window_flags);
|
|
||||||
|
|
||||||
SDL_DisplayMode DM;
|
|
||||||
SDL_GetCurrentDisplayMode(0, &DM);
|
|
||||||
screen_w = DM.w;
|
|
||||||
screen_h = DM.h;
|
|
||||||
|
|
||||||
sdlRenderer = SDL_CreateRenderer(
|
|
||||||
window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED);
|
|
||||||
if (sdlRenderer == nullptr) {
|
|
||||||
SDL_Log("Error creating SDL_Renderer!");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
Uint32 pixformat = 0;
|
|
||||||
pixformat = SDL_PIXELFORMAT_NV12;
|
|
||||||
|
|
||||||
sdlTexture = SDL_CreateTexture(sdlRenderer, pixformat,
|
|
||||||
SDL_TEXTUREACCESS_STREAMING, pixel_w, pixel_h);
|
|
||||||
|
|
||||||
// Audio
|
|
||||||
SDL_AudioSpec want_in, have_in, want_out, have_out;
|
|
||||||
SDL_zero(want_in);
|
|
||||||
want_in.freq = 48000;
|
|
||||||
want_in.format = AUDIO_S16LSB;
|
|
||||||
want_in.channels = 1;
|
|
||||||
want_in.samples = 480;
|
|
||||||
want_in.callback = SdlCaptureAudioIn;
|
|
||||||
|
|
||||||
input_dev = SDL_OpenAudioDevice(NULL, 1, &want_in, &have_in, 0);
|
|
||||||
if (input_dev == 0) {
|
|
||||||
SDL_Log("Failed to open input: %s", SDL_GetError());
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_zero(want_out);
|
|
||||||
want_out.freq = 48000;
|
|
||||||
want_out.format = AUDIO_S16LSB;
|
|
||||||
want_out.channels = 1;
|
|
||||||
// want_out.silence = 0;
|
|
||||||
want_out.samples = 480;
|
|
||||||
want_out.callback = NULL;
|
|
||||||
|
|
||||||
output_dev = SDL_OpenAudioDevice(NULL, 0, &want_out, &have_out, 0);
|
|
||||||
if (output_dev == 0) {
|
|
||||||
SDL_Log("Failed to open input: %s", SDL_GetError());
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_PauseAudioDevice(input_dev, 0);
|
|
||||||
SDL_PauseAudioDevice(output_dev, 0);
|
|
||||||
|
|
||||||
// Setup Dear ImGui context
|
|
||||||
IMGUI_CHECKVERSION();
|
|
||||||
ImGui::CreateContext();
|
|
||||||
ImGuiIO &io = ImGui::GetIO();
|
|
||||||
|
|
||||||
io.ConfigFlags |=
|
|
||||||
ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
|
|
||||||
io.ConfigFlags |=
|
|
||||||
ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
|
|
||||||
|
|
||||||
// Setup Dear ImGui style
|
|
||||||
ImGui::StyleColorsDark();
|
|
||||||
// ImGui::StyleColorsLight();
|
|
||||||
|
|
||||||
// Setup Platform/Renderer backends
|
|
||||||
ImGui_ImplSDL2_InitForSDLRenderer(window, sdlRenderer);
|
|
||||||
ImGui_ImplSDLRenderer2_Init(sdlRenderer);
|
|
||||||
|
|
||||||
// Our state
|
|
||||||
bool show_demo_window = true;
|
|
||||||
bool show_another_window = false;
|
|
||||||
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
|
|
||||||
|
|
||||||
std::string mac_addr_str = GetMac();
|
|
||||||
|
|
||||||
std::thread rtc_thread(
|
|
||||||
[](int screen_width, int screen_height) {
|
|
||||||
std::string default_cfg_path = "../../../../config/config.ini";
|
|
||||||
std::ifstream f(default_cfg_path.c_str());
|
|
||||||
|
|
||||||
std::string mac_addr_str = GetMac();
|
|
||||||
|
|
||||||
Params server_params;
|
|
||||||
server_params.cfg_path =
|
|
||||||
f.good() ? "../../../../config/config.ini" : "config.ini";
|
|
||||||
server_params.on_receive_video_buffer = ServerReceiveVideoBuffer;
|
|
||||||
server_params.on_receive_audio_buffer = ServerReceiveAudioBuffer;
|
|
||||||
server_params.on_receive_data_buffer = ServerReceiveDataBuffer;
|
|
||||||
server_params.on_signal_status = ServerSignalStatus;
|
|
||||||
server_params.on_connection_status = ServerConnectionStatus;
|
|
||||||
|
|
||||||
Params client_params;
|
|
||||||
client_params.cfg_path =
|
|
||||||
f.good() ? "../../../../config/config.ini" : "config.ini";
|
|
||||||
client_params.on_receive_video_buffer = ClientReceiveVideoBuffer;
|
|
||||||
client_params.on_receive_audio_buffer = ClientReceiveAudioBuffer;
|
|
||||||
client_params.on_receive_data_buffer = ClientReceiveDataBuffer;
|
|
||||||
client_params.on_signal_status = ClientSignalStatus;
|
|
||||||
client_params.on_connection_status = ClientConnectionStatus;
|
|
||||||
|
|
||||||
std::string transmission_id = "000001";
|
|
||||||
|
|
||||||
peer_server = CreatePeer(&server_params);
|
|
||||||
LOG_INFO("Create peer_server");
|
|
||||||
std::string server_user_id = "S-" + mac_addr_str;
|
|
||||||
Init(peer_server, server_user_id.c_str());
|
|
||||||
LOG_INFO("peer_server init finish");
|
|
||||||
|
|
||||||
peer_client = CreatePeer(&client_params);
|
|
||||||
LOG_INFO("Create peer_client");
|
|
||||||
std::string client_user_id = "C-" + mac_addr_str;
|
|
||||||
Init(peer_client, client_user_id.c_str());
|
|
||||||
LOG_INFO("peer_client init finish");
|
|
||||||
|
|
||||||
{
|
|
||||||
while (SignalStatus::SignalConnected != server_signal_status &&
|
|
||||||
!done) {
|
|
||||||
std::this_thread::sleep_for(std::chrono::seconds(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (done) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string user_id = "S-" + mac_addr_str;
|
|
||||||
is_create_connection =
|
|
||||||
CreateConnection(peer_server, mac_addr_str.c_str(),
|
|
||||||
input_password)
|
|
||||||
? false
|
|
||||||
: true;
|
|
||||||
|
|
||||||
nv12_buffer = new char[NV12_BUFFER_SIZE];
|
|
||||||
|
|
||||||
// Screen capture
|
|
||||||
screen_capturer_factory = new ScreenCapturerFactory();
|
|
||||||
screen_capturer = (ScreenCapturer *)screen_capturer_factory->Create();
|
|
||||||
|
|
||||||
last_frame_time_ = std::chrono::high_resolution_clock::now();
|
|
||||||
ScreenCapturer::RECORD_DESKTOP_RECT rect;
|
|
||||||
rect.left = 0;
|
|
||||||
rect.top = 0;
|
|
||||||
rect.right = screen_w;
|
|
||||||
rect.bottom = screen_h;
|
|
||||||
|
|
||||||
screen_capturer->Init(
|
|
||||||
rect, 60,
|
|
||||||
[](unsigned char *data, int size, int width, int height) -> void {
|
|
||||||
auto now_time = std::chrono::high_resolution_clock::now();
|
|
||||||
std::chrono::duration<double> duration =
|
|
||||||
now_time - last_frame_time_;
|
|
||||||
auto tc = duration.count() * 1000;
|
|
||||||
|
|
||||||
if (tc >= 0) {
|
|
||||||
SendData(peer_server, DATA_TYPE::VIDEO, (const char *)data,
|
|
||||||
NV12_BUFFER_SIZE);
|
|
||||||
last_frame_time_ = now_time;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
screen_capturer->Start();
|
|
||||||
|
|
||||||
// Mouse control
|
|
||||||
device_controller_factory = new DeviceControllerFactory();
|
|
||||||
mouse_controller =
|
|
||||||
(MouseController *)device_controller_factory->Create(
|
|
||||||
DeviceControllerFactory::Device::Mouse);
|
|
||||||
mouse_controller->Init(screen_w, screen_h);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
screen_w, screen_h);
|
|
||||||
|
|
||||||
// Main loop
|
|
||||||
while (!done) {
|
|
||||||
// Start the Dear ImGui frame
|
|
||||||
ImGui_ImplSDLRenderer2_NewFrame();
|
|
||||||
ImGui_ImplSDL2_NewFrame();
|
|
||||||
ImGui::NewFrame();
|
|
||||||
|
|
||||||
if (joined && !menu_hovered) {
|
|
||||||
ImGui::SetMouseCursor(ImGuiMouseCursor_None);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
// Setup SDL
|
||||||
static float f = 0.0f;
|
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER |
|
||||||
static int counter = 0;
|
SDL_INIT_GAMECONTROLLER) != 0) {
|
||||||
|
printf("Error: %s\n", SDL_GetError());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
const ImGuiViewport *main_viewport = ImGui::GetMainViewport();
|
// From 2.0.18: Enable native IME.
|
||||||
ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_Once);
|
#ifdef SDL_HINT_IME_SHOW_UI
|
||||||
ImGui::SetNextWindowSize(ImVec2(190, 200));
|
SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1");
|
||||||
|
#endif
|
||||||
|
|
||||||
ImGui::Begin("Menu", nullptr, ImGuiWindowFlags_NoResize);
|
// Create window with SDL_Renderer graphics context
|
||||||
|
SDL_WindowFlags window_flags =
|
||||||
|
(SDL_WindowFlags)(SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI);
|
||||||
|
window = SDL_CreateWindow("Remote Desk", SDL_WINDOWPOS_CENTERED,
|
||||||
|
SDL_WINDOWPOS_CENTERED, window_w, window_h,
|
||||||
|
window_flags);
|
||||||
|
|
||||||
|
SDL_DisplayMode DM;
|
||||||
|
SDL_GetCurrentDisplayMode(0, &DM);
|
||||||
|
screen_w = DM.w;
|
||||||
|
screen_h = DM.h;
|
||||||
|
|
||||||
|
sdlRenderer = SDL_CreateRenderer(
|
||||||
|
window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED);
|
||||||
|
if (sdlRenderer == nullptr) {
|
||||||
|
SDL_Log("Error creating SDL_Renderer!");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Uint32 pixformat = 0;
|
||||||
|
pixformat = SDL_PIXELFORMAT_NV12;
|
||||||
|
|
||||||
|
sdlTexture = SDL_CreateTexture(sdlRenderer, pixformat,
|
||||||
|
SDL_TEXTUREACCESS_STREAMING, pixel_w,
|
||||||
|
pixel_h);
|
||||||
|
|
||||||
|
// Audio
|
||||||
|
SDL_AudioSpec want_in, have_in, want_out, have_out;
|
||||||
|
SDL_zero(want_in);
|
||||||
|
want_in.freq = 48000;
|
||||||
|
want_in.format = AUDIO_S16LSB;
|
||||||
|
want_in.channels = 1;
|
||||||
|
want_in.samples = 480;
|
||||||
|
want_in.callback = SdlCaptureAudioIn;
|
||||||
|
|
||||||
|
input_dev = SDL_OpenAudioDevice(NULL, 1, &want_in, &have_in, 0);
|
||||||
|
if (input_dev == 0) {
|
||||||
|
SDL_Log("Failed to open input: %s", SDL_GetError());
|
||||||
|
// return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_zero(want_out);
|
||||||
|
want_out.freq = 48000;
|
||||||
|
want_out.format = AUDIO_S16LSB;
|
||||||
|
want_out.channels = 1;
|
||||||
|
// want_out.silence = 0;
|
||||||
|
want_out.samples = 480;
|
||||||
|
want_out.callback = NULL;
|
||||||
|
|
||||||
|
output_dev = SDL_OpenAudioDevice(NULL, 0, &want_out, &have_out, 0);
|
||||||
|
if (output_dev == 0) {
|
||||||
|
SDL_Log("Failed to open input: %s", SDL_GetError());
|
||||||
|
// return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_PauseAudioDevice(input_dev, 0);
|
||||||
|
SDL_PauseAudioDevice(output_dev, 0);
|
||||||
|
|
||||||
|
// Setup Dear ImGui context
|
||||||
|
IMGUI_CHECKVERSION();
|
||||||
|
ImGui::CreateContext();
|
||||||
|
ImGuiIO &io = ImGui::GetIO();
|
||||||
|
|
||||||
|
io.ConfigFlags |=
|
||||||
|
ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
|
||||||
|
io.ConfigFlags |=
|
||||||
|
ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
|
||||||
|
|
||||||
|
// Setup Dear ImGui style
|
||||||
|
ImGui::StyleColorsDark();
|
||||||
|
// ImGui::StyleColorsLight();
|
||||||
|
|
||||||
|
// Setup Platform/Renderer backends
|
||||||
|
ImGui_ImplSDL2_InitForSDLRenderer(window, sdlRenderer);
|
||||||
|
ImGui_ImplSDLRenderer2_Init(sdlRenderer);
|
||||||
|
|
||||||
|
// Our state
|
||||||
|
bool show_demo_window = true;
|
||||||
|
bool show_another_window = false;
|
||||||
|
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
|
||||||
|
|
||||||
|
std::string mac_addr_str = GetMac();
|
||||||
|
|
||||||
|
std::thread rtc_thread(
|
||||||
|
[](int screen_width, int screen_height) {
|
||||||
|
std::string default_cfg_path = "../../../../config/config.ini";
|
||||||
|
std::ifstream f(default_cfg_path.c_str());
|
||||||
|
|
||||||
|
std::string mac_addr_str = GetMac();
|
||||||
|
|
||||||
|
Params server_params;
|
||||||
|
server_params.cfg_path =
|
||||||
|
f.good() ? "../../../../config/config.ini" : "config.ini";
|
||||||
|
server_params.on_receive_video_buffer = ServerReceiveVideoBuffer;
|
||||||
|
server_params.on_receive_audio_buffer = ServerReceiveAudioBuffer;
|
||||||
|
server_params.on_receive_data_buffer = ServerReceiveDataBuffer;
|
||||||
|
server_params.on_signal_status = ServerSignalStatus;
|
||||||
|
server_params.on_connection_status = ServerConnectionStatus;
|
||||||
|
|
||||||
|
Params client_params;
|
||||||
|
client_params.cfg_path =
|
||||||
|
f.good() ? "../../../../config/config.ini" : "config.ini";
|
||||||
|
client_params.on_receive_video_buffer = ClientReceiveVideoBuffer;
|
||||||
|
client_params.on_receive_audio_buffer = ClientReceiveAudioBuffer;
|
||||||
|
client_params.on_receive_data_buffer = ClientReceiveDataBuffer;
|
||||||
|
client_params.on_signal_status = ClientSignalStatus;
|
||||||
|
client_params.on_connection_status = ClientConnectionStatus;
|
||||||
|
|
||||||
|
std::string transmission_id = "000001";
|
||||||
|
|
||||||
|
peer_server = CreatePeer(&server_params);
|
||||||
|
LOG_INFO("Create peer_server");
|
||||||
|
std::string server_user_id = "S-" + mac_addr_str;
|
||||||
|
Init(peer_server, server_user_id.c_str());
|
||||||
|
LOG_INFO("peer_server init finish");
|
||||||
|
|
||||||
|
peer_client = CreatePeer(&client_params);
|
||||||
|
LOG_INFO("Create peer_client");
|
||||||
|
std::string client_user_id = "C-" + mac_addr_str;
|
||||||
|
Init(peer_client, client_user_id.c_str());
|
||||||
|
LOG_INFO("peer_client init finish");
|
||||||
|
|
||||||
|
{
|
||||||
|
while (SignalStatus::SignalConnected != server_signal_status &&
|
||||||
|
!done) {
|
||||||
|
std::this_thread::sleep_for(std::chrono::seconds(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (done) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string user_id = "S-" + mac_addr_str;
|
||||||
|
is_create_connection =
|
||||||
|
CreateConnection(peer_server, mac_addr_str.c_str(),
|
||||||
|
input_password)
|
||||||
|
? false
|
||||||
|
: true;
|
||||||
|
|
||||||
|
nv12_buffer = new char[NV12_BUFFER_SIZE];
|
||||||
|
|
||||||
|
// Screen capture
|
||||||
|
screen_capturer_factory = new ScreenCapturerFactory();
|
||||||
|
screen_capturer = (ScreenCapturer
|
||||||
|
*)screen_capturer_factory->Create();
|
||||||
|
|
||||||
|
last_frame_time_ = std::chrono::high_resolution_clock::now();
|
||||||
|
ScreenCapturer::RECORD_DESKTOP_RECT rect;
|
||||||
|
rect.left = 0;
|
||||||
|
rect.top = 0;
|
||||||
|
rect.right = screen_w;
|
||||||
|
rect.bottom = screen_h;
|
||||||
|
|
||||||
|
screen_capturer->Init(
|
||||||
|
rect, 60,
|
||||||
|
[](unsigned char *data, int size, int width, int height) ->
|
||||||
|
void {
|
||||||
|
auto now_time = std::chrono::high_resolution_clock::now();
|
||||||
|
std::chrono::duration<double> duration =
|
||||||
|
now_time - last_frame_time_;
|
||||||
|
auto tc = duration.count() * 1000;
|
||||||
|
|
||||||
|
if (tc >= 0) {
|
||||||
|
SendData(peer_server, DATA_TYPE::VIDEO, (const char
|
||||||
|
*)data,
|
||||||
|
NV12_BUFFER_SIZE);
|
||||||
|
last_frame_time_ = now_time;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
screen_capturer->Start();
|
||||||
|
|
||||||
|
// Mouse control
|
||||||
|
device_controller_factory = new DeviceControllerFactory();
|
||||||
|
mouse_controller =
|
||||||
|
(MouseController *)device_controller_factory->Create(
|
||||||
|
DeviceControllerFactory::Device::Mouse);
|
||||||
|
mouse_controller->Init(screen_w, screen_h);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
screen_w, screen_h);
|
||||||
|
|
||||||
|
// Main loop
|
||||||
|
while (!done) {
|
||||||
|
// Start the Dear ImGui frame
|
||||||
|
ImGui_ImplSDLRenderer2_NewFrame();
|
||||||
|
ImGui_ImplSDL2_NewFrame();
|
||||||
|
ImGui::NewFrame();
|
||||||
|
|
||||||
|
if (joined && !menu_hovered) {
|
||||||
|
ImGui::SetMouseCursor(ImGuiMouseCursor_None);
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
menu_hovered = ImGui::IsWindowHovered();
|
static float f = 0.0f;
|
||||||
ImGui::Text(" LOCAL ID:");
|
static int counter = 0;
|
||||||
ImGui::SameLine();
|
|
||||||
ImGui::SetNextItemWidth(95);
|
|
||||||
ImGui::InputText(
|
|
||||||
"##local_id", (char *)mac_addr_str.c_str(),
|
|
||||||
mac_addr_str.length() + 1,
|
|
||||||
ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_ReadOnly);
|
|
||||||
|
|
||||||
ImGui::Text(" PASSWORD:");
|
const ImGuiViewport *main_viewport = ImGui::GetMainViewport();
|
||||||
ImGui::SameLine();
|
ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_Once);
|
||||||
ImGui::SetNextItemWidth(95);
|
ImGui::SetNextWindowSize(ImVec2(190, 200));
|
||||||
|
|
||||||
char input_password_tmp[7] = "";
|
ImGui::Begin("Menu", nullptr, ImGuiWindowFlags_NoResize);
|
||||||
strncpy(input_password_tmp, input_password, sizeof(input_password));
|
|
||||||
|
|
||||||
ImGui::InputTextWithHint("##server_pwd", "max 6 chars", input_password,
|
{
|
||||||
IM_ARRAYSIZE(input_password),
|
menu_hovered = ImGui::IsWindowHovered();
|
||||||
ImGuiInputTextFlags_CharsNoBlank);
|
ImGui::Text(" LOCAL ID:");
|
||||||
if (strcmp(input_password_tmp, input_password)) {
|
ImGui::SameLine();
|
||||||
cd_cache_file = fopen("cache.cd", "w+");
|
ImGui::SetNextItemWidth(95);
|
||||||
if (cd_cache_file) {
|
ImGui::InputText(
|
||||||
fseek(cd_cache_file, 0, SEEK_SET);
|
"##local_id", (char *)mac_addr_str.c_str(),
|
||||||
strncpy(cd_cache.password, input_password, sizeof(input_password));
|
mac_addr_str.length() + 1,
|
||||||
fwrite(&cd_cache.password, sizeof(cd_cache.password), 1,
|
ImGuiInputTextFlags_CharsUppercase |
|
||||||
cd_cache_file);
|
ImGuiInputTextFlags_ReadOnly);
|
||||||
fclose(cd_cache_file);
|
|
||||||
|
ImGui::Text(" PASSWORD:");
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::SetNextItemWidth(95);
|
||||||
|
|
||||||
|
char input_password_tmp[7] = "";
|
||||||
|
strncpy(input_password_tmp, input_password,
|
||||||
|
sizeof(input_password));
|
||||||
|
|
||||||
|
ImGui::InputTextWithHint("##server_pwd", "max 6 chars",
|
||||||
|
input_password,
|
||||||
|
IM_ARRAYSIZE(input_password),
|
||||||
|
ImGuiInputTextFlags_CharsNoBlank);
|
||||||
|
if (strcmp(input_password_tmp, input_password)) {
|
||||||
|
cd_cache_file = fopen("cache.cd", "w+");
|
||||||
|
if (cd_cache_file) {
|
||||||
|
fseek(cd_cache_file, 0, SEEK_SET);
|
||||||
|
strncpy(cd_cache.password, input_password,
|
||||||
|
sizeof(input_password)); fwrite(&cd_cache.password,
|
||||||
|
sizeof(cd_cache.password), 1,
|
||||||
|
cd_cache_file);
|
||||||
|
fclose(cd_cache_file);
|
||||||
|
}
|
||||||
|
LeaveConnection(peer_server);
|
||||||
|
CreateConnection(peer_server, mac_addr_str.c_str(),
|
||||||
|
input_password);
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::Spacing();
|
||||||
|
|
||||||
|
ImGui::Separator();
|
||||||
|
|
||||||
|
ImGui::Spacing();
|
||||||
|
{
|
||||||
|
{
|
||||||
|
static char remote_id[20] = "";
|
||||||
|
ImGui::Text("REMOTE ID:");
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::SetNextItemWidth(95);
|
||||||
|
ImGui::InputTextWithHint("##remote_id", mac_addr_str.c_str(),
|
||||||
|
remote_id, IM_ARRAYSIZE(remote_id),
|
||||||
|
ImGuiInputTextFlags_CharsUppercase |
|
||||||
|
ImGuiInputTextFlags_CharsNoBlank);
|
||||||
|
|
||||||
|
ImGui::Spacing();
|
||||||
|
|
||||||
|
ImGui::Text(" PASSWORD:");
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::SetNextItemWidth(95);
|
||||||
|
static char client_password[20] = "";
|
||||||
|
ImGui::InputTextWithHint("##client_pwd", "max 6 chars",
|
||||||
|
client_password,
|
||||||
|
IM_ARRAYSIZE(client_password),
|
||||||
|
ImGuiInputTextFlags_CharsNoBlank);
|
||||||
|
|
||||||
|
if (ImGui::Button(connect_label)) {
|
||||||
|
int ret = -1;
|
||||||
|
if ("ClientSignalConnected" == client_signal_status_str) {
|
||||||
|
if (strcmp(connect_label, "Connect") == 0 && !joined) {
|
||||||
|
std::string user_id = "C-" + mac_addr_str;
|
||||||
|
ret = JoinConnection(peer_client, remote_id,
|
||||||
|
client_password); if (0 == ret) {
|
||||||
|
// joined = true;
|
||||||
|
}
|
||||||
|
} else if (strcmp(connect_label, "Disconnect") == 0 &&
|
||||||
|
joined) {
|
||||||
|
ret = LeaveConnection(peer_client);
|
||||||
|
memset(audio_buffer, 0, 960);
|
||||||
|
if (0 == ret) {
|
||||||
|
joined = false;
|
||||||
|
received_frame = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 == ret) {
|
||||||
|
connect_button_pressed = !connect_button_pressed;
|
||||||
|
connect_label =
|
||||||
|
connect_button_pressed ? "Disconnect" : "Connect";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
LeaveConnection(peer_server);
|
|
||||||
CreateConnection(peer_server, mac_addr_str.c_str(), input_password);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::Spacing();
|
ImGui::Spacing();
|
||||||
@@ -709,164 +777,108 @@ int main() {
|
|||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
|
|
||||||
ImGui::Spacing();
|
ImGui::Spacing();
|
||||||
|
|
||||||
{
|
{
|
||||||
{
|
if (ImGui::Button("Resize Window")) {
|
||||||
static char remote_id[20] = "";
|
SDL_GetWindowSize(window, &window_w, &window_h);
|
||||||
ImGui::Text("REMOTE ID:");
|
|
||||||
ImGui::SameLine();
|
|
||||||
ImGui::SetNextItemWidth(95);
|
|
||||||
ImGui::InputTextWithHint("##remote_id", mac_addr_str.c_str(),
|
|
||||||
remote_id, IM_ARRAYSIZE(remote_id),
|
|
||||||
ImGuiInputTextFlags_CharsUppercase |
|
|
||||||
ImGuiInputTextFlags_CharsNoBlank);
|
|
||||||
|
|
||||||
ImGui::Spacing();
|
if (window_h != window_w * 9 / 16) {
|
||||||
|
window_w = window_h * 16 / 9;
|
||||||
ImGui::Text(" PASSWORD:");
|
|
||||||
ImGui::SameLine();
|
|
||||||
ImGui::SetNextItemWidth(95);
|
|
||||||
static char client_password[20] = "";
|
|
||||||
ImGui::InputTextWithHint("##client_pwd", "max 6 chars",
|
|
||||||
client_password,
|
|
||||||
IM_ARRAYSIZE(client_password),
|
|
||||||
ImGuiInputTextFlags_CharsNoBlank);
|
|
||||||
|
|
||||||
if (ImGui::Button(connect_label)) {
|
|
||||||
int ret = -1;
|
|
||||||
if ("ClientSignalConnected" == client_signal_status_str) {
|
|
||||||
if (strcmp(connect_label, "Connect") == 0 && !joined) {
|
|
||||||
std::string user_id = "C-" + mac_addr_str;
|
|
||||||
ret = JoinConnection(peer_client, remote_id, client_password);
|
|
||||||
if (0 == ret) {
|
|
||||||
// joined = true;
|
|
||||||
}
|
|
||||||
} else if (strcmp(connect_label, "Disconnect") == 0 && joined) {
|
|
||||||
ret = LeaveConnection(peer_client);
|
|
||||||
memset(audio_buffer, 0, 960);
|
|
||||||
if (0 == ret) {
|
|
||||||
joined = false;
|
|
||||||
received_frame = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (0 == ret) {
|
|
||||||
connect_button_pressed = !connect_button_pressed;
|
|
||||||
connect_label =
|
|
||||||
connect_button_pressed ? "Disconnect" : "Connect";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDL_SetWindowSize(window, window_w, window_h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ImGui::End();
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::Spacing();
|
// Rendering
|
||||||
|
ImGui::Render();
|
||||||
|
SDL_RenderSetScale(sdlRenderer, io.DisplayFramebufferScale.x,
|
||||||
|
io.DisplayFramebufferScale.y);
|
||||||
|
|
||||||
ImGui::Separator();
|
SDL_Event event;
|
||||||
|
while (SDL_PollEvent(&event)) {
|
||||||
ImGui::Spacing();
|
ImGui_ImplSDL2_ProcessEvent(&event);
|
||||||
|
if (event.type == SDL_QUIT) {
|
||||||
{
|
done = true;
|
||||||
if (ImGui::Button("Resize Window")) {
|
} else if (event.type == SDL_WINDOWEVENT &&
|
||||||
|
event.window.event == SDL_WINDOWEVENT_RESIZED) {
|
||||||
SDL_GetWindowSize(window, &window_w, &window_h);
|
SDL_GetWindowSize(window, &window_w, &window_h);
|
||||||
|
} else if (event.type == SDL_WINDOWEVENT &&
|
||||||
|
event.window.event == SDL_WINDOWEVENT_CLOSE &&
|
||||||
|
event.window.windowID == SDL_GetWindowID(window)) {
|
||||||
|
done = true;
|
||||||
|
} else if (event.type == REFRESH_EVENT) {
|
||||||
|
sdlRect.x = 0;
|
||||||
|
sdlRect.y = 0;
|
||||||
|
sdlRect.w = window_w;
|
||||||
|
sdlRect.h = window_h;
|
||||||
|
|
||||||
if (window_h != window_w * 9 / 16) {
|
SDL_UpdateTexture(sdlTexture, NULL, dst_buffer, pixel_w);
|
||||||
window_w = window_h * 16 / 9;
|
} else {
|
||||||
|
if (joined) {
|
||||||
|
ProcessMouseKeyEven(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_SetWindowSize(window, window_w, window_h);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::End();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rendering
|
|
||||||
ImGui::Render();
|
|
||||||
SDL_RenderSetScale(sdlRenderer, io.DisplayFramebufferScale.x,
|
|
||||||
io.DisplayFramebufferScale.y);
|
|
||||||
|
|
||||||
SDL_Event event;
|
|
||||||
while (SDL_PollEvent(&event)) {
|
|
||||||
ImGui_ImplSDL2_ProcessEvent(&event);
|
|
||||||
if (event.type == SDL_QUIT) {
|
|
||||||
done = true;
|
|
||||||
} else if (event.type == SDL_WINDOWEVENT &&
|
|
||||||
event.window.event == SDL_WINDOWEVENT_RESIZED) {
|
|
||||||
SDL_GetWindowSize(window, &window_w, &window_h);
|
|
||||||
} else if (event.type == SDL_WINDOWEVENT &&
|
|
||||||
event.window.event == SDL_WINDOWEVENT_CLOSE &&
|
|
||||||
event.window.windowID == SDL_GetWindowID(window)) {
|
|
||||||
done = true;
|
|
||||||
} else if (event.type == REFRESH_EVENT) {
|
|
||||||
sdlRect.x = 0;
|
|
||||||
sdlRect.y = 0;
|
|
||||||
sdlRect.w = window_w;
|
|
||||||
sdlRect.h = window_h;
|
|
||||||
|
|
||||||
SDL_UpdateTexture(sdlTexture, NULL, dst_buffer, pixel_w);
|
|
||||||
} else {
|
|
||||||
if (joined) {
|
|
||||||
ProcessMouseKeyEven(event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_RenderClear(sdlRenderer);
|
|
||||||
SDL_RenderCopy(sdlRenderer, sdlTexture, NULL, &sdlRect);
|
|
||||||
|
|
||||||
if (!joined || !received_frame) {
|
|
||||||
SDL_RenderClear(sdlRenderer);
|
SDL_RenderClear(sdlRenderer);
|
||||||
SDL_SetRenderDrawColor(
|
SDL_RenderCopy(sdlRenderer, sdlTexture, NULL, &sdlRect);
|
||||||
sdlRenderer, (Uint8)(clear_color.x * 0), (Uint8)(clear_color.y * 0),
|
|
||||||
(Uint8)(clear_color.z * 0), (Uint8)(clear_color.w * 0));
|
if (!joined || !received_frame) {
|
||||||
|
SDL_RenderClear(sdlRenderer);
|
||||||
|
SDL_SetRenderDrawColor(
|
||||||
|
sdlRenderer, (Uint8)(clear_color.x * 0), (Uint8)(clear_color.y *
|
||||||
|
0), (Uint8)(clear_color.z * 0), (Uint8)(clear_color.w * 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui_ImplSDLRenderer2_RenderDrawData(ImGui::GetDrawData());
|
||||||
|
SDL_RenderPresent(sdlRenderer);
|
||||||
|
|
||||||
|
frame_count++;
|
||||||
|
end_time = SDL_GetTicks();
|
||||||
|
elapsed_time = end_time - start_time;
|
||||||
|
if (elapsed_time >= 1000) {
|
||||||
|
fps = frame_count / (elapsed_time / 1000);
|
||||||
|
frame_count = 0;
|
||||||
|
window_title = "Remote Desk Client FPS [" + std::to_string(fps) +
|
||||||
|
"] status [" + server_signal_status_str + "|" +
|
||||||
|
client_signal_status_str + "|" +
|
||||||
|
server_connection_status_str + "|" +
|
||||||
|
client_connection_status_str + "]";
|
||||||
|
// For MacOS, UI frameworks can only be called from the main thread
|
||||||
|
SDL_SetWindowTitle(window, window_title.c_str());
|
||||||
|
start_time = end_time;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui_ImplSDLRenderer2_RenderDrawData(ImGui::GetDrawData());
|
// Cleanup
|
||||||
SDL_RenderPresent(sdlRenderer);
|
|
||||||
|
|
||||||
frame_count++;
|
if (is_create_connection) {
|
||||||
end_time = SDL_GetTicks();
|
LeaveConnection(peer_server);
|
||||||
elapsed_time = end_time - start_time;
|
|
||||||
if (elapsed_time >= 1000) {
|
|
||||||
fps = frame_count / (elapsed_time / 1000);
|
|
||||||
frame_count = 0;
|
|
||||||
window_title = "Remote Desk Client FPS [" + std::to_string(fps) +
|
|
||||||
"] status [" + server_signal_status_str + "|" +
|
|
||||||
client_signal_status_str + "|" +
|
|
||||||
server_connection_status_str + "|" +
|
|
||||||
client_connection_status_str + "]";
|
|
||||||
// For MacOS, UI frameworks can only be called from the main thread
|
|
||||||
SDL_SetWindowTitle(window, window_title.c_str());
|
|
||||||
start_time = end_time;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Cleanup
|
if (joined) {
|
||||||
|
LeaveConnection(peer_client);
|
||||||
|
}
|
||||||
|
|
||||||
if (is_create_connection) {
|
rtc_thread.join();
|
||||||
LeaveConnection(peer_server);
|
SDL_CloseAudioDevice(output_dev);
|
||||||
}
|
SDL_CloseAudioDevice(input_dev);
|
||||||
|
|
||||||
if (joined) {
|
mouse_controller->Destroy();
|
||||||
LeaveConnection(peer_client);
|
|
||||||
}
|
|
||||||
|
|
||||||
rtc_thread.join();
|
ImGui_ImplSDLRenderer2_Shutdown();
|
||||||
SDL_CloseAudioDevice(output_dev);
|
ImGui_ImplSDL2_Shutdown();
|
||||||
SDL_CloseAudioDevice(input_dev);
|
ImGui::DestroyContext();
|
||||||
|
|
||||||
mouse_controller->Destroy();
|
SDL_DestroyRenderer(sdlRenderer);
|
||||||
|
SDL_DestroyWindow(window);
|
||||||
|
|
||||||
ImGui_ImplSDLRenderer2_Shutdown();
|
SDL_CloseAudio();
|
||||||
ImGui_ImplSDL2_Shutdown();
|
SDL_Quit();
|
||||||
ImGui::DestroyContext();
|
|
||||||
|
|
||||||
SDL_DestroyRenderer(sdlRenderer);
|
|
||||||
SDL_DestroyWindow(window);
|
|
||||||
|
|
||||||
SDL_CloseAudio();
|
|
||||||
SDL_Quit();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -167,7 +167,7 @@ void ScreenCapturerWgc::OnFrame(const WgcSession::wgc_session_frame &frame) {
|
|||||||
if (_on_data)
|
if (_on_data)
|
||||||
BGRAToNV12FFmpeg((unsigned char *)frame.data, frame.width, frame.height,
|
BGRAToNV12FFmpeg((unsigned char *)frame.data, frame.width, frame.height,
|
||||||
nv12_frame_);
|
nv12_frame_);
|
||||||
_on_data(nv12_frame_, frame.width * frame.height * 4, frame.width,
|
_on_data(nv12_frame_, frame.width * frame.height * 3 / 2, frame.width,
|
||||||
frame.height);
|
frame.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
2
thirdparty/projectx
vendored
2
thirdparty/projectx
vendored
Submodule thirdparty/projectx updated: a309627ca3...f5586a7922
10
xmake.lua
10
xmake.lua
@@ -13,7 +13,7 @@ if is_mode("debug") then
|
|||||||
add_defines("REMOTE_DESK_DEBUG")
|
add_defines("REMOTE_DESK_DEBUG")
|
||||||
end
|
end
|
||||||
|
|
||||||
add_requires("sdl2", {system = false})
|
add_requires("sdl2 2.28.3", {system = false})
|
||||||
add_requires("spdlog 1.11.0", {system = false})
|
add_requires("spdlog 1.11.0", {system = false})
|
||||||
add_requires("imgui 1.89.9", {configs = {sdl2 = true, sdl2_renderer = true}})
|
add_requires("imgui 1.89.9", {configs = {sdl2 = true, sdl2_renderer = true}})
|
||||||
|
|
||||||
@@ -157,7 +157,7 @@ target("remote_desk")
|
|||||||
-- "-lxcb-shm", "-lXext", "-lX11", "-lXv", "-lpthread", "-lSDL2", "-lopenh264",
|
-- "-lxcb-shm", "-lXext", "-lX11", "-lXv", "-lpthread", "-lSDL2", "-lopenh264",
|
||||||
-- "-ldl", {force = true})
|
-- "-ldl", {force = true})
|
||||||
|
|
||||||
target("mouse_control")
|
-- target("mouse_control")
|
||||||
set_kind("binary")
|
-- set_kind("binary")
|
||||||
add_files("test/linux_mouse_control/mouse_control.cpp")
|
-- add_files("test/linux_mouse_control/mouse_control.cpp")
|
||||||
add_includedirs("test/linux_mouse_control")
|
-- add_includedirs("test/linux_mouse_control")
|
||||||
Reference in New Issue
Block a user