Fix iron_sys_command on windows
This commit is contained in:
+47
-28
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user