Fix iron_sys_command on windows

This commit is contained in:
luboslenco
2025-08-11 17:19:13 +02:00
parent 78f5366e0b
commit 3ecb7a4989
+47 -28
View File
@@ -1033,13 +1033,13 @@ void hlsl_export2(char **vs, char **fs, api_kind d3d, bool debug);
void spirv_export2(char **vs, char **fs, int *vs_size, int *fs_size, bool debug);
static struct { char *key; name_id value; } *_clone_hash(struct { char *key; name_id value; } *hash) {
struct { char *key; name_id value; } *clone = NULL;
sh_new_arena(clone);
ptrdiff_t len = shlen(hash);
for (ptrdiff_t i = 0; i < len; i++) {
shput(clone, hash[i].key, hash[i].value);
}
return clone;
struct { char *key; name_id value; } *clone = NULL;
sh_new_arena(clone);
ptrdiff_t len = shlen(hash);
for (ptrdiff_t i = 0; i < len; i++) {
shput(clone, hash[i].key, hash[i].value);
}
return clone;
}
void gpu_create_shaders_from_kong(char *kong, char **vs, char **fs, int *vs_size, int *fs_size) {
@@ -1377,11 +1377,30 @@ void iron_file_save_bytes(string_t *path, buffer_t *bytes, u64 length) {
i32 iron_sys_command(string_t *cmd) {
#ifdef IRON_WINDOWS
int wlen = MultiByteToWideChar(CP_UTF8, 0, cmd, -1, NULL, 0);
wchar_t *wstr = malloc(sizeof(wchar_t) * wlen);
MultiByteToWideChar(CP_UTF8, 0, cmd, -1, wstr, wlen);
int result = _wsystem(wstr);
wchar_t comspec[MAX_PATH];
GetEnvironmentVariableW(L"ComSpec", comspec, MAX_PATH);
wchar_t cmdline[2048];
swprintf(cmdline, 2048, L"\"%s\" /c %s", comspec, wstr);
STARTUPINFO si;
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
PROCESS_INFORMATION pi;
memset(&pi, 0, sizeof(pi));
CreateProcessW(NULL, cmdline, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
free(wstr);
WaitForSingleObject(pi.hProcess, INFINITE);
DWORD exit_code = 0;
GetExitCodeProcess(pi.hProcess, &exit_code);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
int result = (int)exit_code;
#elif defined(IRON_IOS)
int result = 0;
#else
@@ -1584,9 +1603,9 @@ char *iron_read_directory(char *path) {
files[0] = 0;
directory dir = open_dir(path);
if (dir.handle == NULL) {
return files;
}
if (dir.handle == NULL) {
return files;
}
while (true) {
file f = read_next_file(&dir);
@@ -1776,23 +1795,23 @@ static char iron_mp4_path_264[512];
static char *iron_mp4_yuv_buf;
static size_t iron_mp4_get_nal_size(uint8_t *buf, size_t size) {
size_t pos = 3;
while ((size - pos) > 3) {
if (buf[pos] == 0 && buf[pos + 1] == 0 && buf[pos + 2] == 1) {
return pos;
size_t pos = 3;
while ((size - pos) > 3) {
if (buf[pos] == 0 && buf[pos + 1] == 0 && buf[pos + 2] == 1) {
return pos;
}
if (buf[pos] == 0 && buf[pos + 1] == 0 && buf[pos + 2] == 0 && buf[pos + 3] == 1) {
return pos;
if (buf[pos] == 0 && buf[pos + 1] == 0 && buf[pos + 2] == 0 && buf[pos + 3] == 1) {
return pos;
}
pos++;
}
return size;
pos++;
}
return size;
}
static int iron_mp4_write_callback(int64_t offset, const void *buffer, size_t size, void *token) {
FILE *f = (FILE *)token;
fseek(f, offset, SEEK_SET);
return fwrite(buffer, 1, size, f) != size;
FILE *f = (FILE *)token;
fseek(f, offset, SEEK_SET);
return fwrite(buffer, 1, size, f) != size;
}
void iron_mp4_begin(char *path, i32 w, i32 h) {
@@ -1815,8 +1834,8 @@ void iron_mp4_begin(char *path, i32 w, i32 h) {
H264E_sizeof(&create_param, &sizeof_persist, &sizeof_scratch);
iron_mp4_enc = (H264E_persist_t *)malloc(sizeof_persist);
iron_mp4_scratch = (H264E_scratch_t *)malloc(sizeof_scratch);
H264E_init(iron_mp4_enc, &create_param);
iron_mp4_scratch = (H264E_scratch_t *)malloc(sizeof_scratch);
H264E_init(iron_mp4_enc, &create_param);
iron_mp4_fp = fopen(iron_mp4_path_264, "wb");
int frame_size = (int)(iron_mp4_w * iron_mp4_h * 1.5);
@@ -1881,7 +1900,7 @@ void iron_mp4_encode(buffer_t *pixels) {
H264E_run_param_t run_param = {0};
run_param.frame_type = 0;
run_param.encode_speed = H264E_SPEED_SLOWEST; // H264E_SPEED_FASTEST;
run_param.encode_speed = H264E_SPEED_SLOWEST; // H264E_SPEED_FASTEST;
run_param.desired_frame_bytes = (2048 * 4) * 1000 / 8 / 30; // 2048 * 4 kbps
run_param.qp_min = 10;
run_param.qp_max = 50;
@@ -1889,9 +1908,9 @@ void iron_mp4_encode(buffer_t *pixels) {
H264E_io_yuv_t yuv;
yuv.yuv[0] = iron_mp4_yuv_buf;
yuv.stride[0] = iron_mp4_w;
yuv.yuv[1] = iron_mp4_yuv_buf + iron_mp4_w * iron_mp4_h;
yuv.yuv[1] = iron_mp4_yuv_buf + iron_mp4_w * iron_mp4_h;
yuv.stride[1] = iron_mp4_w / 2;
yuv.yuv[2] = iron_mp4_yuv_buf + (int)(iron_mp4_w * iron_mp4_h * 1.25);
yuv.yuv[2] = iron_mp4_yuv_buf + (int)(iron_mp4_w * iron_mp4_h * 1.25);
yuv.stride[2] = iron_mp4_w / 2;
uint8_t *coded_data;