Multiproto

Материал из RuVDRWiki

Перейти к: навигация, поиск

Multiproto (автор Manu Abraham) это версия 3.3 для Linux DVB API, которая включает в себя расширения для карт, которые поддерживают сразу несколько DVB протоколов (DVB-S, DVB-S2, DVB-T, DVB-C, DVB-H, ATSC, DSS).

Это - экспериментальный проект и в настоящее время multiproto нет в ядре. Предварительный (и очень оптимистичный) срок включения (merge) multiproto в ядро - это версия 2.6.26 (лето 2008). No firm plan has been made for its inclusion in Linux.

Имеется также разновидность multiproto - multiproto_plus

Содержание

Технические детали

Новые structs и enums были добавлены в API для frontends, а также были добавлены новые параметры, требуемые для протоколов DVB-S, DSS, DVB-S2, DVB-T, DVB-H и ATSC. Они имеют префиксы (по крайней мере - сейчас) "dvbfe_" and "DVBFE_" в противоположность старым "fe_" и "FE_". Детальные различия вы найдете, сравнив старый и новый файл include/linux/dvb/frontend.h. В настоящее время multiproto поддерживает оба - и старый и новый API, как связующее звено для управления старыми/новыми драйверами с новыми/старыми API-запросами. Вероятно, что планируется окончательно перейти на чистый API 3.3 и обновить все драйвера.

На первый взгляд - достаточно легко, можете подумать вы - но прогресс на самом деле оказался очень медленным. Начиная с первой версии multiproto в Апреле 2006 г., уже вышло 8 версий Linux kernel. Смотри http://www.linuxtv.org/pipermail/linux-dvb/2006-April/009522.html и http://kernelnewbies.org/Linux26Changes.

Оценка текущего состояния и Альтернатива multiproto

1. В multiproto API имеются повторы (repetition) arising from the use of unions of structs to hold parameters (often the same ones) for each type of frontend. Тем не менее, API-вызовы (например, ioctl dvbfe_params) адресованы к индивидуальному frontend /dev/dvb/adapterN/frontendN , так что повторы могут быть удалены, чтобы "подчистить" API. Для примера - вот эти параметры

dvbfe_params.delsys.dvbs.fec
dvbfe_params.delsys.dss.fec
dvbfe_params.delsys.dvbs2.fec
dvbfe_params.delsys.dvbc.fec

могут быть заменены одним

dvbfe_params.fec

Аналогично - для прочих переменных.

2. Имеющиеся проблемы при разработке multiproto API. Обычно DVBFE_GET_INFO изменяет состояние kernel (в особенности, переменные которые управляют the delivery system). Простой вызов DVBFE_SET_PARAMS с установленными правильными параметрами не работает. Соответствующий странный userspace code вы найдете в патченном http://abraham.manu.googlepages.com/szap.c где DVBFE_GET_INFO используется, чтобы установить переменную the delivery system перед тем как вызвать DVBFE_SET_PARAMS. Такое странное и неожиданное поведение очень смущает, и не может быть допущено в Linux kernel. По меньшей мере, некоторая работа должна быть выполнена, чтобы тщательно переименовать routines. DVBFE_GET_INFO первоначально была предназначена для обеспечения информацией о возможностях frontend. Смотри дискуссии в linux DVB mailing list

http://www.linuxtv.org/pipermail/linux-dvb/2008-March/024266.html 
http://www.linuxtv.org/pipermail/linux-dvb/2008-March/024281.html

Альтернатива: Альтернативное API было создано для Hauppauge WinTV-HVR-4000, в котором имеется минимальное количество изменений по сравнению с текущим v4l-dvb API, для того, чтобы обеспечить multifrontend-поддержку для DVB-T, DVB-S и DVB-S2 устройств. Данная версия API обратно совместима с существующими binary multimedia приложениями для DVB-T и DVB-S без необходимости из рекомпиляции. Имеются патчи, обеспечивающие поддержку DVB-S2 для szap и Mythtv. Смотри

http://dev.kewl.org/hauppauge/experimental/
http://dev.kewl.org/hauppauge
http://www.linuxtv.org/pipermail/linux-dvb/2008-March/024243.html

Статус и план миграции в kernel

Пока нет четкого и ясного плана миграции в kernel (только неофициальная информация о возможности merge в 2.6.26 версию)

Работаем с multiproto

Альтернативное описание установки multiproto на базе multiproto_plus описано здесь

Качаем

hg clone http://jusst.de/hg/multiproto

или

http://jusst.de/hg/multiproto/archive/tip.tar.bz2

Репозитарий multiproto поддерживает систему управления версиями - Mercurial - коротко HG (см. ссылки). Установив на свой комп консольную утилиту hg вы сможете скачать, обновлять мультипрото. Вот несколько примеров

hg clone http://jusst.de/hg/multiproto (скачать) hg pull -u (обновить) hg revert --all (получить исходные файлы из репозитария, которые были изменены пользователем на компе - полезно использовать эту команду при повторных патчах, когда патчить надо исходную версию файла, а она уже была изменена предыдущим старым патчем)

Если у вас 2.6.24 kernel, и у вас есть проблемы при компиляции и установке мультипрото, воспользуйтесь патчем

http://linuxtv.org/hg/v4l-dvb/rev/b0815101889d

Patch download link:

http://linuxtv.org/hg/v4l-dvb/raw-diff/b0815101889d/v4l/compat.h

Сам автор его Manu Abraham практически каждый день доступен на irc канале #linuxtv сервера irc.freenode.net - вы можете пообщаться с ним в прямом эфире. На этом же irc сервере есть и другой канал, посвященный нашему проекту - #ruVDR , так что милости просим пообщаться.


Drivers

В настоящее время в kernel отсутствуют multiproto drivers. Имеется несколько карт, которые поддерживаются multiproto, возможно с дополнительными патчами.

Описания следующих карт:

Azurewave AD-SP400 CI (Twinhan VP-1041)

Hauppauge WinTV-HVR-4000

KNC1 DVB-S2 TV Station (PCI32, supports CI)

TechnoTrend TT-budget S2-3200

TerraTec Cinergy S2 PCI HD CI (PCI32, CI)


Пример kernel output

provide the relevant portion of dmesg here

Tuner / DiSEqC / Player support

Сканирование и настройка на транспондеры обычно не будет работать, с обновленным API, пока приложения не будут обновлены на предмет совместимости с multiproto. Ситуация возможно улучшится, но отсутствие уже пропатченных приложений (и руководства по наложению патчей для них) блокирует тестирование и окончание работы над multiproto и новыми устройствами, а также адаптацию их к новому API. Нелишне будет сказать, что наложение патчей на драйвера и приложения достаточно сложный шаг для большинства потенциальных тестеров.

dvb-apps (szap2, scan)

scan : Пропатченная для dvb-s2 версия

szap: Патченный szap2 с марта 2008г. находится в [dvb-apps] Вы найдете его в /dvb-apps/test/szap2]]. Также обновлены DVB-кернел-заголовки в dvb-apps/include/*, которые надо скопировать в /usr/include/linux/dvb/ , предварительно сохранив старые версии файлов. Речь идет про вот эти DVB-kernel-headers


audio.h
ca.h
dmx.h
frontend.h
net.h
osd.h
version.h
video.h

Multimedia приложения

MPlayer : Нет поддержки Multiproto

Kaffeine ???

VDR : VDR version 1.5.18/1.6.0. Для работы с текущей (мартовской) версией multiproto необходимо наложить один из патчей от Reinhard Nissl (vdr-1.5.18-h264-syncearly-framespersec-audioindexer-fielddetection-speedup.diff.bz2, который внедряет в VDR только поддержку работы с h.264 потоками (DVB-S, DVB-T, DVB-C) или vdr-1.5.18-dvbs2-h264-syncearly-framespersec-audioindexer-fielddetection-speedup.diff.bz2, который внедряет в VDR поддержку dvb-s2 & h.264). В начале апреля Reinhard Nissl выпустил маленький fix-патч, который тоже надо установить после установки основного патча. В версии VDR 1.7.0 (ориентировочно - апрель 2008) планируется native-поддержка multiproto, без наложения каких-либо патчей.

MythTV : Два патча (один DVB-S/S2, другой DVB-S только) вы найдете http://www.linuxtv.org/pipermail/linux-dvb/2008-January/022757.html

dvbstream : Неоходимо написать патч... Почему бы не вам ? Смотри http://www.linuxtv.org/pipermail/linux-dvb/2008-February/024056.html

provide details of how to use with DiSEqC -- this means you

Как накладывать патчи для приложений для совместимости их с Multiproto

provide guidance on patching applications to use multiproto -- this means you

Настройка на канал : используя патченый szap2 мы видим, что

struct dvb_frontend_parameters tuneto;
...
ioctl(fefd, FE_SET_FRONTEND, &tuneto);

должен быть заменен на

struct dvbfe_params fe_params;
...
ioctl(fefd, DVBFE_SET_PARAMS, &fe_params);

где часть dvbfe_params.delsys relevant for the delivery system used (DVB-S/DSS/DVB-S2) need to be set before the call.

To make the userspace code a lot cleaner C preprocessor macros can be used to hide the full details of the multiproto api - here is a short example:

#if (DVB_API_VERSION==3) && (DVB_API_VERSION_MINOR>=3)
#define FE_PARAM                struct dvbfe_params
#define IOCTL_SET_FE            DVBFE_SET_PARAMS
#define DVB_SET_DELIVERY(a, b)  (a)->delivery=(b)
#define DVBC_SET_SYMBOLRATE(a, b)       (a)->delsys.dvbc.symbol_rate=(b)
#else
#define FE_PARAM                struct dvb_frontend_parameters
#define IOCTL_SET_FE            FE_SET_FRONTEND
#define DVB_SET_DELIVERY(a, b)  do{ } while(0)
#define DVBC_SET_SYMBOLRATE(a, b)       (a)->u.qam.symbol_rate=(b)
#endif

void tune(int fefd) {
 FE_PARAM        fparm;
 
 memset(&fparm, 0, sizeof(FE_PARM));
 
 DVB_SET_DELIVERY(&fparm, DVBFE_DELSYS_DVBC);
 ...
 DVBC_SET_SYMBOLRATE(&fparm, symbolrate)
 
 if (ioctl(fefd, IOCTL_SET_FE, &fparm) < 0) {
   printf("Tuning failed");
 }
}

The code itself will stay clean of ifdef spaghetti and the compatibility macros can be hidden in some header file. See getstream [1] for a multiproto capable tuner coder without a single ifdef.

Ссылки

  1. Оригинальная статья про multiproto в wiki на LinuxTV
  2. Домашняя страничка multiproto. Автор - Manu Abraham
  3. Multiproto API и dvb-s/s2-apps (scan, szap2), а также будущее V4L-DVB - обсуждение на форуме Allrussian
  4. система управления версиями - Mercurial
  5. Linux-headers-update
  6. Установка DVB драйверов
  7. OpenSUSE VDR DVB-S2 - xine - Часть 2: DVB драйвер
Личные инструменты