working video backround + logging library
This commit is contained in:
+1
-1
@@ -1,4 +1,5 @@
|
||||
#include <limits.h>
|
||||
#include <log.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@@ -6,7 +7,6 @@
|
||||
|
||||
#include "args.h"
|
||||
#include "config.h"
|
||||
#include "logs.h"
|
||||
#include "string.h"
|
||||
#include "types.h"
|
||||
|
||||
|
||||
+1
-1
@@ -1,10 +1,10 @@
|
||||
#include <hashmap.h>
|
||||
#include <log.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "config_file.h"
|
||||
#include "file.h"
|
||||
#include "logs.h"
|
||||
#include "string.h"
|
||||
#include "types.h"
|
||||
|
||||
|
||||
+1
-3
@@ -1,13 +1,11 @@
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <log.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "file.h"
|
||||
#include "logs.h"
|
||||
#include "string.h"
|
||||
#include "types.h"
|
||||
|
||||
|
||||
+19
-13
@@ -1,13 +1,13 @@
|
||||
#include <linmath.h>
|
||||
#include <log.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "config_file.h"
|
||||
#include "file.h"
|
||||
#include "forge.h"
|
||||
#include "logs.h"
|
||||
#include "rand.h"
|
||||
#include "shaders.h"
|
||||
#include "timer.h"
|
||||
@@ -24,6 +24,7 @@ static File *fragment_shaders;
|
||||
static File common_shader_code;
|
||||
static Timer timer;
|
||||
static ConfigFile shader_config;
|
||||
static bool stop;
|
||||
|
||||
static unsigned int compute_fps() {
|
||||
static double fps;
|
||||
@@ -154,14 +155,12 @@ static void init_devices(char *video_in[MAX_VIDEO], unsigned int video_count) {
|
||||
}
|
||||
}
|
||||
|
||||
static void update_devices(unsigned int video_count) {
|
||||
static void start_devices(unsigned int video_count) {
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < video_count; i++) {
|
||||
if (!devices[i].error) {
|
||||
if (!video_read(&devices[i])) {
|
||||
video_free(devices[i]); // TODO hot reload of video
|
||||
}
|
||||
video_background_read(&devices[i], &stop);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -181,6 +180,7 @@ static void free_devices(unsigned int video_count) {
|
||||
static void error_callback(int error, const char *description) {
|
||||
log_error("[GLFW] %d: %s", error, description);
|
||||
window_terminate();
|
||||
stop = true;
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
@@ -199,7 +199,7 @@ static void key_callback(Window *window, int key,
|
||||
}
|
||||
}
|
||||
|
||||
static void loop(bool hr, unsigned int video_count) {
|
||||
static void loop(bool hr) {
|
||||
if (hr) {
|
||||
hot_reload();
|
||||
}
|
||||
@@ -208,8 +208,6 @@ static void loop(bool hr, unsigned int video_count) {
|
||||
|
||||
context.time = window_get_time();
|
||||
|
||||
update_devices(video_count);
|
||||
|
||||
if (window_output != NULL) {
|
||||
window_use(window_output, &context);
|
||||
|
||||
@@ -232,6 +230,8 @@ static void loop(bool hr, unsigned int video_count) {
|
||||
void forge_run(Parameters params) {
|
||||
unsigned int frag_count;
|
||||
|
||||
stop = false;
|
||||
|
||||
shader_config = config_file_read(params.frag_config_path, false);
|
||||
|
||||
frag_count = config_file_get_int(shader_config, "FRAG_COUNT", 6);
|
||||
@@ -279,13 +279,19 @@ void forge_run(Parameters params) {
|
||||
|
||||
timer = timer_init(30);
|
||||
|
||||
log_success("Initialized");
|
||||
start_devices(params.video_count);
|
||||
|
||||
log_info("Initialized");
|
||||
|
||||
while ((window_output == NULL || !window_should_close(window_output)) &&
|
||||
(window_monitor == NULL || !window_should_close(window_monitor))) {
|
||||
loop(params.hot_reload, params.video_count);
|
||||
loop(params.hot_reload);
|
||||
}
|
||||
|
||||
stop = true;
|
||||
|
||||
wait(NULL);
|
||||
|
||||
shaders_free(program);
|
||||
|
||||
if (window_output != NULL) {
|
||||
@@ -302,11 +308,11 @@ void forge_run(Parameters params) {
|
||||
|
||||
free_devices(params.video_count);
|
||||
|
||||
window_terminate();
|
||||
|
||||
free_context();
|
||||
|
||||
free_files(frag_count);
|
||||
|
||||
config_file_free(shader_config);
|
||||
|
||||
window_terminate();
|
||||
}
|
||||
-29
@@ -1,29 +0,0 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#ifndef LOG_H
|
||||
#define LOG_H
|
||||
|
||||
#define ANSI_COLOR_RED "\x1b[31m"
|
||||
#define ANSI_COLOR_GREEN "\x1b[32m"
|
||||
#define ANSI_COLOR_YELLOW "\x1b[33m"
|
||||
#define ANSI_COLOR_BLUE "\x1b[34m"
|
||||
#define ANSI_COLOR_MAGENTA "\x1b[35m"
|
||||
#define ANSI_COLOR_CYAN "\x1b[36m"
|
||||
#define ANSI_COLOR_RESET "\x1b[0m"
|
||||
|
||||
#define log_debug(format, ...) \
|
||||
fprintf(stderr, ANSI_COLOR_MAGENTA "[DEBG] " format ANSI_COLOR_RESET \
|
||||
"\n" __VA_OPT__(, ) __VA_ARGS__)
|
||||
#define log_success(format, ...) \
|
||||
fprintf(stdout, ANSI_COLOR_GREEN "[SUCC] " format ANSI_COLOR_RESET \
|
||||
"\n" __VA_OPT__(, ) __VA_ARGS__)
|
||||
#define log_info(format, ...) \
|
||||
fprintf(stdout, "[INFO] " format "\n" __VA_OPT__(, ) __VA_ARGS__)
|
||||
#define log_warn(format, ...) \
|
||||
fprintf(stderr, ANSI_COLOR_YELLOW "[WARN] " format ANSI_COLOR_RESET \
|
||||
"\n" __VA_OPT__(, ) __VA_ARGS__)
|
||||
#define log_error(format, ...) \
|
||||
fprintf(stderr, ANSI_COLOR_RED "[FAIL] " format ANSI_COLOR_RESET \
|
||||
"\n" __VA_OPT__(, ) __VA_ARGS__)
|
||||
|
||||
#endif /* LOG_H */
|
||||
@@ -1,4 +1,3 @@
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
@@ -18,14 +18,6 @@ void set_seed(unsigned long long seed) {
|
||||
(void)rand();
|
||||
}
|
||||
|
||||
unsigned char rand_uchar(const unsigned int max) {
|
||||
return max == 0 ? 0 : (unsigned char)(rand() % max);
|
||||
}
|
||||
|
||||
unsigned short rand_ushort(const unsigned int max) {
|
||||
return max == 0 ? 0 : (unsigned short)(rand() % max);
|
||||
}
|
||||
|
||||
unsigned int rand_uint(const unsigned int max) {
|
||||
return max == 0 ? 0 : (unsigned int)(rand() % max);
|
||||
}
|
||||
@@ -2,8 +2,6 @@
|
||||
#define RAND_H
|
||||
|
||||
void set_seed(unsigned long long seed);
|
||||
unsigned char rand_uchar(unsigned int max);
|
||||
unsigned short rand_ushort(unsigned int max);
|
||||
unsigned int rand_uint(unsigned int max);
|
||||
|
||||
#endif
|
||||
+7
-7
@@ -1,11 +1,11 @@
|
||||
#include <linmath.h>
|
||||
#include <log.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "config_file.h"
|
||||
#include "constants.h"
|
||||
#include "logs.h"
|
||||
#include "shaders.h"
|
||||
#include "types.h"
|
||||
|
||||
@@ -59,7 +59,7 @@ static void init_textures(ShaderProgram *program, Context context) {
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
|
||||
log_success("Texture %d initialized", i);
|
||||
log_info("Texture %d initialized", i);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ static void link_video_to_texture(ShaderProgram *program, VideoDevice *device,
|
||||
glEGLImageTargetTextureStorageEXT(program->textures[texture_index],
|
||||
(GLeglImageOES)device->dma_image, NULL);
|
||||
|
||||
log_success("Texture %d linked to %s", texture_index, device->name);
|
||||
log_info("Texture %d linked to %s", texture_index, device->name);
|
||||
}
|
||||
|
||||
static void init_videos(ShaderProgram *program, ConfigFile shader_config,
|
||||
@@ -162,7 +162,7 @@ static void init_framebuffers(ShaderProgram *program,
|
||||
return;
|
||||
}
|
||||
|
||||
log_success("Framebuffer %d initialized", i);
|
||||
log_info("Framebuffer %d initialized", i);
|
||||
}
|
||||
|
||||
return;
|
||||
@@ -211,7 +211,7 @@ static bool compile_shader(GLuint shader_id, char *name, char *source_code) {
|
||||
if (status_params == GL_FALSE) {
|
||||
log_error("Failed to compile\n%s", log);
|
||||
} else {
|
||||
log_success("Compilation successful");
|
||||
log_info("Compilation successful");
|
||||
}
|
||||
|
||||
return status_params == GL_TRUE;
|
||||
@@ -315,7 +315,7 @@ static void init_single_program(ShaderProgram *program, unsigned int i,
|
||||
program->vpos_locations[i] =
|
||||
glGetAttribLocation(program->programs[i], "vPos");
|
||||
|
||||
log_success("Program %d initialized", i + 1);
|
||||
log_info("Program %d initialized", i + 1);
|
||||
}
|
||||
|
||||
static void init_programs(ShaderProgram *program, ConfigFile shader_config) {
|
||||
@@ -401,7 +401,7 @@ void shaders_update(ShaderProgram program, File *fragment_shaders,
|
||||
if (result) {
|
||||
glLinkProgram(program.programs[i]);
|
||||
|
||||
log_success("Program %d updated", i + 1);
|
||||
log_info("Program %d updated", i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+23
-2
@@ -1,12 +1,14 @@
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <linux/videodev2.h>
|
||||
#include <log.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "logs.h"
|
||||
#include "types.h"
|
||||
#include "video.h"
|
||||
#include "window.h"
|
||||
|
||||
static void ioctl_error(VideoDevice *device, const char *operation,
|
||||
const char *default_msg) {
|
||||
@@ -238,7 +240,7 @@ VideoDevice video_init(char *name, unsigned int preferred_width,
|
||||
return device;
|
||||
}
|
||||
|
||||
bool video_read(VideoDevice *device) {
|
||||
static bool read_video(VideoDevice *device) {
|
||||
if (ioctl(device->fd, VIDIOC_DQBUF, &device->buf) == -1) {
|
||||
ioctl_error(device, "VIDIOC_DQBUF",
|
||||
"buffer type not supported or no buffer allocated or the index "
|
||||
@@ -256,6 +258,25 @@ bool video_read(VideoDevice *device) {
|
||||
return true;
|
||||
}
|
||||
|
||||
void video_background_read(VideoDevice *device, bool *stop) {
|
||||
pid_t pid;
|
||||
pid = fork();
|
||||
if (pid < 0) {
|
||||
log_error("Could not create subprocess");
|
||||
return;
|
||||
}
|
||||
if (pid == 0) {
|
||||
return;
|
||||
}
|
||||
log_info("%s background acquisition started (pid: %d)", device->name, pid);
|
||||
while (!*stop && read_video(device)) {
|
||||
// repeat infinitely
|
||||
}
|
||||
log_info("%s background acquisition stopped (pid: %d)", device->name, pid);
|
||||
window_terminate();
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
void video_free(VideoDevice device) {
|
||||
if (!device.error) {
|
||||
close_stream(device);
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
VideoDevice video_init(char *name, unsigned int preferred_width,
|
||||
unsigned int preferred_height);
|
||||
|
||||
bool video_read(VideoDevice *device);
|
||||
void video_background_read(VideoDevice *device, bool *stop);
|
||||
|
||||
void video_free(VideoDevice device);
|
||||
|
||||
|
||||
+3
-4
@@ -1,9 +1,8 @@
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <linmath.h>
|
||||
#include <log.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "logs.h"
|
||||
#include "types.h"
|
||||
#include "window.h"
|
||||
|
||||
@@ -22,7 +21,7 @@ static void init_glfw(void (*error_callback)(int, const char *)) {
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
log_success("[GLFS] Initialized...");
|
||||
log_info("[GLFS] Initialized...");
|
||||
}
|
||||
|
||||
static GLFWmonitor *get_monitor(unsigned char monitor_index) {
|
||||
@@ -76,7 +75,7 @@ create_window(GLFWmonitor *monitor, char *title, Window *shared_context,
|
||||
// hide cursor
|
||||
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
|
||||
|
||||
log_success("[GLFW] Window created");
|
||||
log_info("[GLFW] Window created");
|
||||
|
||||
return window;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user