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