summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--sv.c86
1 files changed, 70 insertions, 16 deletions
diff --git a/sv.c b/sv.c
index 7cdfa20..ba27f92 100644
--- a/sv.c
+++ b/sv.c
@@ -6,6 +6,7 @@
 #include <pthread.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/time.h>
 #include <unistd.h>
 #include <alsa/asoundlib.h>
 
@@ -16,8 +17,8 @@
 
 #define MIDICHK(stmt, msg) if((stmt) < 0) {puts("ERROR: "#msg); exit(1);}
 
-int width = 1918;
-int height = 1078;
+int width = 1920;
+int height = 1080;
 GLFWwindow* window;
 GLuint vertex;
 GLuint fragment;
@@ -55,12 +56,20 @@ static int midiin;
 int ticks =0;
 int running = 0;
 int program=0;
+int frame = 0;
+unsigned char buffer[1920*1080*4];
+struct arg_struct {
+  unsigned char buffer[1920*1080*4];
+    int frame;
+};
 
-void screenshot() {
+void *screenshot(void * f) {
   unsigned char pixels[width*height*4];
-  time_t current_time = time(NULL);
-  char output_file[25];
-  strftime(output_file, 25, "%Y-%m-%d_%H%M%S.png", localtime(&current_time));
+  //time_t current_time = time(NULL);
+  //char output_file[25];
+  char output_file[20];
+  //strftime(output_file, 25, "%Y-%m-%d_%H%M%S.png", localtime(&current_time));
+  sprintf(output_file, "record/%i.png",*(int*)f);
   glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
 
   // Flip the image on Y
@@ -76,14 +85,35 @@ void screenshot() {
       }
    }
   }
+  printf("%s\n",output_file);
   if (0 == stbi_write_png(output_file, width, height, 4, pixels, width * 4)) { printf("can't create file %s",output_file); }
 }
 
+void *save(void * b) {
+      //struct arg_struct args;
+      //glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
+  char output_file[20];
+  sprintf(output_file, "record/%i.png",frame);
+  printf("%ix%i\n",width,height);
+  printf("%s\n",output_file);
+  int r = stbi_write_png(output_file, width, height, 4, buffer, width * 4);
+  printf("%s\n",output_file);
+  printf("%i\n",r);
+  //struct arg_struct *args = arguments;
+  //char output_file[20];
+  //sprintf(output_file, "record/%i.png",frame);
+  //printf("%s\n",output_file);
+  //int r = stbi_write_png(output_file, width, height, 4, buffer, width * 4);
+  //printf("%i\n",r);
+  //if (0 == stbi_write_png(output_file, width, height, 4, buffer, width * 4)) { printf("can't create file %s",output_file); }
+  return(NULL);
+}
+
 static void error_callback(int error, const char* description) { fputs(description, stderr); }
 
 static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
     if (key == GLFW_KEY_Q && action == GLFW_PRESS) glfwSetWindowShouldClose(window, GL_TRUE);
-    else if (key == GLFW_KEY_SPACE && action == GLFW_PRESS) screenshot();
+    //else if (key == GLFW_KEY_SPACE && action == GLFW_PRESS) screenshot();
 }
 
 const char * readShader(char * path) {
@@ -148,7 +178,6 @@ void createShader() {
 
 void imageUniforms(int i) {
   glUniform1i(glGetUniformLocation(shader.id, "images")+i,i);
-  //glUniform1f(glGetUniformLocation(shader.id, "ratios")+i,images[i].ratio);
 }
 
 void resize_callback(GLFWwindow* window, int w, int h) {
@@ -164,8 +193,6 @@ void readImage(int i) {
   int w,h,comp;
   stbi_set_flip_vertically_on_load(1);
   unsigned char* pixels = stbi_load(images[i].path, &w, &h, &comp, STBI_rgb_alpha);
-
-  //images[i].ratio = (float) w/h;
   imageUniforms(i);
 
   glActiveTexture(GL_TEXTURE0+i);
@@ -206,12 +233,15 @@ void *readMidi() {
     else if(ev->type == SND_SEQ_EVENT_START) {
       running = 1;
       if (record) {
+      /*
         time_t current_time = time(NULL);
         char output_file[25];
-        strftime(output_file, 25, "%Y-%m-%d_%H%M%S.mp4", localtime(&current_time));
+        strftime(output_file, 25, "%Y-%m-%d_%H%M%S.mkv", localtime(&current_time));
         char cmd[250];
-        sprintf(cmd, "ffmpeg -r 60 -f rawvideo -pix_fmt rgba -s %ix%i -i - -threads 0 -preset veryfast -y -pix_fmt yuv420p -c:v libx264 -crf 18 -vf vflip %s",width,height,output_file);
+        sprintf(cmd, "ffmpeg -framerate 60 -f rawvideo -pix_fmt rgba -s %ix%i -i - -preset ultrafast -y -c:v libx264 -crf 0 -vf vflip %s",width,height,output_file);
         ffmpeg = popen(cmd, "w");
+        */
+        frame = 0;
         recording = 1;
       }
     }
@@ -219,7 +249,7 @@ void *readMidi() {
       running = 0;
       if (recording) {
         recording = 0;
-        pclose(ffmpeg);
+        //pclose(ffmpeg);
       }
     }
     else if(ev->type == SND_SEQ_EVENT_CONTINUE)
@@ -292,6 +322,8 @@ int main(int argc, char **argv) {
   pthread_t frag_t;
   pthread_create(&frag_t, NULL, watchShader, NULL);
 
+  int n = 0;
+  printf("%ix%i\n",width,height);
   while (!glfwWindowShouldClose(window)) {
     if (shader.new) {
       createShader();
@@ -308,15 +340,37 @@ int main(int argc, char **argv) {
 
     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
     glfwSwapBuffers(window);
+
     if (recording) {
-      unsigned char buffer[width*height*4];
+    /*
+      pid_t pid = fork();
+      if (pid == 0) {
+        unsigned char buffer[width*height*4];
+      //struct arg_struct args;
+        glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
+        char output_file[20];
+        sprintf(output_file, "record/%i.png",frame);
+        printf("%s\n",output_file);
+        int r = stbi_write_png(output_file, width, height, 4, buffer, width * 4);
+        printf("%i\n",r);
+        exit(EXIT_SUCCESS);
+      }
+      */
+      //args.buffer = buffer;
+      //args.frame = frame;
       glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
-      fwrite(buffer, sizeof(int)*width*height, 1, ffmpeg);
+      pthread_t tid;
+      pthread_create (&tid, NULL, save, NULL);
+      pthread_detach (tid);
+      //printf("%i\n",frame);
+      frame++;
+      //fwrite(buffer, sizeof(int)*width*height, 1, ffmpeg);
     }
+
     glfwPollEvents();
   }
 
-  if (recording) pclose(ffmpeg);
+  //if (recording) pclose(ffmpeg);
   pthread_cancel(midiin_t);
   pthread_cancel(frag_t);
   glfwDestroyWindow(window);