diff options
Diffstat (limited to 'debian/transcode/transcode-1.1.7/import/import_vnc.c')
| -rw-r--r-- | debian/transcode/transcode-1.1.7/import/import_vnc.c | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/debian/transcode/transcode-1.1.7/import/import_vnc.c b/debian/transcode/transcode-1.1.7/import/import_vnc.c new file mode 100644 index 00000000..fd3e4c77 --- /dev/null +++ b/debian/transcode/transcode-1.1.7/import/import_vnc.c @@ -0,0 +1,181 @@ +#define MOD_NAME "import_vnc.so" +#define MOD_VERSION "v0.0.3 (2007-07-15)" +#define MOD_CODEC "(video) VNC" + +#include "transcode.h" + +static int verbose_flag = TC_QUIET; +static int capability_flag = TC_CAP_VID | TC_CAP_RGB | TC_CAP_YUV; + +#define MOD_PRE vnc +#include "import_def.h" + +#include <sys/types.h> +#include <sys/wait.h> + +#define TIMEOUT 5 +/* seconds */ + +#define PROGTOCALL "tcxpm2rgb" + +static int pid; +static char fifo[256]; + +/* ------------------------------------------------------------ + * + * open stream + * + * ------------------------------------------------------------*/ + +MOD_open +{ + if (param->flag == TC_VIDEO) { + char fps[32]; + char cmdbuf[1024]; + + tc_snprintf (fifo, 256, "%s-%d", "/tmp/tc-vncfifo", getpid()); + tc_snprintf (fps, 32, "%f", vob->fps); + tc_snprintf (cmdbuf, 1024, "%s -o %s", PROGTOCALL, fifo); + + mkfifo (fifo, 0600); + + switch (pid = fork()) { + case 0: + { + int n=0; + const char *a[16]; + char *c = vob->im_v_string; + + setenv("VNCREC_MOVIE_FRAMERATE", fps, 1); + setenv("VNCREC_MOVIE_CMD", cmdbuf, 1); + + //close(STDOUT_FILENO); + //close(STDERR_FILENO); + + a[n++] = "vncrec"; + a[n++] = "-movie"; + a[n++] = vob->video_in_file; + if ( vob->im_v_string) { + char *d = c; + while (1) { + if (c && *c) { + d = strchr (c, ' '); + if (d && *d) { *d = '\0'; + while (*c == ' ') c++; + a[n++] = c; + tc_log_info(MOD_NAME, "XX |%s|", c); + // FIXME: ??? - fromani 20051016 + c = strchr(c, ' '); + } else { + tc_log_info(MOD_NAME, "XXXX |%s|", c); + // FIXME: ??? - fromani 20051016 + a[n++] = c; + break; + } + } else { + d++; + while (*d == ' ') d++; + if (strchr(d, ' ')) *strchr(d, ' ') = '\0'; + a[n++] = d; + tc_log_info(MOD_NAME, "XXX |%s|", c); + // FIXME: ??? - fromani 20051016 + break; + } + } + } + a[n++] = NULL; + if (execvp (a[0], (char **)&a[0])<0) { + tc_log_perror(MOD_NAME, "execvp vncrec failed. Is vncrec in your $PATH?"); + return (TC_IMPORT_ERROR); + } + } + break; + default: + break; + } + + + return (TC_IMPORT_OK); + } + return (TC_IMPORT_ERROR); +} + +/* ------------------------------------------------------------ + * + * decode stream + * + * ------------------------------------------------------------*/ + + +MOD_decode +{ + if (param->flag == TC_VIDEO) { + int fd; + int status, ret, wret; + fd_set rfds; + struct timeval tv; + int n; + + while (1) { + + // timeout to catch when vncrec died + tv.tv_sec = TIMEOUT; + tv.tv_usec = 0; + + fd = open(fifo, O_RDONLY | O_NONBLOCK); + if (fd < 0) { tc_log_perror(MOD_NAME, "open"); break; } + + FD_ZERO(&rfds); + FD_SET(fd, &rfds); + + status = select(fd+1, &rfds, NULL, NULL, &tv); + + if (status) { + + if (FD_ISSET(fd, &rfds)) { + + n = 0; + while (n < param->size) { + n += tc_pread(fd, param->buffer+n, param->size-n); + } + } + + // valid frame in param->buffer + + + close(fd); + return (TC_IMPORT_OK); + } else { + kill(pid, SIGKILL); + wret = wait(&ret); + close(fd); + return (TC_IMPORT_ERROR); + } + + close(fd); + return (TC_IMPORT_OK); + + } + } + + return (TC_IMPORT_ERROR); +} + + +/* ------------------------------------------------------------ + * + * close stream + * + * ------------------------------------------------------------*/ + +MOD_close +{ + if (param->flag == TC_VIDEO) { + int ret; + kill(pid, SIGKILL); + wait(&ret); + unlink (fifo); + } + + return (TC_IMPORT_OK); +} |
