Угу. Спасибо.
v4l2-ctl откопал.
Опробовал и обнаружил несколько багов:
1. Вызов
Код:
v4l2-ctl -d /dev/video1 -l
сбивает настройки к настройкам по умолчанию. Может ваш баг, может баг v4l2-ctl.
2. Вышеприведенный скрипт конфигурирования периодически вываливается с
Код:
cat: /dev/video1: Input/output error
Контекст пока точно установить не могу.
3. Пытаюсь программно использовать
Streaming I/O (Memory Mapping). Опрос capabilities через VIDIOC_QUERYCAP показывает, что /dev/video1 поддерживает V4L2_CAP_VIDEO_CAPTURE и V4L2_CAP_STREAMING, то есть может работать в желаемом режиме. Формат V4L2_PIX_FMT_MPEG через VIDIOC_S_FMT также выставляется нормально. Но вот сделать VIDIOC_REQBUFS не удается, все-время возвращается EINVAL: и при V4L2_MEMORY_MMAP и при V4L2_MEMORY_USERPTR.
Поковырялся в ядре, обнаружил, что в функции
Код:
v4l2-ioctl.c: static int __video_do_ioctl(struct file *file, unsigned int cmd, void *arg)
выполняется проверка вида:
Код:
case VIDIOC_REQBUFS:
{
struct v4l2_requestbuffers *p = arg;
if (!ops->vidioc_reqbufs)
break;
ret = check_fmt(ops, p->type);
if (ret)
break;
...
табличный вызов empress_querybuf()
}
Где check_fmt выглядит так:
Код:
...
switch (type) {
...
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
if (ops->vidioc_try_fmt_vid_cap)
return 0;
break;
...
}
return -EINVAL;
Но для модуля saa7134_empress не определен табличный метод vidioc_try_fmt_vid_cap! И поэтому check_fmt возвращает -EINVAL, не давая тем самым запросить буферы.
4. Не пойму почему, но аппаратно-кодированная картинка в некоторых местах расплывается ("расквадрачивается") как если бы MPEG-поток был поврежден. Чаще это происходит в местах смены сцен (полное обновление изображения). Что-то не так с обсчетом I-кадров?
5. Все-таки в saa7134_empress.c реализованы далеко не все режимы оцифровки, доступные в BeholdTV. Я бы даже сказал, реализован только один режим - V4L2_MPEG_STREAM_TYPE_MPEG2_TS

А хочется, например, иметь еще как минимум V4L2_MPEG_STREAM_TYPE_MPEG2_DVD.
Еще было бы неплохо иметь возможность переключать кодер в MONO-режим по звуку, скажем с помощью настройки V4L2_CID_MPEG_AUDIO_MODE.
Версия ядра (Ubuntu 9.04 Alpha):
Код:
simba@simba-desktop:~$ uname -a
Linux simba-desktop 2.6.28-11-generic #36-Ubuntu SMP Fri Mar 20 19:40:40 UTC 2009 i686 GNU/Linux