2004年10月4日月曜日

GV-1394TVでのキャプチャ(その2)


GV-1394TVからffmpegで直接mpeg2/4がとれないかなぁと試してみた。




hcube:/home/DV# ffmpeg -dv1394 dada.avi
ffmpeg version 0.4.9-pre1, build 4718, Copyright (c) 2000-2004 Fabrice Bellard
built on Sep 12 2004 09:27:55, gcc: 3.3.4 (Debian 1:3.3.4-11)
Failed to initialize DV interface: Invalid argument
Could not find video grab device

うーん、なんじゃそれ。



ffmpeg-cvs-2004-07-12/libavformat/dv1394.cを見てみた。


/* Open and initialize DV1394 device */
video_device = ap->device;
if (!video_device)
video_device = "/dev/dv1394/0";
dv->fd = open(video_device, O_RDONLY);
if (dv->fd < 0) {
perror("Failed to open DV interface");
goto failed;
}

if (dv1394_reset(dv) < 0) {
perror("Failed to initialize DV interface");
goto failed;
}

openはうまくいっていて、その次が問題みたいだ。



dv1394_reset()を見てみると、


/*
* The trick here is to kludge around well known problem with kernel Ooopsing
* when you try to capture PAL on a device node configure for NTSC. That's
* why we have to configure the device node for PAL, and then read only NTSC
* amount of data.
*/
static int dv1394_reset(struct dv1394_data *dv)
{
struct dv1394_init init;

init.channel = dv->channel;
init.api_version = DV1394_API_VERSION;
init.n_frames = DV1394_RING_FRAMES;
init.format = DV1394_PAL;

if (ioctl(dv->fd, DV1394_INIT, &init) < 0)
return -1;

dv->avail = dv->done = 0;
return 0;
}

PALとして埋め込んでみるみたいだし、動いているのかなぁ(^^;。






dvts1.0b/dvrecv/ieee1394-linux.cを見てみると、


int
prepare_ieee1394 (struct dvrecv_param *dvrecv_param)
{
int fd;
fd = open(dvrecv_param->ieee1394dv.devname, O_RDWR);
if (fd < 0) {
printf("failed to open device : %s\n", dvrecv_param->ieee1394dv.devname);
return(-1);
}
dv1394_init_param.api_version = DV1394_API_VERSION;
dv1394_init_param.channel = 63;
dv1394_init_param.n_frames = 2;
dv1394_init_param.cip_n = 0;
dv1394_init_param.cip_d = 0;
dv1394_init_param.syt_offset = 0;
if (dvrecv_param->format == DV_FORMAT_NTSC) {
dv1394_init_param.format = DV1394_NTSC;
} else if (dvrecv_param->format == DV_FORMAT_PAL) {
dv1394_init_param.format = DV1394_PAL;
} else {
return(-1);
}
if (ioctl(fd, DV1394_INIT, &dv1394_init_param) < 0) {
perror("ioctl DV1394_INIT");
printf("channel : %d\n", dv1394_init_param.channel);
printf("n_frames : %d\n", dv1394_init_param.n_frames);
return(-1);
}
dvrecv_param->ieee1394dv.fd1394 = fd;
return(1);
}

このあたりから持ってくればいいかなぁ。


1 件のコメント:

  1. うーん、そもそもdvtsがきちんと動かない(^^;
    dvgrabは動くんだけど、c++で書いてあって
    私には解読が面倒。
    時間かかりそうだなぁ。根気が続くかなぁ。

    返信削除