summaryrefslogtreecommitdiffstats
path: root/debian/transcode/transcode-1.1.7/import/import_vnc.c
diff options
context:
space:
mode:
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.c181
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);
+}