1 #define MOD_NAME "import_vnc.so" 2 #define MOD_VERSION "v0.0.3 (2007-07-15)" 3 #define MOD_CODEC "(video) VNC" 4 5 #include "transcode.h" 6 7 static int verbose_flag = TC_QUIET; 8 static int capability_flag = TC_CAP_VID | TC_CAP_RGB | TC_CAP_YUV; 9 10 #define MOD_PRE vnc 11 #include "import_def.h" 12 13 #include <sys/types.h> 14 #include <sys/wait.h> 15 16 #define TIMEOUT 5 17 /* seconds */ 18 19 #define PROGTOCALL "tcxpm2rgb" 20 21 static int pid; 22 static char fifo[256]; 23 24 /* ------------------------------------------------------------ 25 * 26 * open stream 27 * 28 * ------------------------------------------------------------*/ 29 30 MOD_open 31 { 32 if (param->flag == TC_VIDEO) { 33 char fps[32]; 34 char cmdbuf[1024]; 35 36 tc_snprintf (fifo, 256, "%s-%d", "/tmp/tc-vncfifo", getpid()); 37 tc_snprintf (fps, 32, "%f", vob->fps); 38 tc_snprintf (cmdbuf, 1024, "%s -o %s", PROGTOCALL, fifo); 39 40 mkfifo (fifo, 0600); 41 42 switch (pid = fork()) { 43 case 0: 44 { 45 int n=0; 46 const char *a[16]; 47 char *c = vob->im_v_string; 48 49 setenv("VNCREC_MOVIE_FRAMERATE", fps, 1); 50 setenv("VNCREC_MOVIE_CMD", cmdbuf, 1); 51 52 //close(STDOUT_FILENO); 53 //close(STDERR_FILENO); 54 55 a[n++] = "vncrec"; 56 a[n++] = "-movie"; 57 a[n++] = vob->video_in_file; 58 if ( vob->im_v_string) { 59 char *d = c; 60 while (1) { 61 if (c && *c) { 62 d = strchr (c, ' '); 63 if (d && *d) { *d = '\0'; 64 while (*c == ' ') c++; 65 a[n++] = c; 66 tc_log_info(MOD_NAME, "XX |%s|", c); 67 // FIXME: ??? - fromani 20051016 68 c = strchr(c, ' '); 69 } else { 70 tc_log_info(MOD_NAME, "XXXX |%s|", c); 71 // FIXME: ??? - fromani 20051016 72 a[n++] = c; 73 break; 74 } 75 } else { 76 d++; 77 while (*d == ' ') d++; 78 if (strchr(d, ' ')) *strchr(d, ' ') = '\0'; 79 a[n++] = d; 80 tc_log_info(MOD_NAME, "XXX |%s|", c); 81 // FIXME: ??? - fromani 20051016 82 break; 83 } 84 } 85 } 86 a[n++] = NULL; 87 if (execvp (a[0], (char **)&a[0])<0) { 88 tc_log_perror(MOD_NAME, "execvp vncrec failed. Is vncrec in your $PATH?"); 89 return (TC_IMPORT_ERROR); 90 } 91 } 92 break; 93 default: 94 break; 95 } 96 97 98 return (TC_IMPORT_OK); 99 } 100 return (TC_IMPORT_ERROR); 101 } 102 103 /* ------------------------------------------------------------ 104 * 105 * decode stream 106 * 107 * ------------------------------------------------------------*/ 108 109 110 MOD_decode 111 { 112 if (param->flag == TC_VIDEO) { 113 int fd; 114 int status, ret, wret; 115 fd_set rfds; 116 struct timeval tv; 117 int n; 118 119 while (1) { 120 121 // timeout to catch when vncrec died 122 tv.tv_sec = TIMEOUT; 123 tv.tv_usec = 0; 124 125 fd = open(fifo, O_RDONLY | O_NONBLOCK); 126 if (fd < 0) { tc_log_perror(MOD_NAME, "open"); break; } 127 128 FD_ZERO(&rfds); 129 FD_SET(fd, &rfds); 130 131 status = select(fd+1, &rfds, NULL, NULL, &tv); 132 133 if (status) { 134 135 if (FD_ISSET(fd, &rfds)) { 136 137 n = 0; 138 while (n < param->size) { 139 n += tc_pread(fd, param->buffer+n, param->size-n); 140 } 141 } 142 143 // valid frame in param->buffer 144 145 146 close(fd); 147 return (TC_IMPORT_OK); 148 } else { 149 kill(pid, SIGKILL); 150 wret = wait(&ret); 151 close(fd); 152 return (TC_IMPORT_ERROR); 153 } 154 155 close(fd); 156 return (TC_IMPORT_OK); 157 158 } 159 } 160 161 return (TC_IMPORT_ERROR); 162 } 163 164 165 /* ------------------------------------------------------------ 166 * 167 * close stream 168 * 169 * ------------------------------------------------------------*/ 170 171 MOD_close 172 { 173 if (param->flag == TC_VIDEO) { 174 int ret; 175 kill(pid, SIGKILL); 176 wait(&ret); 177 unlink (fifo); 178 } 179 180 return (TC_IMPORT_OK); 181 } 182