You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
182 lines
3.4 KiB
182 lines
3.4 KiB
#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);
|
|
}
|